diff --git a/src/task.c b/src/task.c index 720f27e..29a5b99 100644 --- a/src/task.c +++ b/src/task.c @@ -34,6 +34,11 @@ struct _Task }; +/* prototype */ +static int _task_config_get_boolean(Task * task, char const * section, + char const * variable); + + /* public */ /* functions */ /* task_new */ @@ -82,6 +87,13 @@ void task_delete(Task * task) /* accessors */ +/* task_get_done */ +int task_get_done(Task * task) +{ + return _task_config_get_boolean(task, NULL, "done"); +} + + /* task_get_filename */ char const * task_get_filename(Task * task) { @@ -96,6 +108,13 @@ char const * task_get_title(Task * task) } +/* task_set_done */ +int task_set_done(Task * task, int done) +{ + return config_set(task->config, NULL, "done", done ? "1" : "0"); +} + + /* task_set_filename */ int task_set_filename(Task * task, char const * filename) { @@ -141,3 +160,22 @@ int task_unlink(Task * task) return 1; /* XXX set error */ return unlink(task->filename); } + + +/* private */ +/* functions */ +/* task_config_get_boolean */ +static int _task_config_get_boolean(Task * task, char const * section, + char const * variable) +{ + int ret; + char const * string; + char * p; + + if((string = config_get(task->config, section, variable)) == NULL) + return -1; + ret = strtol(string, &p, 10); + if(string[0] == '\0' || *p != '\0') + return -1; + return ret ? 1 : 0; +} diff --git a/src/task.h b/src/task.h index 56771fc..1aae711 100644 --- a/src/task.h +++ b/src/task.h @@ -31,9 +31,11 @@ void task_delete(Task * task); /* accessors */ +int task_get_done(Task * task); char const * task_get_filename(Task * task); char const * task_get_title(Task * task); +int task_set_done(Task * task, int done); int task_set_filename(Task * task, char const * filename); int task_set_title(Task * task, char const * title); diff --git a/src/todo.c b/src/todo.c index d62924c..e51a7fd 100644 --- a/src/todo.c +++ b/src/todo.c @@ -157,6 +157,7 @@ static DesktopToolbar _toolbar[] = static char * _todo_task_get_directory(void); static char * _todo_task_get_filename(char const * filename); static char * _todo_task_get_new_filename(void); +static void _todo_task_save(Todo * todo, GtkTreeIter * iter); /* public */ @@ -347,6 +348,7 @@ Task * todo_task_add(Todo * todo, Task * task) } gtk_list_store_insert(todo->store, &iter, 0); gtk_list_store_set(todo->store, &iter, TD_COL_TASK, task, + TD_COL_DONE, task_get_done(task) > 0 ? TRUE : FALSE, TD_COL_TITLE, task_get_title(task), -1); return task; } @@ -479,14 +481,10 @@ void todo_task_save_all(Todo * todo) GtkTreeModel * model = GTK_TREE_MODEL(todo->store); GtkTreeIter iter; gboolean valid; - Task * task; valid = gtk_tree_model_get_iter_first(model, &iter); for(; valid == TRUE; valid = gtk_tree_model_iter_next(model, &iter)) - { - gtk_tree_model_get(model, &iter, TD_COL_TASK, &task, -1); - task_save(task); - } + _todo_task_save(todo, &iter); } @@ -594,3 +592,17 @@ static char * _todo_task_get_new_filename(void) close(fd); return filename; } + + +/* todo_task_save */ +static void _todo_task_save(Todo * todo, GtkTreeIter * iter) +{ + GtkTreeModel * model = GTK_TREE_MODEL(todo->store); + Task * task; + gboolean done; + + gtk_tree_model_get(model, iter, TD_COL_TASK, &task, + TD_COL_DONE, &done, -1); + task_set_done(task, done); + task_save(task); +}