Add a "hide completed" view to the todo panel
Add a second view to the todo panel that hides all completed items. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
parent
2857bac971
commit
1a4bf2b0a2
@ -423,6 +423,9 @@ static inline void key_generic_scroll_up(void)
|
|||||||
if (wins_slctd() == CAL) {
|
if (wins_slctd() == CAL) {
|
||||||
ui_calendar_view_prev();
|
ui_calendar_view_prev();
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
|
} else if (wins_slctd() == TOD) {
|
||||||
|
ui_todo_view_prev();
|
||||||
|
wins_update(FLAG_TOD | FLAG_APP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,6 +434,9 @@ static inline void key_generic_scroll_down(void)
|
|||||||
if (wins_slctd() == CAL) {
|
if (wins_slctd() == CAL) {
|
||||||
ui_calendar_view_next();
|
ui_calendar_view_next();
|
||||||
wins_update(FLAG_CAL | FLAG_APP);
|
wins_update(FLAG_CAL | FLAG_APP);
|
||||||
|
} else if (wins_slctd() == TOD) {
|
||||||
|
ui_todo_view_next();
|
||||||
|
wins_update(FLAG_TOD | FLAG_APP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,13 +425,20 @@ struct day_item {
|
|||||||
union aptev_ptr item;
|
union aptev_ptr item;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Available view for the calendar panel. */
|
/* Available views for the calendar panel. */
|
||||||
enum {
|
enum {
|
||||||
CAL_MONTH_VIEW,
|
CAL_MONTH_VIEW,
|
||||||
CAL_WEEK_VIEW,
|
CAL_WEEK_VIEW,
|
||||||
CAL_VIEWS
|
CAL_VIEWS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Available views for the todo panel. */
|
||||||
|
enum {
|
||||||
|
TODO_SHOW_COMPLETED_VIEW,
|
||||||
|
TODO_HIDE_COMPLETED_VIEW,
|
||||||
|
TODO_VIEWS
|
||||||
|
};
|
||||||
|
|
||||||
struct notify_app {
|
struct notify_app {
|
||||||
long time;
|
long time;
|
||||||
int got_app;
|
int got_app;
|
||||||
@ -1009,7 +1016,7 @@ int string_printf(struct string *, const char *, ...);
|
|||||||
|
|
||||||
/* todo.c */
|
/* todo.c */
|
||||||
extern llist_t todolist;
|
extern llist_t todolist;
|
||||||
struct todo *todo_get_item(int);
|
struct todo *todo_get_item(int, int);
|
||||||
struct todo *todo_add(char *, int, char *);
|
struct todo *todo_add(char *, int, char *);
|
||||||
char *todo_tostr(struct todo *);
|
char *todo_tostr(struct todo *);
|
||||||
char *todo_hash(struct todo *);
|
char *todo_hash(struct todo *);
|
||||||
@ -1062,6 +1069,8 @@ void ui_todo_popup_item(void);
|
|||||||
void ui_todo_flag(void);
|
void ui_todo_flag(void);
|
||||||
void ui_todo_view_note(void);
|
void ui_todo_view_note(void);
|
||||||
void ui_todo_edit_note(void);
|
void ui_todo_edit_note(void);
|
||||||
|
void ui_todo_view_prev(void);
|
||||||
|
void ui_todo_view_next(void);
|
||||||
|
|
||||||
/* utf8.c */
|
/* utf8.c */
|
||||||
int utf8_width(char *);
|
int utf8_width(char *);
|
||||||
|
19
src/todo.c
19
src/todo.c
@ -43,10 +43,23 @@
|
|||||||
|
|
||||||
llist_t todolist;
|
llist_t todolist;
|
||||||
|
|
||||||
/* Returns a structure containing the selected item. */
|
static int todo_is_uncompleted(struct todo *todo, void *cbdata)
|
||||||
struct todo *todo_get_item(int item_number)
|
|
||||||
{
|
{
|
||||||
return LLIST_GET_DATA(LLIST_NTH(&todolist, item_number));
|
return todo->id >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns a structure containing the selected item. */
|
||||||
|
struct todo *todo_get_item(int item_number, int skip_completed)
|
||||||
|
{
|
||||||
|
llist_item_t *i;
|
||||||
|
|
||||||
|
if (skip_completed)
|
||||||
|
i = LLIST_FIND_NTH(&todolist, item_number, NULL,
|
||||||
|
todo_is_uncompleted);
|
||||||
|
else
|
||||||
|
i = LLIST_NTH(&todolist, item_number);
|
||||||
|
|
||||||
|
return LLIST_GET_DATA(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int todo_cmp_id(struct todo *a, struct todo *b)
|
static int todo_cmp_id(struct todo *a, struct todo *b)
|
||||||
|
@ -36,6 +36,14 @@
|
|||||||
|
|
||||||
#include "calcurse.h"
|
#include "calcurse.h"
|
||||||
|
|
||||||
|
static unsigned ui_todo_view = 0;
|
||||||
|
|
||||||
|
static struct todo *ui_todo_selitem(void)
|
||||||
|
{
|
||||||
|
return todo_get_item(listbox_get_sel(&lb_todo),
|
||||||
|
ui_todo_view == TODO_HIDE_COMPLETED_VIEW);
|
||||||
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
@ -77,7 +85,7 @@ void ui_todo_delete(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
|
|
||||||
if (item->note)
|
if (item->note)
|
||||||
answer = status_ask_choice(erase_warning, erase_choice,
|
answer = status_ask_choice(erase_warning, erase_choice,
|
||||||
@ -107,7 +115,7 @@ void ui_todo_edit(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
const char *mesg = _("Enter the new TODO description:");
|
const char *mesg = _("Enter the new TODO description:");
|
||||||
|
|
||||||
status_mesg(mesg, "");
|
status_mesg(mesg, "");
|
||||||
@ -127,7 +135,7 @@ void ui_todo_pipe(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
|
|
||||||
status_mesg(_("Pipe item to external command:"), "");
|
status_mesg(_("Pipe item to external command:"), "");
|
||||||
if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID)
|
if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID)
|
||||||
@ -154,6 +162,14 @@ void ui_todo_draw(int n, WINDOW *win, int y, int hilt, void *cb_data)
|
|||||||
char buf[width * UTF8_MAXLEN];
|
char buf[width * UTF8_MAXLEN];
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
|
if (ui_todo_view == TODO_HIDE_COMPLETED_VIEW) {
|
||||||
|
while (i && todo->id < 0) {
|
||||||
|
i = i->next;
|
||||||
|
if (i)
|
||||||
|
todo = LLIST_TS_GET_DATA(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mark[0] = todo->id > 0 ? '0' + todo->id : 'X';
|
mark[0] = todo->id > 0 ? '0' + todo->id : 'X';
|
||||||
mark[1] = todo->note ? '>' : '.';
|
mark[1] = todo->note ? '>' : '.';
|
||||||
|
|
||||||
@ -199,8 +215,12 @@ void ui_todo_load_items(void)
|
|||||||
llist_item_t *i;
|
llist_item_t *i;
|
||||||
|
|
||||||
/* TODO: Optimize this by keeping the list size in a variable. */
|
/* TODO: Optimize this by keeping the list size in a variable. */
|
||||||
LLIST_FOREACH(&todolist, i)
|
LLIST_FOREACH(&todolist, i) {
|
||||||
|
struct todo *todo = LLIST_TS_GET_DATA(i);
|
||||||
|
if (ui_todo_view == TODO_HIDE_COMPLETED_VIEW && todo->id < 0)
|
||||||
|
continue;
|
||||||
n++;
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
listbox_load_items(&lb_todo, n);
|
listbox_load_items(&lb_todo, n);
|
||||||
}
|
}
|
||||||
@ -219,7 +239,7 @@ void ui_todo_sel_move(int delta)
|
|||||||
void ui_todo_update_panel(int which_pan)
|
void ui_todo_update_panel(int which_pan)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* This is used and modified by display_todo_item() to avoid quadratic
|
* This is used and modified by ui_todo_draw() to avoid quadratic
|
||||||
* running time.
|
* running time.
|
||||||
*/
|
*/
|
||||||
llist_item_t *p = LLIST_FIRST(&todolist);
|
llist_item_t *p = LLIST_FIRST(&todolist);
|
||||||
@ -234,7 +254,7 @@ void ui_todo_chg_priority(int diff)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
int id = item->id + diff;
|
int id = item->id + diff;
|
||||||
struct todo *item_new;
|
struct todo *item_new;
|
||||||
|
|
||||||
@ -254,7 +274,7 @@ void ui_todo_popup_item(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
|
item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,8 +283,10 @@ void ui_todo_flag(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
todo_flag(item);
|
todo_flag(item);
|
||||||
|
if (ui_todo_view == TODO_HIDE_COMPLETED_VIEW)
|
||||||
|
ui_todo_load_items();
|
||||||
io_set_modified();
|
io_set_modified();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,7 +295,7 @@ void ui_todo_view_note(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
todo_view_note(item, conf.pager);
|
todo_view_note(item, conf.pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +304,25 @@ void ui_todo_edit_note(void)
|
|||||||
if (!LLIST_FIRST(&todolist))
|
if (!LLIST_FIRST(&todolist))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct todo *item = todo_get_item(listbox_get_sel(&lb_todo));
|
struct todo *item = ui_todo_selitem();
|
||||||
todo_edit_note(item, conf.editor);
|
todo_edit_note(item, conf.editor);
|
||||||
io_set_modified();
|
io_set_modified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Switch to next todo view. */
|
||||||
|
void ui_todo_view_next(void)
|
||||||
|
{
|
||||||
|
ui_todo_view++;
|
||||||
|
if (ui_todo_view == TODO_VIEWS)
|
||||||
|
ui_todo_view = 0;
|
||||||
|
ui_todo_load_items();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Switch to previous todo view. */
|
||||||
|
void ui_todo_view_prev(void)
|
||||||
|
{
|
||||||
|
if (ui_todo_view == 0)
|
||||||
|
ui_todo_view = TODO_VIEWS;
|
||||||
|
ui_todo_view--;
|
||||||
|
ui_todo_load_items();
|
||||||
|
}
|
||||||
|
@ -665,6 +665,7 @@ void wins_update_bindings(void)
|
|||||||
static int bindings_todo[] = {
|
static int bindings_todo[] = {
|
||||||
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
|
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
|
||||||
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
|
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
|
||||||
|
KEY_GENERIC_SCROLL_DOWN, KEY_GENERIC_SCROLL_UP,
|
||||||
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
|
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
|
||||||
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
|
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
|
||||||
KEY_FLAG_ITEM, KEY_RAISE_PRIORITY, KEY_LOWER_PRIORITY,
|
KEY_FLAG_ITEM, KEY_RAISE_PRIORITY, KEY_LOWER_PRIORITY,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user