📄 todo-ui.c
字号:
/*
* Copyright (C) 2002, 2003, 2004 Philip Blundell <philb@gnu.org>
* 2005 Florian Boor <florian@kernelconcepts.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <time.h>
#include <libintl.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gpe/gtkdatecombo.h>
#include <gpe/pixmaps.h>
#include <gpe/picturebutton.h>
#include <gpe/spacing.h>
#include <gpe/errorbox.h>
#include <gpe/pim-categories.h>
#include <gpe/pim-categories-ui.h>
#include "todo.h"
#define _(_x) gettext(_x)
#define N_(_x) (_x)
struct category_map
{
GtkWidget *w;
struct todo_category *c;
};
struct edit_todo
{
GtkWidget *text;
GtkWidget *summary;
GtkWidget *duetoggle;
GtkWidget *duedate;
struct todo_item *item;
item_state state;
guint priority;
GSList *selected_categories;
GtkWidget *categories_label;
};
static void
destroy_user_data (gpointer p)
{
struct edit_todo *t = (struct edit_todo *)p;
g_slist_free (t->selected_categories);
g_free (p);
}
static void
due_toggle_clicked (GtkWidget *widget, struct edit_todo *t)
{
gtk_widget_set_sensitive (t->duedate,
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
(t->duetoggle)));
}
static void
click_cancel (GtkWidget *widget,
GtkWidget *window)
{
gtk_widget_destroy (window);
}
static void
click_delete (GtkWidget *widget,
GtkWidget *window)
{
struct edit_todo *t = gtk_object_get_data (GTK_OBJECT (window), "todo");
if (t->item)
todo_db_delete_item (t->item);
refresh_items ();
gtk_widget_destroy (window);
}
static void
click_ok (GtkWidget *widget,
GtkWidget *window)
{
struct edit_todo *t = gtk_object_get_data (GTK_OBJECT (window), "todo");
time_t when;
struct tm tm;
const char *what, *summary;
GtkTextBuffer *buf;
GtkTextIter start, end;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (t->duetoggle)))
{
memset (&tm, 0, sizeof(tm));
tm.tm_year = GTK_DATE_COMBO (t->duedate)->year - 1900;
tm.tm_mon = GTK_DATE_COMBO (t->duedate)->month;
tm.tm_mday = GTK_DATE_COMBO (t->duedate)->day;
when = mktime (&tm);
}
else
when = (time_t)0;
buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (t->text));
gtk_text_buffer_get_bounds (buf, &start, &end);
what = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (buf), &start, &end, FALSE);
summary = gtk_editable_get_chars (GTK_EDITABLE (t->summary), 0, -1);
if (t->item)
{
if (t->item->what)
{
g_free ((char *)t->item->what);
t->item->what = NULL;
}
if (t->item->summary)
{
g_free ((char *)t->item->summary);
t->item->summary = NULL;
}
}
else
t->item = todo_db_new_item ();
t->item->categories = g_slist_copy (t->selected_categories);
if (what[0])
t->item->what = what;
if (summary[0])
t->item->summary = summary;
t->item->time = when;
t->item->state = t->state;
t->item->priority = t->priority;
todo_db_push_item (t->item);
refresh_items ();
gtk_widget_destroy (window);
}
struct menu_map
state_map[] =
{
{ N_("Not started"), NOT_STARTED },
{ N_("In progress"), IN_PROGRESS },
{ N_("Completed"), COMPLETED },
{ N_("Abandoned"), ABANDONED },
};
struct menu_map
priority_map[] =
{
{ N_("High"), PRIORITY_HIGH },
{ N_("Standard"), PRIORITY_STANDARD },
{ N_("Low"), PRIORITY_LOW },
};
static void
set_item_state (GtkMenuItem *w, gpointer p)
{
struct edit_todo *t = p;
struct menu_map *m;
m = g_object_get_data (G_OBJECT (w), "menu-map");
t->state = m->value;
}
static void
set_item_priority (GtkMenuItem *w, gpointer p)
{
struct edit_todo *t = p;
struct menu_map *m;
m = g_object_get_data (G_OBJECT (w), "menu-map");
t->priority = m->value;
}
static gchar *
build_categories_string (struct edit_todo *t)
{
gchar *s = NULL;
GSList *iter;
for (iter = t->selected_categories; iter; iter = iter->next)
{
const gchar *cat;
cat = gpe_pim_category_name ((int)iter->data);
if (cat)
{
if (s)
{
char *ns = g_strdup_printf ("%s, %s", s, cat);
g_free (s);
s = ns;
}
else
s = g_strdup (cat);
}
}
return s;
}
static void
update_categories (GtkWidget *w, GSList *new, struct edit_todo *t)
{
gchar *str;
g_slist_free (t->selected_categories);
t->selected_categories = g_slist_copy (new);
str = build_categories_string (t);
gtk_label_set_text (GTK_LABEL (t->categories_label), str);
g_free (str);
categories_menu ();
}
static void
change_categories (GtkWidget *w, struct edit_todo *t)
{
GtkWidget *dialog;
#ifdef IS_HILDON
dialog = gpe_pim_categories_dialog (t->selected_categories, TRUE,
G_CALLBACK (update_categories), t);
#else
dialog = gpe_pim_categories_dialog (t->selected_categories,
G_CALLBACK (update_categories), t);
#endif
gtk_window_set_transient_for(GTK_WINDOW(dialog),
GTK_WINDOW(gtk_widget_get_toplevel(w)));
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
}
/*
* Pass item=NULL to create a new item;
* if item=NULL, you may pass the item's initial category.
*/
GtkWidget *
edit_item (struct todo_item *item, gint initial_category, GtkWindow *parent)
{
GtkWidget *window;
GtkWidget *table = gtk_table_new(5, 5, FALSE);
GtkWidget *top_vbox = gtk_vbox_new (FALSE, 0);
GtkWidget *text = gtk_text_view_new ();
GtkWidget *buttonbox = gtk_hbox_new (FALSE, 0);
GtkWidget *buttonok;
GtkWidget *buttoncancel;
#ifdef IS_HILDON
GtkWidget *buttoncategories;
#endif
GtkWidget *buttondelete;
GtkWidget *label_priority = gtk_label_new (_("Priority:"));
GtkWidget *priority_menu, *priority_optionmenu;
GtkWidget *label_state = gtk_label_new (_("Status:"));
GtkWidget *state = gtk_option_menu_new ();
GtkWidget *state_menu;
GtkWidget *label_summary = gtk_label_new (_("Summary:"));
GtkWidget *label_details = gtk_label_new (_("Details:"));
GtkWidget *entry_summary = gtk_entry_new ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -