X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fmain.c;h=7bf75ba423b5af55e7d39b5a9de67ba7aa02f9c7;hb=513c9dcb2d16d0cb5fae3fcad443a119d23e24ac;hp=3f95c3150718d091968348c06261cc19fe0ec2b9;hpb=68bef7ba87d8c964590260ba188b63b0377fbd46;p=ptask.git diff --git a/src/main.c b/src/main.c index 3f95c31..7bf75ba 100644 --- a/src/main.c +++ b/src/main.c @@ -24,117 +24,13 @@ #include -struct task { - int id; - char *description; - char *status; - char *uuid; -}; +#include "tw.h" static struct task **tasks; -static GtkTextView *w_description; +static GtkTextView *w_note; +static GtkEntry *w_description; static GtkTreeView *w_treeview; - -static char *task_exec(char *opts) -{ - FILE *f; - int ret, s; - char *str, *tmp, *cmd, buf[1024]; - - str = NULL; - - cmd = malloc(strlen("task rc.json.array=on ") + strlen(opts) + 1); - strcpy(cmd, "task rc.json.array=on "); - strcat(cmd, opts); - - printf("execute: %s\n", cmd); - - f = popen(cmd, "r"); - - if (!f) { - perror("popen"); - goto exit_free; - } - - str = malloc(1); - str[0] = '\0'; - while ((s = fread(buf, 1, 1024, f))) { - tmp = malloc(strlen(str) + s + 1); - memcpy(tmp, str, strlen(str)); - memcpy(tmp + strlen(str), buf, s); - tmp[strlen(str) + s] = '\0'; - free(str); - str = tmp; - } - - ret = pclose(f); - - if (ret == -1) { - printf("pclose fails\n"); - perror("pclose"); - } - - exit_free: - free(cmd); - - return str; -} - -static struct json_object *task_exec_json(char *opts) -{ - struct json_object *o; - char *str; - - str = task_exec(opts); - - if (str) { - o = json_tokener_parse(str); - free(str); - return o; - } - - return NULL; -} - -static struct task **get_all_tasks() -{ - int i, n; - struct json_object *jtasks, *jtask, *json; - struct task **tasks; - - jtasks = task_exec_json("export"); - - if (!jtasks) - return NULL; - - n = json_object_array_length(jtasks); - - tasks = malloc((n + 1) * sizeof(struct task *)); - - for (i = 0; i < n; i++) { - jtask = json_object_array_get_idx(jtasks, i); - - tasks[i] = malloc(sizeof(struct task)); - - json = json_object_object_get(jtask, "id"); - tasks[i]->id = json_object_get_int(json); - - json = json_object_object_get(jtask, "description"); - tasks[i]->description = strdup(json_object_get_string(json)); - - json = json_object_object_get(jtask, "status"); - tasks[i]->status = strdup(json_object_get_string(json)); - - json = json_object_object_get(jtask, "uuid"); - tasks[i]->uuid = strdup(json_object_get_string(json)); - } - - tasks[n] = NULL; - - json_object_put(jtasks); - - return tasks; -} +static GtkWidget *w_tasksave_btn; static struct task *get_selected_task(GtkTreeView *treeview) { @@ -143,6 +39,8 @@ static struct task *get_selected_task(GtkTreeView *treeview) gint *i; struct task *task; + printf("get_selected_task\n"); + gtk_tree_view_get_cursor(treeview, &path, &cols); if (path) { @@ -158,41 +56,46 @@ static struct task *get_selected_task(GtkTreeView *treeview) return task; } + printf("get_selected_task returns NULL\n"); + return NULL; } -static char *escape(char *txt) +static void refresh() { - 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++; - } + GtkTreeModel *model; + struct task **tasks_cur; + struct task *task; + int i; + GtkTreeIter iter; + /*GtkTreeSelection *sel;*/ + + tasks = get_all_tasks(); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview)); + gtk_list_store_clear(GTK_LIST_STORE(model)); + 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); - *c = '\0'; + gtk_list_store_set(GTK_LIST_STORE(model), + &iter, + 0, (*tasks_cur)->id, + 1, (*tasks_cur)->description, + -1); + } - return result; + /* + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(w_treeview)); + gtk_tree_model_get_iter_first(model, &iter); + gtk_tree_selection_select_iter(sel, &iter);*/ } static int tasksave_clicked_cbk(GtkButton *btn, gpointer data) @@ -201,20 +104,26 @@ static int tasksave_clicked_cbk(GtkButton *btn, gpointer data) 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); - buf = gtk_text_view_get_buffer(w_description); + 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); - 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); - txt = escape(txt); + printf("%s\n", txt); + } - printf("%s\n", txt); + ctxt = gtk_entry_get_text(w_description); + txt = escape(ctxt); opts = malloc(1 + strlen(task->uuid) @@ -223,9 +132,21 @@ static int tasksave_clicked_cbk(GtkButton *btn, gpointer data) + strlen("\"") + 1); sprintf(opts, " %s modify \"%s\"", task->uuid, txt); - + task_exec(opts); + + free(txt); + refresh(); + + return FALSE; +} + +static int refresh_clicked_cbk(GtkButton *btn, gpointer data) +{ + printf("refresh_clicked_cbk\n"); + refresh(); + return FALSE; } @@ -239,11 +160,18 @@ static int cursor_changed_cbk(GtkTreeView *treeview, gpointer data) task = get_selected_task(treeview); if (task) { - buf = gtk_text_view_get_buffer(w_description); - gtk_text_buffer_set_text(buf, - task->description, - strlen(task->description)); + 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); + gtk_widget_set_sensitive(w_tasksave_btn, 1); + } else { + gtk_widget_set_sensitive(w_tasksave_btn, 0); } return FALSE; @@ -254,10 +182,6 @@ int main(int argc, char **argv) GtkWidget *window; GtkWidget *btn; GtkBuilder *builder; - GtkTreeIter iter; - int i; - GtkTreeModel *model; - struct task **tasks_cur; gtk_init(NULL, NULL); builder = gtk_builder_new(); @@ -270,21 +194,12 @@ int main(int argc, char **argv) w_treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); - w_description = GTK_TEXT_VIEW(gtk_builder_get_object(builder, - "taskdescription")); + w_note = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "tasknote")); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(w_treeview)); + w_description = GTK_ENTRY(gtk_builder_get_object(builder, + "taskdescription")); - tasks = get_all_tasks(); - - for (tasks_cur = tasks, i = 0; *tasks_cur; tasks_cur++, i++) { - gtk_list_store_append(GTK_LIST_STORE(model), &iter); - gtk_list_store_set(GTK_LIST_STORE(model), - &iter, - 0, (*tasks_cur)->id, - 1, (*tasks_cur)->description, - -1); - } + refresh(); g_signal_connect(w_treeview, "cursor-changed", (GCallback)cursor_changed_cbk, tasks); @@ -292,6 +207,12 @@ int main(int argc, char **argv) btn = GTK_WIDGET(gtk_builder_get_object(builder, "tasksave")); g_signal_connect(btn, "clicked", (GCallback)tasksave_clicked_cbk, tasks); + gtk_widget_set_sensitive(btn, 0); + w_tasksave_btn = btn; + + btn = GTK_WIDGET(gtk_builder_get_object(builder, "refresh")); + g_signal_connect(btn, + "clicked", (GCallback)refresh_clicked_cbk, tasks); g_object_unref(G_OBJECT(builder));