Make automatic selection of todo items smarter

* Automatically focus new todo items after adding them to the list.
* Keep selection when an item is moved (e.g. by changing its priority).
* Focus the next item in the list when an item is removed.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
Lukas Fleischer 2016-01-18 19:19:18 +01:00
parent 25a049951c
commit df1bc59812
3 changed files with 28 additions and 15 deletions

View File

@ -1026,7 +1026,7 @@ void todo_delete_note(struct todo *);
void todo_delete(struct todo *); void todo_delete(struct todo *);
void todo_resort(struct todo *); void todo_resort(struct todo *);
void todo_flag(struct todo *); void todo_flag(struct todo *);
int todo_get_position(struct todo *); int todo_get_position(struct todo *, int);
void todo_edit_note(struct todo *, const char *); void todo_edit_note(struct todo *, const char *);
void todo_view_note(struct todo *, const char *); void todo_view_note(struct todo *, const char *);
void todo_free(struct todo *); void todo_free(struct todo *);

View File

@ -167,19 +167,26 @@ void todo_flag(struct todo *t)
* Returns the position into the linked list corresponding to the * Returns the position into the linked list corresponding to the
* given todo item. * given todo item.
*/ */
int todo_get_position(struct todo *needle) int todo_get_position(struct todo *needle, int skip_completed)
{ {
llist_item_t *i; llist_item_t *i;
int n = 0; int n = 0;
if (skip_completed) {
LLIST_FIND_FOREACH(&todolist, NULL, todo_is_uncompleted, i) {
if (LLIST_TS_GET_DATA(i) == needle)
return n;
n++;
}
} else {
LLIST_FOREACH(&todolist, i) { LLIST_FOREACH(&todolist, i) {
if (LLIST_TS_GET_DATA(i) == needle) if (LLIST_TS_GET_DATA(i) == needle)
return n; return n;
n++; n++;
} }
}
EXIT(_("todo not found")); return -1;
return -1; /* avoid compiler warnings */
} }
/* Attach a note to a todo */ /* Attach a note to a todo */

View File

@ -44,6 +44,14 @@ static struct todo *ui_todo_selitem(void)
ui_todo_view == TODO_HIDE_COMPLETED_VIEW); ui_todo_view == TODO_HIDE_COMPLETED_VIEW);
} }
static void ui_todo_set_selitem(struct todo *todo)
{
int n = todo_get_position(todo,
ui_todo_view == TODO_HIDE_COMPLETED_VIEW);
if (n >= 0)
listbox_set_sel(&lb_todo, n);
}
/* Request user to enter a new todo item. */ /* Request user to enter a new todo item. */
void ui_todo_add(void) void ui_todo_add(void)
{ {
@ -60,9 +68,10 @@ void ui_todo_add(void)
status_mesg(mesg_id, ""); status_mesg(mesg_id, "");
ch = wgetch(win[KEY].p); ch = wgetch(win[KEY].p);
} }
todo_add(todo_input, ch - '0', 0, NULL); struct todo *todo = todo_add(todo_input, ch - '0', 0, NULL);
ui_todo_load_items(); ui_todo_load_items();
io_set_modified(); io_set_modified();
ui_todo_set_selitem(todo);
} }
} }
@ -123,8 +132,7 @@ void ui_todo_edit(void)
todo_resort(item); todo_resort(item);
ui_todo_load_items(); ui_todo_load_items();
io_set_modified(); io_set_modified();
ui_todo_set_selitem(item);
listbox_set_sel(&lb_todo, todo_get_position(item));
} }
/* Pipe a todo item to an external program. */ /* Pipe a todo item to an external program. */
@ -291,8 +299,7 @@ void ui_todo_chg_priority(int diff)
item_new = todo_add(item->mesg, id, item->completed, item->note); item_new = todo_add(item->mesg, id, item->completed, item->note);
todo_delete(item); todo_delete(item);
io_set_modified(); io_set_modified();
ui_todo_set_selitem(item_new);
listbox_set_sel(&lb_todo, todo_get_position(item_new));
} }
void ui_todo_popup_item(void) void ui_todo_popup_item(void)
@ -313,8 +320,7 @@ void ui_todo_flag(void)
todo_flag(item); todo_flag(item);
ui_todo_load_items(); ui_todo_load_items();
io_set_modified(); io_set_modified();
ui_todo_set_selitem(item);
listbox_set_sel(&lb_todo, todo_get_position(item));
} }
void ui_todo_view_note(void) void ui_todo_view_note(void)