Merge tag 'upstream/0.0.9'
[ptask-pkg-ubuntu.git] / src / ui_tasktree.c
index 506e8f9..7b2d2c6 100644 (file)
@@ -47,6 +47,7 @@ static const char * const MENU_NAMES[] = {
 static GtkTreeView *w_treeview;
 static GtkMenu *w_menu;
 static struct task **current_tasks;
+static gchar *search_keywords;
 
 enum {
        COL_ID,
@@ -291,16 +292,63 @@ void ui_tasktree_set_selected_task(const char *uuid)
        log_fct_exit();
 }
 
+static int match_search_keywords(struct task *task)
+{
+       gchar *desc;
+       int ret;
+       char **tags;
+       gchar *tag;
+
+       if (!search_keywords || !strlen(search_keywords))
+               return 1;
+
+       if (!task->description || !strlen(task->description))
+               return 0;
+
+       desc = g_ascii_strup(task->description, -1);
+
+       if (strstr(desc, search_keywords))
+               ret = 1;
+       else
+               ret = 0;
+
+       free(desc);
 
-void ui_tasktree_update(struct task **tasks, const char *prj_filter)
+       if (ret)
+               return 1;
+
+       tags = task->tags;
+       if (!tags)
+               return 0;
+
+       while (*tags) {
+               tag = g_ascii_strup(*tags, -1);
+
+               if (strstr(tag, search_keywords))
+                       ret = 1;
+
+               free(tag);
+
+               if (ret)
+                       return 1;
+
+               tags++;
+       }
+
+       return 0;
+}
+
+void ui_tasktree_update(struct task **tasks)
 {
        GtkTreeModel *model;
        struct task **tasks_cur;
        struct task *task;
        GtkTreeIter iter;
-       const char *prj;
+       const char *prj, *prj_filter;
        char *s;
 
+       prj_filter = ui_projecttree_get_project();
+
        current_tasks = tasks;
 
        model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
@@ -318,6 +366,9 @@ void ui_tasktree_update(struct task **tasks, const char *prj_filter)
                        if (prj_filter && strcmp(prj, prj_filter))
                                continue;
 
+                       if (!match_search_keywords(task))
+                               continue;
+
                        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
 
                        gtk_list_store_set(GTK_LIST_STORE(model),
@@ -373,11 +424,6 @@ void ui_tasktree_update(struct task **tasks, const char *prj_filter)
 
 }
 
-void ui_tasktree_update_filter(const char *prj_filter)
-{
-       ui_tasktree_update(current_tasks, prj_filter);
-}
-
 gboolean tasktree_button_press_event_cbk(GtkWidget *widget,
                                         GdkEventButton *evt,
                                         gpointer data)
@@ -477,3 +523,19 @@ void tasktree_stop_activate_cbk(GtkAction *action, gpointer data)
 
        log_fct_exit();
 }
+
+void
+ui_tasktree_search_changed_cbk(GtkEntry *entry, gchar *preedit, gpointer data)
+{
+       if (search_keywords)
+               g_free(search_keywords);
+
+       search_keywords = g_ascii_strup(gtk_entry_get_text(entry), -1);
+
+       ui_tasktree_update(current_tasks);
+}
+
+void ui_tasktree_update_filter(const char *prj)
+{
+       ui_tasktree_update(current_tasks);
+}