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:
parent
25a049951c
commit
df1bc59812
@ -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 *);
|
||||||
|
21
src/todo.c
21
src/todo.c
@ -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;
|
||||||
|
|
||||||
LLIST_FOREACH(&todolist, i) {
|
if (skip_completed) {
|
||||||
if (LLIST_TS_GET_DATA(i) == needle)
|
LLIST_FIND_FOREACH(&todolist, NULL, todo_is_uncompleted, i) {
|
||||||
return n;
|
if (LLIST_TS_GET_DATA(i) == needle)
|
||||||
n++;
|
return n;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LLIST_FOREACH(&todolist, i) {
|
||||||
|
if (LLIST_TS_GET_DATA(i) == needle)
|
||||||
|
return 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 */
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user