X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fmain.c;h=62fa99c35054131005d0411d1c8e6377436d543c;hb=150347d61ee08df85b377c5af0c5c2d7b3cc8716;hp=c0456c75ea8ca488505b6a33b0de50e8e2f67a05;hpb=e27cd0a70c5ed37621312b117606d8db535fc59e;p=ptask.git diff --git a/src/main.c b/src/main.c index c0456c7..62fa99c 100644 --- a/src/main.c +++ b/src/main.c @@ -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);