2 * Copyright (C) 2012-2013 jeanfi@gmail.com
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
31 #include <ui_projecttree.h>
32 #include <ui_taskpanel.h>
33 #include <ui_tasktree.h>
35 static const char * const MENU_NAMES[] = {
37 "menu_description_visible",
38 "menu_project_visible",
40 "menu_priority_visible",
41 "menu_urgency_visible",
42 "menu_creation_date_visible",
47 static GtkTreeView *w_treeview;
48 static GtkMenu *w_menu;
49 static struct task **current_tasks;
50 static gchar *search_keywords;
65 static GtkTreeViewColumn *w_cols[COL_COUNT];
66 static GtkCheckMenuItem *w_menus[COL_COUNT];
68 static int priority_to_int(const char *str)
82 static gint priority_cmp(GtkTreeModel *model,
87 GValue v1 = {0,}, v2 = {0,};
88 const char *str1, *str2;
91 gtk_tree_model_get_value(model, a, COL_PRIORITY, &v1);
92 str1 = g_value_get_string(&v1);
93 i1 = priority_to_int(str1);
95 gtk_tree_model_get_value(model, b, COL_PRIORITY, &v2);
96 str2 = g_value_get_string(&v2);
97 i2 = priority_to_int(str2);
107 int tasktree_cursor_changed_cbk(GtkTreeView *treeview, gpointer data)
111 ui_taskpanel_update(ui_tasktree_get_selected_task());
118 void ui_tasktree_init(GtkBuilder *builder)
123 w_treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tasktree"));
124 w_menu = GTK_MENU(gtk_builder_get_object(builder, "tasktree_menu"));
125 g_object_ref(w_menu);
127 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
128 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
134 w_cols[COL_ID] = GTK_TREE_VIEW_COLUMN
135 (gtk_builder_get_object(builder, "col_id"));
136 w_cols[COL_DESCRIPTION] = GTK_TREE_VIEW_COLUMN
137 (gtk_builder_get_object(builder, "col_description"));
138 w_cols[COL_PROJECT] = GTK_TREE_VIEW_COLUMN
139 (gtk_builder_get_object(builder, "col_project"));
140 w_cols[COL_UUID] = GTK_TREE_VIEW_COLUMN
141 (gtk_builder_get_object(builder, "col_uuid"));
142 w_cols[COL_PRIORITY] = GTK_TREE_VIEW_COLUMN
143 (gtk_builder_get_object(builder, "col_priority"));
144 w_cols[COL_URGENCY] = GTK_TREE_VIEW_COLUMN
145 (gtk_builder_get_object(builder, "col_urgency"));
146 w_cols[COL_CREATION_DATE] = GTK_TREE_VIEW_COLUMN
147 (gtk_builder_get_object(builder, "col_creation_date"));
148 w_cols[COL_DUE] = GTK_TREE_VIEW_COLUMN
149 (gtk_builder_get_object(builder, "col_due"));
150 w_cols[COL_START] = GTK_TREE_VIEW_COLUMN
151 (gtk_builder_get_object(builder, "col_start"));
153 for (i = 0; i < COL_COUNT; i++)
154 w_menus[i] = GTK_CHECK_MENU_ITEM
155 (gtk_builder_get_object(builder, MENU_NAMES[i]));
158 void ui_tasktree_load_settings()
161 GtkSortType sort_order;
166 sort_col_id = settings_get_int(SETTINGS_KEY_TASKS_SORT_COL);
167 sort_order = settings_get_int(SETTINGS_KEY_TASKS_SORT_ORDER);
168 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
169 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
170 sort_col_id, sort_order);
173 for (i = 0; i < COL_COUNT; i++) {
174 key = SETTINGS_VISIBLE_COL_KEYS[i];
175 b = settings_get_boolean(key);
176 gtk_tree_view_column_set_visible(w_cols[i], b);
179 for (i = 0; i < COL_COUNT; i++) {
180 key = SETTINGS_VISIBLE_COL_KEYS[i];
181 b = settings_get_boolean(key);
182 gtk_check_menu_item_set_active(w_menus[i], b);
186 void ui_tasktree_save_settings()
190 GtkSortType sort_order;
192 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
193 gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),
196 log_debug("ui_tasktree_save_settings(): sort_col_id=%d", sort_col_id);
197 log_debug("ui_tasktree_save_settings(): sort_col_order=%d", sort_order);
199 settings_set_int(SETTINGS_KEY_TASKS_SORT_COL, sort_col_id);
200 settings_set_int(SETTINGS_KEY_TASKS_SORT_ORDER, sort_order);
203 const char *ui_tasktree_get_task_uuid()
207 t = ui_tasktree_get_selected_task();
215 struct task *ui_tasktree_get_selected_task()
218 GtkTreeViewColumn *cols;
219 struct task **tasks_cur, *result;
230 gtk_tree_view_get_cursor(w_treeview, &path, &cols);
233 model = gtk_tree_view_get_model(w_treeview);
234 gtk_tree_model_get_iter(model, &iter, path);
235 gtk_tree_model_get_value(model,
240 uuid = g_value_get_string(&value);
242 for (tasks_cur = current_tasks; *tasks_cur; tasks_cur++)
243 if (!strcmp((*tasks_cur)->uuid, uuid))
246 gtk_tree_path_free(path);
255 void ui_tasktree_set_selected_task(const char *uuid)
266 model = gtk_tree_view_get_model(w_treeview);
268 if (!gtk_tree_model_get_iter_first(model, &iter))
272 while (gtk_tree_model_iter_next(model, &iter)) {
273 gtk_tree_model_get_value(model,
277 c_uuid = g_value_get_string(&value);
279 if (!strcmp(uuid, c_uuid)) {
280 path = gtk_tree_model_get_path(model, &iter);
284 g_value_unset(&value);
288 path = gtk_tree_path_new_first();
289 gtk_tree_view_set_cursor(w_treeview, path, NULL, FALSE);
295 static int match_search_keywords(struct task *task)
302 if (!search_keywords || !strlen(search_keywords))
305 if (!task->description || !strlen(task->description))
308 desc = g_ascii_strup(task->description, -1);
310 if (strstr(desc, search_keywords))
325 tag = g_ascii_strup(*tags, -1);
327 if (strstr(tag, search_keywords))
341 void ui_tasktree_update(struct task **tasks)
344 struct task **tasks_cur;
347 const char *prj, *prj_filter;
350 prj_filter = ui_projecttree_get_project();
352 current_tasks = tasks;
354 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
355 gtk_list_store_clear(GTK_LIST_STORE(model));
358 for (tasks_cur = current_tasks; *tasks_cur; tasks_cur++) {
366 if (prj_filter && strcmp(prj, prj_filter))
369 if (!match_search_keywords(task))
372 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
374 gtk_list_store_set(GTK_LIST_STORE(model),
379 (*tasks_cur)->description,
385 (*tasks_cur)->priority,
387 (*tasks_cur)->urgency,
390 if ((*tasks_cur)->start) {
391 s = tm_to_str((*tasks_cur)->start);
393 (GTK_LIST_STORE(model),
401 if ((*tasks_cur)->due) {
402 s = tm_to_str((*tasks_cur)->due);
404 (GTK_LIST_STORE(model),
412 if ((*tasks_cur)->entry) {
413 s = tm_to_str((*tasks_cur)->entry);
415 (GTK_LIST_STORE(model),
427 gboolean tasktree_button_press_event_cbk(GtkWidget *widget,
433 if (evt->button == 3)
434 gtk_menu_popup(w_menu,
435 NULL, NULL, NULL, NULL, evt->button, evt->time);
442 void tasktree_visible_activate_cbk(GtkAction *action, gpointer data)
446 const char *aname, *key;
448 aname = gtk_action_get_name(action);
450 if (!strcmp(aname, "tasktree_id_visible"))
452 else if (!strcmp(aname, "tasktree_description_visible"))
453 id = COL_DESCRIPTION;
454 else if (!strcmp(aname, "tasktree_project_visible"))
456 else if (!strcmp(aname, "tasktree_uuid_visible"))
458 else if (!strcmp(aname, "tasktree_priority_visible"))
460 else if (!strcmp(aname, "tasktree_urgency_visible"))
462 else if (!strcmp(aname, "tasktree_creation_date_visible"))
463 id = COL_CREATION_DATE;
464 else if (!strcmp(aname, "tasktree_due_visible"))
466 else if (!strcmp(aname, "tasktree_start_visible"))
472 key = SETTINGS_VISIBLE_COL_KEYS[id];
473 b = settings_get_boolean(key);
474 settings_set_boolean(key, !b);
475 gtk_tree_view_column_set_visible(w_cols[id], !b);
479 void tasktree_done_activate_cbk(GtkAction *action, gpointer data)
485 t = ui_tasktree_get_selected_task();
488 tw_task_done(t->uuid);
495 void tasktree_start_activate_cbk(GtkAction *action, gpointer data)
501 t = ui_tasktree_get_selected_task();
504 tw_task_start(t->uuid);
511 void tasktree_stop_activate_cbk(GtkAction *action, gpointer data)
517 t = ui_tasktree_get_selected_task();
520 tw_task_stop(t->uuid);
528 ui_tasktree_search_changed_cbk(GtkEntry *entry, gchar *preedit, gpointer data)
531 g_free(search_keywords);
533 search_keywords = g_ascii_strup(gtk_entry_get_text(entry), -1);
535 ui_tasktree_update(current_tasks);
538 void ui_tasktree_update_filter(const char *prj)
540 ui_tasktree_update(current_tasks);