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
29 #include <ui_projecttree.h>
30 #include <ui_taskpanel.h>
31 #include <ui_tasktree.h>
33 static const char * const SETTINGS_KEYS[] = {
34 "tasktree-id-visible",
35 "tasktree-description-visible",
36 "tasktree-project-visible",
37 "tasktree-uuid-visible",
38 "tasktree-priority-visible",
39 "tasktree-urgency-visible",
40 "tasktree-creation-date-visible",
41 "tasktree-due-visible",
42 "tasktree-start-visible",
45 static const char * const MENU_NAMES[] = {
47 "menu_description_visible",
48 "menu_project_visible",
50 "menu_priority_visible",
51 "menu_urgency_visible",
52 "menu_creation_date_visible",
57 static GSettings *gsettings;
58 static GtkTreeView *w_treeview;
59 static GtkMenu *w_menu;
60 static struct task **current_tasks;
75 static GtkTreeViewColumn *w_cols[COL_COUNT];
76 static GtkCheckMenuItem *w_menus[COL_COUNT];
78 static int priority_to_int(const char *str)
92 static gint priority_cmp(GtkTreeModel *model,
97 GValue v1 = {0,}, v2 = {0,};
98 const char *str1, *str2;
101 gtk_tree_model_get_value(model, a, COL_PRIORITY, &v1);
102 str1 = g_value_get_string(&v1);
103 i1 = priority_to_int(str1);
105 gtk_tree_model_get_value(model, b, COL_PRIORITY, &v2);
106 str2 = g_value_get_string(&v2);
107 i2 = priority_to_int(str2);
117 int tasktree_cursor_changed_cbk(GtkTreeView *treeview, gpointer data)
121 ui_taskpanel_update(ui_tasktree_get_selected_task());
128 void ui_tasktree_init(GtkBuilder *builder)
133 w_treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tasktree"));
134 w_menu = GTK_MENU(gtk_builder_get_object(builder, "tasktree_menu"));
135 g_object_ref(w_menu);
137 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
138 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
144 w_cols[COL_ID] = GTK_TREE_VIEW_COLUMN
145 (gtk_builder_get_object(builder, "col_id"));
146 w_cols[COL_DESCRIPTION] = GTK_TREE_VIEW_COLUMN
147 (gtk_builder_get_object(builder, "col_description"));
148 w_cols[COL_PROJECT] = GTK_TREE_VIEW_COLUMN
149 (gtk_builder_get_object(builder, "col_project"));
150 w_cols[COL_UUID] = GTK_TREE_VIEW_COLUMN
151 (gtk_builder_get_object(builder, "col_uuid"));
152 w_cols[COL_PRIORITY] = GTK_TREE_VIEW_COLUMN
153 (gtk_builder_get_object(builder, "col_priority"));
154 w_cols[COL_URGENCY] = GTK_TREE_VIEW_COLUMN
155 (gtk_builder_get_object(builder, "col_urgency"));
156 w_cols[COL_CREATION_DATE] = GTK_TREE_VIEW_COLUMN
157 (gtk_builder_get_object(builder, "col_creation_date"));
158 w_cols[COL_DUE] = GTK_TREE_VIEW_COLUMN
159 (gtk_builder_get_object(builder, "col_due"));
160 w_cols[COL_START] = GTK_TREE_VIEW_COLUMN
161 (gtk_builder_get_object(builder, "col_start"));
163 for (i = 0; i < COL_COUNT; i++)
164 w_menus[i] = GTK_CHECK_MENU_ITEM
165 (gtk_builder_get_object(builder, MENU_NAMES[i]));
168 void ui_tasktree_load_settings(GSettings *settings)
171 GtkSortType sort_order;
177 gsettings = settings;
179 sort_col_id = g_settings_get_int(settings, "tasks-sort-col");
180 sort_order = g_settings_get_int(settings, "tasks-sort-order");
181 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
182 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
183 sort_col_id, sort_order);
186 for (i = 0; i < COL_COUNT; i++) {
187 key = SETTINGS_KEYS[i];
188 b = g_settings_get_boolean(gsettings, key);
189 gtk_tree_view_column_set_visible(w_cols[i], b);
192 for (i = 0; i < COL_COUNT; i++) {
193 key = SETTINGS_KEYS[i];
194 b = g_settings_get_boolean(gsettings, key);
195 gtk_check_menu_item_set_active(w_menus[i], b);
199 void ui_tasktree_save_settings(GSettings *settings)
203 GtkSortType sort_order;
205 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
206 gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model),
209 log_debug("ui_tasktree_save_settings(): sort_col_id=%d", sort_col_id);
210 log_debug("ui_tasktree_save_settings(): sort_col_order=%d", sort_order);
212 g_settings_set_int(settings, "tasks-sort-col", sort_col_id);
213 g_settings_set_int(settings, "tasks-sort-order", sort_order);
216 const char *ui_tasktree_get_task_uuid()
220 t = ui_tasktree_get_selected_task();
228 struct task *ui_tasktree_get_selected_task()
231 GtkTreeViewColumn *cols;
232 struct task **tasks_cur, *result;
243 gtk_tree_view_get_cursor(w_treeview, &path, &cols);
246 model = gtk_tree_view_get_model(w_treeview);
247 gtk_tree_model_get_iter(model, &iter, path);
248 gtk_tree_model_get_value(model,
253 uuid = g_value_get_string(&value);
255 for (tasks_cur = current_tasks; *tasks_cur; tasks_cur++)
256 if (!strcmp((*tasks_cur)->uuid, uuid))
259 gtk_tree_path_free(path);
268 void ui_tasktree_set_selected_task(const char *uuid)
279 model = gtk_tree_view_get_model(w_treeview);
281 if (!gtk_tree_model_get_iter_first(model, &iter))
285 while (gtk_tree_model_iter_next(model, &iter)) {
286 gtk_tree_model_get_value(model,
290 c_uuid = g_value_get_string(&value);
292 if (!strcmp(uuid, c_uuid)) {
293 path = gtk_tree_model_get_path(model, &iter);
297 g_value_unset(&value);
301 path = gtk_tree_path_new_first();
302 gtk_tree_view_set_cursor(w_treeview, path, NULL, FALSE);
309 void ui_tasktree_update(struct task **tasks, const char *prj_filter)
312 struct task **tasks_cur;
318 current_tasks = tasks;
320 model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
321 gtk_list_store_clear(GTK_LIST_STORE(model));
324 for (tasks_cur = current_tasks; *tasks_cur; tasks_cur++) {
332 if (prj_filter && strcmp(prj, prj_filter))
335 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
337 gtk_list_store_set(GTK_LIST_STORE(model),
342 (*tasks_cur)->description,
348 (*tasks_cur)->priority,
350 (*tasks_cur)->urgency,
353 if ((*tasks_cur)->start) {
354 s = tm_to_str((*tasks_cur)->start);
356 (GTK_LIST_STORE(model),
364 if ((*tasks_cur)->due) {
365 s = tm_to_str((*tasks_cur)->due);
367 (GTK_LIST_STORE(model),
375 if ((*tasks_cur)->entry) {
376 s = tm_to_str((*tasks_cur)->entry);
378 (GTK_LIST_STORE(model),
390 void ui_tasktree_update_filter(const char *prj_filter)
392 ui_tasktree_update(current_tasks, prj_filter);
395 gboolean tasktree_button_press_event_cbk(GtkWidget *widget,
401 if (evt->button == 3)
402 gtk_menu_popup(w_menu,
403 NULL, NULL, NULL, NULL, evt->button, evt->time);
410 void tasktree_visible_activate_cbk(GtkAction *action, gpointer data)
414 const char *aname, *key;
416 aname = gtk_action_get_name(action);
418 if (!strcmp(aname, "tasktree_id_visible"))
420 else if (!strcmp(aname, "tasktree_description_visible"))
421 id = COL_DESCRIPTION;
422 else if (!strcmp(aname, "tasktree_project_visible"))
424 else if (!strcmp(aname, "tasktree_uuid_visible"))
426 else if (!strcmp(aname, "tasktree_priority_visible"))
428 else if (!strcmp(aname, "tasktree_urgency_visible"))
430 else if (!strcmp(aname, "tasktree_creation_date_visible"))
431 id = COL_CREATION_DATE;
432 else if (!strcmp(aname, "tasktree_due_visible"))
434 else if (!strcmp(aname, "tasktree_start_visible"))
440 key = SETTINGS_KEYS[id];
441 b = g_settings_get_boolean(gsettings, key);
442 g_settings_set_boolean(gsettings, key, !b);
443 gtk_tree_view_column_set_visible(w_cols[id], !b);