(no commit message)
[ptask.git] / src / main.c
index c0456c7..62fa99c 100644 (file)
@@ -28,8 +28,16 @@ struct task {
        int id;
        char *description;
        char *status;
+       char *uuid;
+       char *note;
+       char *project;
 };
 
+static struct task **tasks;
+static GtkTextView *w_note;
+static GtkEntry *w_description;
+static GtkTreeView *w_treeview;
+
 static char *task_exec(char *opts)
 {
        FILE *f;
@@ -42,6 +50,8 @@ static char *task_exec(char *opts)
        strcpy(cmd, "task rc.json.array=on ");
        strcat(cmd, opts);
 
+       printf("execute: %s\n", cmd);
+
        f = popen(cmd, "r");
 
        if (!f) {
@@ -117,6 +127,18 @@ static struct task **get_all_tasks()
 
                json = json_object_object_get(jtask, "status");
                tasks[i]->status = strdup(json_object_get_string(json));
+
+               json = json_object_object_get(jtask, "project");
+               if (json)
+                       tasks[i]->project
+                               = strdup(json_object_get_string(json));
+               else
+                       tasks[i]->project = NULL;
+
+               json = json_object_object_get(jtask, "uuid");
+               tasks[i]->uuid = strdup(json_object_get_string(json));
+
+               tasks[i]->note = NULL;
        }
 
        tasks[n] = NULL;
@@ -126,15 +148,141 @@ static struct task **get_all_tasks()
        return tasks;
 }
 
+static struct task *get_selected_task(GtkTreeView *treeview)
+{
+       GtkTreePath *path;
+       GtkTreeViewColumn *cols;
+       gint *i;
+       struct task *task;
+
+       gtk_tree_view_get_cursor(treeview, &path, &cols);
+
+       if (path) {
+               i = gtk_tree_path_get_indices(path);
+               
+               if (i)
+                       printf("row selected: %d\n", *i);
+
+               task = tasks[*i];
+
+               gtk_tree_path_free(path);
+
+               return task;
+       }
+
+       return NULL;
+}
+
+static char *escape(const char *txt)
+{
+       char *result;
+       char *c;
+
+       result = malloc(2*strlen(txt)+1);
+       c = result;
+
+       while(*txt) {
+               switch(*txt) {
+               case '"':
+                       *c = '\\'; c++;
+                       *c = '"';
+                       break;
+               case '$':
+                       *c = '\\'; c++;
+                       *c = '$';
+                       break;
+               case '&':
+                       *c = '\\'; c++;
+                       *c = '&';
+                       break;
+               default:
+                       *c = *txt;
+               }
+               c++;
+               txt++;
+       }
+
+       *c = '\0';
+
+       return result;
+}
+
+static int tasksave_clicked_cbk(GtkButton *btn, gpointer data)
+{
+       struct task *task;
+       GtkTextBuffer *buf;
+       char *txt, *opts;
+       GtkTextIter sIter, eIter;
+       const char *ctxt;
+
+       task = get_selected_task(GTK_TREE_VIEW(w_treeview));
+
+       printf("tasksave_clicked_cbk %d\n", task->id);  
+
+       if (task->note) {
+               buf = gtk_text_view_get_buffer(w_note);
+
+               gtk_text_buffer_get_iter_at_offset(buf, &sIter, 0);
+               gtk_text_buffer_get_iter_at_offset(buf, &eIter, -1);
+               txt = gtk_text_buffer_get_text(buf, &sIter, &eIter, TRUE);
+
+               txt = escape(txt);
+
+               printf("%s\n", txt);
+       }
+
+       ctxt = gtk_entry_get_text(w_description);
+       txt = escape(ctxt);
+
+       opts = malloc(1
+                     + strlen(task->uuid)
+                     + strlen(" modify description:\"")
+                     + strlen(txt)
+                     + strlen("\"")
+                     + 1);
+       sprintf(opts, " %s modify \"%s\"", task->uuid, txt);
+       
+       task_exec(opts);
+
+       free(txt);
+       
+       return FALSE;
+}
+
+static int cursor_changed_cbk(GtkTreeView *treeview, gpointer data)
+{
+       struct task *task;
+       GtkTextBuffer *buf;
+
+       printf("cursor_changed_cbk\n");
+
+       task = get_selected_task(treeview);
+
+       if (task) {
+
+               if (task->note) {
+                       buf = gtk_text_view_get_buffer(w_note);
+                       gtk_text_buffer_set_text(buf,
+                                                task->note,
+                                                strlen(task->note));
+               }
+
+               gtk_entry_set_text(w_description, task->description);
+       }
+
+       return FALSE;
+}
+
 int main(int argc, char **argv)
 {
        GtkWidget *window;
-       GtkWidget *treeview;
+       GtkWidget *btn;
        GtkBuilder *builder;
        GtkTreeIter iter;
        int i;
        GtkTreeModel *model;
-       struct task **tasks, **tasks_cur;
+       struct task **tasks_cur;
+       struct task *task;
 
        gtk_init(NULL, NULL);
        builder = gtk_builder_new();
@@ -145,14 +293,28 @@ int main(int argc, char **argv)
        window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
        printf("%p\n", window);
 
-       treeview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview"));
+       w_treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview"));
 
-       model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+       w_note = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "tasknote"));
+
+       w_description = GTK_ENTRY(gtk_builder_get_object(builder,
+                                                        "taskdescription"));
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview));
 
        tasks = get_all_tasks();
 
        for (tasks_cur = tasks, i = 0; *tasks_cur; tasks_cur++, i++) {
+               task = (*tasks_cur);
+
                gtk_list_store_append(GTK_LIST_STORE(model), &iter);
+               
+               if (task->project)
+                       gtk_list_store_set(GTK_LIST_STORE(model),
+                                          &iter,
+                                          2, task->project,
+                                          -1);
+
                gtk_list_store_set(GTK_LIST_STORE(model),
                                   &iter,
                                   0, (*tasks_cur)->id,
@@ -160,6 +322,13 @@ int main(int argc, char **argv)
                                   -1);
        }
 
+       g_signal_connect(w_treeview,
+                        "cursor-changed", (GCallback)cursor_changed_cbk, tasks);
+
+       btn = GTK_WIDGET(gtk_builder_get_object(builder, "tasksave"));
+       g_signal_connect(btn,
+                        "clicked", (GCallback)tasksave_clicked_cbk, tasks);
+
        g_object_unref(G_OBJECT(builder));
 
        gtk_widget_show_all(window);