From 25a049951cc955b51c2c30b977ebb6cfa7160054 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 18 Jan 2016 18:52:24 +0100 Subject: Improve ordering of todo items * Show uncompleted items first. * Order uncompleted and completed items by priority. * Order items with the same priority alphabetically. Signed-off-by: Lukas Fleischer --- src/todo.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/todo.c') diff --git a/src/todo.c b/src/todo.c index cd0eed7..6cdd0d5 100644 --- a/src/todo.c +++ b/src/todo.c @@ -62,8 +62,15 @@ struct todo *todo_get_item(int item_number, int skip_completed) return LLIST_GET_DATA(i); } -static int todo_cmp_id(struct todo *a, struct todo *b) +static int todo_cmp(struct todo *a, struct todo *b) { + if (a->completed && !b->completed) + return 1; + if (b->completed && !a->completed) + return -1; + if (a->id == b->id) + return strcmp(a->mesg, b->mesg); + return a->id - b->id; } @@ -81,7 +88,7 @@ struct todo *todo_add(char *mesg, int id, int completed, char *note) todo->note = (note != NULL && note[0] != '\0') ? mem_strdup(note) : NULL; - LLIST_ADD_SORTED(&todolist, todo, todo_cmp_id); + LLIST_ADD_SORTED(&todolist, todo, todo_cmp); return todo; } @@ -139,10 +146,21 @@ void todo_delete(struct todo *todo) mem_free(todo); } +/* + * Make sure an item is located at the right position within the sorted list. + */ +void todo_resort(struct todo *t) +{ + llist_item_t *i = LLIST_FIND_FIRST(&todolist, t, NULL); + LLIST_REMOVE(&todolist, i); + LLIST_ADD_SORTED(&todolist, t, todo_cmp); +} + /* Flag a todo item. */ void todo_flag(struct todo *t) { t->completed = !t->completed; + todo_resort(t); } /* -- cgit v1.2.3-54-g00ecf