diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-05-16 10:36:26 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-05-18 11:06:43 +0200 |
commit | 35314dfdebb0747b03d0d35db2ce9a58edf31a72 (patch) | |
tree | 01c7aefd9e9245e9655121c9316d02fe0a030504 /src | |
parent | f513fa4627fe88f7c45bbeaa0d2842201c108a01 (diff) | |
download | calcurse-35314dfdebb0747b03d0d35db2ce9a58edf31a72.zip |
ui-day: Large-scale refactoring
Use the generic list box implementation for the appointments panel. This
results in some major changes to how the items are printed.
Note that this temporarily removes the heading showing the POM and the
date as well as the separating line between events and appointments.
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/args.c | 4 | ||||
-rw-r--r-- | src/calcurse.c | 126 | ||||
-rw-r--r-- | src/calcurse.h | 52 | ||||
-rw-r--r-- | src/day.c | 106 | ||||
-rw-r--r-- | src/ui-day.c | 234 | ||||
-rw-r--r-- | src/wins.c | 28 |
6 files changed, 188 insertions, 362 deletions
@@ -307,7 +307,9 @@ app_arg(int add_line, struct date *day, long date, const char *fmt_apt, if (date == 0) date = get_sec_date(*day); - int n = day_store_items(date, NULL, NULL, regex); + day_store_items(date, regex); + + int n = day_item_count(); if (n > 0) { if (add_line) diff --git a/src/calcurse.c b/src/calcurse.c index 3bab0af..de0d5a5 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -40,44 +40,25 @@ #define HANDLE_KEY(key, fn) case key: fn(); break; -struct day_items_nb inday; int count, reg; /* * Store the events and appointments for the selected day and reset the * appointment highlight pointer if a new day was selected. */ -static struct day_items_nb do_storage(int day_changed) +static void do_storage(int day_changed) { - struct day_items_nb inday = - day_process_storage(ui_calendar_get_slctd_day(), - day_changed); + day_process_storage(ui_calendar_get_slctd_day(), day_changed); + ui_day_load_items(); - if (day_changed) { - if ((inday.nb_events + inday.nb_apoints) > 0) - ui_day_hilt_set(1); - else - ui_day_hilt_set(0); - } - - return inday; + if (day_changed) + ui_day_sel_reset(); } static inline void key_generic_change_view(void) { wins_reset_status_page(); wins_slctd_next(); - - /* Select the event to highlight. */ - switch (wins_slctd()) { - case APP: - if ((ui_day_hilt() == 0) - && ((inday.nb_events + inday.nb_apoints) > 0)) - ui_day_hilt_set(1); - break; - default: - break; - } wins_update(FLAG_ALL); } @@ -92,7 +73,7 @@ static inline void key_generic_goto(void) wins_erase_status_bar(); ui_calendar_set_current_date(); ui_calendar_change_day(conf.input_datefmt); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } @@ -101,14 +82,14 @@ static inline void key_generic_goto_today(void) wins_erase_status_bar(); ui_calendar_set_current_date(); ui_calendar_goto_today(); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_view_item(void) { - if ((wins_slctd() == APP) && (ui_day_hilt() != 0)) - day_popup_item(day_get_item(ui_day_hilt())); + if (wins_slctd() == APP) + ui_day_popup_item(); else if (wins_slctd() == TOD) ui_todo_popup_item(); wins_update(FLAG_ALL); @@ -118,14 +99,14 @@ static inline void key_generic_config_menu(void) { wins_erase_status_bar(); custom_config_main(); - inday = do_storage(0); + do_storage(0); wins_update(FLAG_ALL); } static inline void key_generic_add_appt(void) { ui_day_item_add(); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } @@ -140,7 +121,7 @@ static inline void key_add_item(void) switch (wins_slctd()) { case APP: ui_day_item_add(); - inday = do_storage(0); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); break; case TOD: @@ -154,9 +135,9 @@ static inline void key_add_item(void) static inline void key_edit_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { + if (wins_slctd() == APP) { ui_day_item_edit(); - inday = do_storage(0); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } else if (wins_slctd() == TOD) { ui_todo_edit(); @@ -166,10 +147,9 @@ static inline void key_edit_item(void) static inline void key_del_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - ui_day_item_delete(&inday.nb_events, &inday.nb_apoints, - reg); - inday = do_storage(0); + if (wins_slctd() == APP) { + ui_day_item_delete(reg); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } else if (wins_slctd() == TOD) { ui_todo_delete(); @@ -179,9 +159,9 @@ static inline void key_del_item(void) static inline void key_generic_copy(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - ui_day_item_copy(&inday.nb_events, &inday.nb_apoints, reg); - inday = do_storage(0); + if (wins_slctd() == APP) { + ui_day_item_copy(reg); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP); } } @@ -189,26 +169,25 @@ static inline void key_generic_copy(void) static inline void key_generic_paste(void) { if (wins_slctd() == APP) { - ui_day_item_paste(&inday.nb_events, &inday.nb_apoints, - reg); - inday = do_storage(0); + ui_day_item_paste(reg); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP); } } static inline void key_repeat_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) + if (wins_slctd() == APP) ui_day_item_repeat(); - inday = do_storage(0); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } static inline void key_flag_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - day_item_switch_notify(day_get_item(ui_day_hilt())); - inday = do_storage(0); + if (wins_slctd() == APP) { + ui_day_flag(); + do_storage(0); wins_update(FLAG_APP); } else if (wins_slctd() == TOD) { ui_todo_flag(); @@ -218,7 +197,7 @@ static inline void key_flag_item(void) static inline void key_pipe_item(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) + if (wins_slctd() == APP) ui_day_item_pipe(); else if (wins_slctd() == TOD) ui_todo_pipe(); @@ -245,9 +224,9 @@ static inline void key_lower_priority(void) static inline void key_edit_note(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) { - day_edit_note(day_get_item(ui_day_hilt()), conf.editor); - inday = do_storage(0); + if (wins_slctd() == APP) { + ui_day_edit_note(); + do_storage(0); } else if (wins_slctd() == TOD) { ui_todo_edit_note(); } @@ -256,8 +235,8 @@ static inline void key_edit_note(void) static inline void key_view_note(void) { - if (wins_slctd() == APP && ui_day_hilt() != 0) - day_view_note(day_get_item(ui_day_hilt()), conf.pager); + if (wins_slctd() == APP) + ui_day_view_note(); else if (wins_slctd() == TOD) ui_todo_view_note(); wins_update(FLAG_ALL); @@ -280,7 +259,7 @@ static inline void key_generic_import(void) wins_erase_status_bar(); io_import_data(IO_IMPORT_ICAL, NULL); ui_calendar_monthly_view_cache_set_invalid(); - inday = do_storage(0); + do_storage(0); wins_update(FLAG_ALL); } @@ -304,14 +283,14 @@ static inline void key_generic_export() break; } - inday = do_storage(0); + do_storage(0); wins_update(FLAG_ALL); } static inline void key_generic_prev_day(void) { ui_calendar_move(DAY_PREV, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } @@ -324,7 +303,7 @@ static inline void key_move_left(void) static inline void key_generic_next_day(void) { ui_calendar_move(DAY_NEXT, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } @@ -337,7 +316,7 @@ static inline void key_move_right(void) static inline void key_generic_prev_week(void) { ui_calendar_move(WEEK_PREV, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } @@ -346,10 +325,7 @@ static inline void key_move_up(void) if (wins_slctd() == CAL) { key_generic_prev_week(); } else if (wins_slctd() == APP) { - if (count >= ui_day_hilt()) - count = ui_day_hilt() - 1; - ui_day_hilt_decrease(count); - ui_day_scroll_pad_up(inday.nb_events); + ui_day_sel_move(-1); wins_update(FLAG_APP); } else if (wins_slctd() == TOD) { ui_todo_sel_move(-1); @@ -360,7 +336,7 @@ static inline void key_move_up(void) static inline void key_generic_next_week(void) { ui_calendar_move(WEEK_NEXT, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } @@ -369,13 +345,7 @@ static inline void key_move_down(void) if (wins_slctd() == CAL) { key_generic_next_week(); } else if (wins_slctd() == APP) { - if (count > - inday.nb_events + inday.nb_apoints - ui_day_hilt()) - count = - inday.nb_events + inday.nb_apoints - - ui_day_hilt(); - ui_day_hilt_increase(count); - ui_day_scroll_pad_down(inday.nb_events, win[APP].h); + ui_day_sel_move(1); wins_update(FLAG_APP); } else if (wins_slctd() == TOD) { ui_todo_sel_move(1); @@ -386,28 +356,28 @@ static inline void key_move_down(void) static inline void key_generic_prev_month(void) { ui_calendar_move(MONTH_PREV, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_next_month(void) { ui_calendar_move(MONTH_NEXT, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_prev_year(void) { ui_calendar_move(YEAR_PREV, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } static inline void key_generic_next_year(void) { ui_calendar_move(YEAR_NEXT, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } @@ -415,7 +385,7 @@ static inline void key_start_of_week(void) { if (wins_slctd() == CAL) { ui_calendar_move(WEEK_START, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } } @@ -424,7 +394,7 @@ static inline void key_end_of_week(void) { if (wins_slctd() == CAL) { ui_calendar_move(WEEK_END, count); - inday = do_storage(1); + do_storage(1); wins_update(FLAG_CAL | FLAG_APP); } } @@ -629,7 +599,7 @@ int main(int argc, char **argv) wins_update(FLAG_ALL); io_startup_screen(no_data_file); } - inday = day_process_storage(0, 0); + do_storage(1); wins_slctd_set(conf.default_panel); wins_update(FLAG_ALL); diff --git a/src/calcurse.h b/src/calcurse.h index 54344bb..07f6b78 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -323,12 +323,6 @@ struct todo { char *note; }; -/* Number of items in current day. */ -struct day_items_nb { - unsigned nb_events; - unsigned nb_apoints; -}; - struct excp { long st; /* beggining of the considered day, in seconds */ }; @@ -632,21 +626,14 @@ struct apoint *apoint_dup(struct apoint *); void apoint_free(struct apoint *); void apoint_llist_init(void); void apoint_llist_free(void); -void ui_day_hilt_set(int); -void ui_day_hilt_decrease(int); -void ui_day_hilt_increase(int); -int ui_day_hilt(void); struct apoint *apoint_new(char *, char *, long, long, char); unsigned apoint_inday(struct apoint *, long *); void apoint_sec2str(struct apoint *, long, char *, char *); void apoint_write(struct apoint *, FILE *); struct apoint *apoint_scan(FILE *, struct tm, struct tm, char, char *); void apoint_delete(struct apoint *); -void ui_day_scroll_pad_down(int, int); -void ui_day_scroll_pad_up(int); struct notify_app *apoint_check_next(struct notify_app *, long); void apoint_switch_notify(struct apoint *); -void ui_day_update_panel(int, struct date); void apoint_paste_item(struct apoint *, long); /* args.c */ @@ -705,9 +692,10 @@ long day_item_get_duration(struct day_item *); int day_item_get_state(struct day_item *); void day_item_add_exc(struct day_item *, long); void day_item_fork(struct day_item *, struct day_item *); -int day_store_items(long, unsigned *, unsigned *, regex_t *); -struct day_items_nb day_process_storage(struct date *, unsigned); -void day_write_pad(long, int, int, int); +void day_store_items(long, regex_t *); +void day_process_storage(struct date *, unsigned); +void day_display_item_date(struct day_item *, WINDOW *, int, long, int, int); +void day_display_item(struct day_item *, WINDOW *, int, int, int, int); void day_write_stdout(long, const char *, const char *, const char *, const char *, int *); void day_popup_item(struct day_item *); @@ -716,6 +704,7 @@ unsigned day_chk_busy_slices(struct date, int, int *); struct day_item *day_cut_item(long, int); int day_paste_item(struct day_item *, long); struct day_item *day_get_item(int); +unsigned day_item_count(void); void day_edit_note(struct day_item *, const char *); void day_view_note(struct day_item *, const char *); void day_item_switch_notify(struct day_item *); @@ -750,16 +739,6 @@ void ical_import_data(FILE *, FILE *, unsigned *, unsigned *, unsigned *, unsigned *, unsigned *); void ical_export_data(FILE *); -/* interaction.c */ -void ui_day_item_add(void); -void ui_day_item_delete(unsigned *, unsigned *, unsigned); -void ui_day_item_edit(void); -void ui_day_item_pipe(void); -void ui_day_item_repeat(void); -void ui_day_item_cut_free(unsigned); -void ui_day_item_copy(unsigned *, unsigned *, unsigned); -void ui_day_item_paste(unsigned *, unsigned *, unsigned); - /* io.c */ unsigned io_fprintln(const char *, const char *, ...); void io_init(const char *, const char *); @@ -959,6 +938,26 @@ void todo_free(struct todo *); void todo_init_list(void); void todo_free_list(void); +/* ui-day.c */ +void ui_day_item_add(void); +void ui_day_item_delete(unsigned); +void ui_day_item_edit(void); +void ui_day_item_pipe(void); +void ui_day_item_repeat(void); +void ui_day_item_cut_free(unsigned); +void ui_day_item_copy(unsigned); +void ui_day_item_paste(unsigned); +void ui_day_load_items(void); +void ui_day_sel_reset(void); +void ui_day_sel_move(int); +void ui_day_draw(int, WINDOW *, int, int, void *); +int ui_day_height(int, void *); +void ui_day_update_panel(int); +void ui_day_popup_item(void); +void ui_day_flag(void); +void ui_day_view_note(void); +void ui_day_edit_note(void); + /* ui-todo.c */ void ui_todo_add(void); void ui_todo_delete(void); @@ -1058,6 +1057,7 @@ void vars_init(void); /* wins.c */ extern struct window win[NBWINS]; extern struct scrollwin sw_cal; +extern struct listbox lb_apt; extern struct listbox lb_todo; unsigned wins_nbar_lock(void); void wins_nbar_unlock(void); @@ -65,8 +65,11 @@ void day_free_vector(void) VECTOR_FREE(&day_items); } -static int day_cmp_start(struct day_item *a, struct day_item *b) +static int day_cmp_start(struct day_item **pa, struct day_item **pb) { + struct day_item *a = *pa; + struct day_item *b = *pb; + if (a->type <= EVNT) { if (b->type <= EVNT) return 0; @@ -334,29 +337,18 @@ static int day_store_recur_apoints(long date, regex_t * regex) * and the length of the new pad to write is returned. * The number of events and appointments in the current day are also updated. */ -int -day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints, - regex_t * regex) +void +day_store_items(long date, regex_t * regex) { - int nb_events, nb_recur_events; - int nb_apoints, nb_recur_apoints; - day_free_vector(); day_init_vector(); - nb_recur_events = day_store_recur_events(date, regex); - nb_events = day_store_events(date, regex); - nb_recur_apoints = day_store_recur_apoints(date, regex); - nb_apoints = day_store_apoints(date, regex); + day_store_recur_events(date, regex); + day_store_events(date, regex); + day_store_recur_apoints(date, regex); + day_store_apoints(date, regex); VECTOR_SORT(&day_items, day_cmp_start); - - if (pnb_apoints) - *pnb_apoints = nb_apoints + nb_recur_apoints; - if (pnb_events) - *pnb_events = nb_events + nb_recur_events; - - return nb_events + nb_recur_events + nb_apoints + nb_recur_apoints; } /* @@ -364,12 +356,10 @@ day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints, * those items in a pad. If selected day is null, then store items for current * day. This is useful to speed up the appointment panel update. */ -struct day_items_nb day_process_storage(struct date *slctd_date, - unsigned day_changed) +void day_process_storage(struct date *slctd_date, unsigned day_changed) { long date; struct date day; - struct day_items_nb inday; if (slctd_date) day = *slctd_date; @@ -383,25 +373,16 @@ struct day_items_nb day_process_storage(struct date *slctd_date, delwin(apad.ptrwin); /* Store the events and appointments (recursive and normal items). */ - day_store_items(date, &inday.nb_events, &inday.nb_apoints, NULL); - apad.length = (inday.nb_events + 1 + 3 * inday.nb_apoints); - - /* Create the new pad with its new length. */ - if (day_changed) - apad.first_onscreen = 0; - apad.ptrwin = newpad(apad.length, apad.width); - - return inday; + day_store_items(date, NULL); } /* * Print an item date in the appointment panel. */ -static void -display_item_date(struct day_item *day, int incolor, long date, int y, - int x) +void +day_display_item_date(struct day_item *day, WINDOW *win, int incolor, + long date, int y, int x) { - WINDOW *win; char a_st[100], a_end[100]; char ch_recur, ch_notify; @@ -411,7 +392,6 @@ display_item_date(struct day_item *day, int incolor, long date, int y, apt_tmp.start = day->start; apt_tmp.dur = day_item_get_duration(day); - win = apad.ptrwin; apoint_sec2str(&apt_tmp, date, a_st, a_end); if (incolor == 0) custom_apply_attr(win, ATTR_HIGHEST); @@ -428,10 +408,10 @@ display_item_date(struct day_item *day, int incolor, long date, int y, /* * Print an item description in the corresponding panel window. */ -static void -display_item(struct day_item *day, int incolor, int width, int y, int x) +void +day_display_item(struct day_item *day, WINDOW *win, int incolor, int width, + int y, int x) { - WINDOW *win; int ch_recur, ch_note; char buf[width * UTF8_MAXLEN]; int i; @@ -441,7 +421,6 @@ display_item(struct day_item *day, int incolor, int width, int y, int x) char *mesg = day_item_get_mesg(day); - win = apad.ptrwin; ch_recur = (day->type == RECUR_EVNT || day->type == RECUR_APPT) ? '*' : ' '; ch_note = day_item_get_note(day) ? '>' : ' '; @@ -465,48 +444,6 @@ display_item(struct day_item *day, int incolor, int width, int y, int x) custom_remove_attr(win, ATTR_HIGHEST); } -/* - * Write the appointments and events for the selected day in a pad. - * An horizontal line is drawn between events and appointments, and the - * item selected by user is highlighted. - */ -void day_write_pad(long date, int width, int length, int incolor) -{ - int i; - int line, item_number; - const int x_pos = 0; - unsigned draw_line = 0; - - line = item_number = 0; - - VECTOR_FOREACH(&day_items, i) { - struct day_item *day = VECTOR_NTH(&day_items, i); - - /* First print the events for current day. */ - if (day->type < RECUR_APPT) { - item_number++; - display_item(day, item_number - incolor, width - 7, - line, x_pos); - line++; - draw_line = 1; - } else { - /* Draw a line between events and appointments. */ - if (line > 0 && draw_line) { - wmove(apad.ptrwin, line, 0); - whline(apad.ptrwin, 0, width); - draw_line = 0; - } - /* Last print the appointments for current day. */ - item_number++; - display_item_date(day, item_number - incolor, date, - line + 1, x_pos); - display_item(day, item_number - incolor, width - 7, - line + 2, x_pos); - line += 3; - } - } -} - /* Write the appointments and events for the selected day to stdout. */ void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, int *limit) @@ -729,7 +666,12 @@ int day_paste_item(struct day_item *p, long date) /* Returns a structure containing the selected item. */ struct day_item *day_get_item(int item_number) { - return VECTOR_NTH(&day_items, item_number - 1); + return VECTOR_NTH(&day_items, item_number); +} + +unsigned day_item_count(void) +{ + return VECTOR_COUNT(&day_items); } /* Attach a note to an appointment or event. */ diff --git a/src/ui-day.c b/src/ui-day.c index 3562637..d1e5843 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -36,7 +36,6 @@ #include "calcurse.h" -static int hilt; struct day_item day_cut[38] = { {0, 0, {NULL}} }; /* Request the user to enter a new time. */ @@ -293,14 +292,16 @@ static void update_rept(struct rpt **rpt, const long start) /* Edit an already existing item. */ void ui_day_item_edit(void) { - struct day_item *p; struct recur_event *re; struct event *e; struct recur_apoint *ra; struct apoint *a; int need_check_notify = 0; - p = day_get_item(ui_day_hilt()); + if (day_item_count() <= 0) + return; + + struct day_item *p = day_get_item(listbox_get_sel(&lb_apt)); switch (p->type) { case RECUR_EVNT: @@ -408,7 +409,11 @@ void ui_day_item_pipe(void) int pout; int pid; FILE *fpout; - struct day_item *p; + + if (day_item_count() <= 0) + return; + + struct day_item *p = day_get_item(listbox_get_sel(&lb_apt)); status_mesg(_("Pipe item to external command:"), ""); if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) @@ -418,7 +423,6 @@ void ui_day_item_pipe(void) if ((pid = shell_exec(NULL, &pout, *arg, arg))) { fpout = fdopen(pout, "w"); - p = day_get_item(ui_day_hilt()); switch (p->type) { case RECUR_EVNT: recur_event_write(p->item.rev, fpout); @@ -541,9 +545,6 @@ void ui_day_item_add(void) date2sec(*ui_calendar_get_slctd_day(), 0, 0), 1); } - - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); } ui_calendar_monthly_view_cache_set_invalid(); @@ -552,8 +553,7 @@ void ui_day_item_add(void) } /* Delete an item from the appointment list. */ -void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) +void ui_day_item_delete(unsigned reg) { const char *del_app_str = _("Do you really want to delete this item?"); @@ -569,15 +569,12 @@ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, "Delete (i)tem or just its (n)ote?"); const char *note_choices = _("[in]"); const int nb_note_choices = 2; - long date = ui_calendar_get_slctd_day_sec(); - int nb_items = *nb_apoints + *nb_events; - int to_be_removed = 0; - if (nb_items == 0) + if (day_item_count() <= 0) return; - struct day_item *p = day_get_item(ui_day_hilt()); + struct day_item *p = day_get_item(listbox_get_sel(&lb_apt)); if (conf.confirm_delete) { if (status_ask_bool(del_app_str) != 1) { @@ -613,34 +610,11 @@ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, } ui_day_item_cut_free(reg); - p = day_cut_item(date, ui_day_hilt()); + p = day_cut_item(date, listbox_get_sel(&lb_apt)); day_cut[reg].type = p->type; day_cut[reg].item = p->item; - switch (p->type) { - case EVNT: - case RECUR_EVNT: - (*nb_events)--; - to_be_removed = 1; - break; - case APPT: - case RECUR_APPT: - (*nb_apoints)--; - to_be_removed = 3; - break; - default: - EXIT(_("no such type")); - /* NOTREACHED */ - } - ui_calendar_monthly_view_cache_set_invalid(); - - if (ui_day_hilt() > 1) - ui_day_hilt_decrease(1); - if (apad.first_onscreen >= to_be_removed) - apad.first_onscreen = apad.first_onscreen - to_be_removed; - if (nb_items == 1) - ui_day_hilt_set(0); } /* @@ -690,7 +664,10 @@ void ui_day_item_repeat(void) struct recur_apoint *ra; long until, date; - item_nb = ui_day_hilt(); + if (day_item_count() <= 0) + return; + + item_nb = listbox_get_sel(&lb_apt); p = day_get_item(item_nb); if (p->type != APPT && p->type != EVNT) { status_mesg(wrong_type_1, wrong_type_2); @@ -810,165 +787,110 @@ void ui_day_item_cut_free(unsigned reg) } /* Copy an item, so that it can be pasted somewhere else later. */ -void ui_day_item_copy(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) +void ui_day_item_copy(unsigned reg) { - const int NBITEMS = *nb_apoints + *nb_events; - - if (NBITEMS == 0 || reg == REG_BLACK_HOLE) + if (day_item_count() <= 0 || reg == REG_BLACK_HOLE) return; + struct day_item *item = day_get_item(listbox_get_sel(&lb_apt)); ui_day_item_cut_free(reg); - day_item_fork(day_get_item(ui_day_hilt()), &day_cut[reg]); + day_item_fork(item, &day_cut[reg]); } /* Paste a previously cut item. */ -void ui_day_item_paste(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) +void ui_day_item_paste(unsigned reg) { - int item_type; struct day_item day; if (reg == REG_BLACK_HOLE || !day_cut[reg].type) return; day_item_fork(&day_cut[reg], &day); - item_type = day_paste_item(&day, ui_calendar_get_slctd_day_sec()); + day_paste_item(&day, ui_calendar_get_slctd_day_sec()); ui_calendar_monthly_view_cache_set_invalid(); +} - if (item_type == EVNT || item_type == RECUR_EVNT) - (*nb_events)++; - else if (item_type == APPT || item_type == RECUR_APPT) - (*nb_apoints)++; - else - return; +void ui_day_load_items(void) +{ + listbox_load_items(&lb_apt, day_item_count()); +} - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); +void ui_day_sel_reset(void) +{ + listbox_set_sel(&lb_apt, 0); } -/* Sets which appointment is highlighted. */ -void ui_day_hilt_set(int highlighted) +void ui_day_sel_move(int delta) { - hilt = highlighted; + listbox_sel_move(&lb_apt, delta); } -void ui_day_hilt_decrease(int n) +/* Display appointments in the corresponding panel. */ +void ui_day_draw(int n, WINDOW *win, int y, int hilt, void *cb_data) { - hilt -= n; + struct date slctd_date = *ui_calendar_get_slctd_day(); + long date = date2sec(slctd_date, 0, 0); + struct day_item *item = day_get_item(n); + int width = lb_apt.sw.w; + + if (item->type < RECUR_APPT) { + day_display_item(item, win, !hilt, width, y, 1); + } else { + day_display_item_date(item, win, !hilt, date, y + 1, 1); + day_display_item(item, win, !hilt, width, y + 2, 1); + } + } -void ui_day_hilt_increase(int n) +int ui_day_height(int n, void *cb_data) { - hilt += n; + struct day_item *item = day_get_item(n); + + if (item->type < RECUR_APPT) + return 1; + else + return 3; } -/* Return which appointment is highlighted. */ -int ui_day_hilt(void) +/* Updates the Appointment panel */ +void ui_day_update_panel(int which_pan) { - return hilt; + listbox_display(&lb_apt); } -/* - * Return the line number of an item (either an appointment or an event) in - * the appointment panel. This is to help the appointment scroll function - * to place beggining of the pad correctly. - */ -static int get_item_line(int item_nb, int nb_events_inday) +void ui_day_popup_item(void) { - int separator = 2; - int line = 0; + if (day_item_count() <= 0) + return; - if (item_nb <= nb_events_inday) - line = item_nb - 1; - else - line = nb_events_inday + separator - + (item_nb - (nb_events_inday + 1)) * 3 - 1; - return line; + struct day_item *item = day_get_item(listbox_get_sel(&lb_apt)); + day_popup_item(item); } -/* - * Update (if necessary) the first displayed pad line to make the - * appointment panel scroll down next time pnoutrefresh is called. - */ -void ui_day_scroll_pad_down(int nb_events_inday, int win_length) +void ui_day_flag(void) { - int pad_last_line = 0; - int item_first_line = 0, item_last_line = 0; - int borders = 6; - int awin_length = win_length - borders; - - item_first_line = get_item_line(hilt, nb_events_inday); - if (hilt < nb_events_inday) - item_last_line = item_first_line; - else - item_last_line = item_first_line + 1; - pad_last_line = apad.first_onscreen + awin_length; - if (item_last_line >= pad_last_line) - apad.first_onscreen = item_last_line - awin_length; + if (day_item_count() <= 0) + return; + + struct day_item *item = day_get_item(listbox_get_sel(&lb_apt)); + day_item_switch_notify(item); } -/* - * Update (if necessary) the first displayed pad line to make the - * appointment panel scroll up next time pnoutrefresh is called. - */ -void ui_day_scroll_pad_up(int nb_events_inday) +void ui_day_view_note(void) { - int item_first_line = 0; + if (day_item_count() <= 0) + return; - item_first_line = get_item_line(hilt, nb_events_inday); - if (item_first_line < apad.first_onscreen) - apad.first_onscreen = item_first_line; + struct day_item *item = day_get_item(listbox_get_sel(&lb_apt)); + day_view_note(item, conf.pager); } -/* Updates the Appointment panel */ -void ui_day_update_panel(int which_pan, struct date slctd_date) +void ui_day_edit_note(void) { - int title_xpos; - int bordr = 1; - int title_lines = conf.compact_panels ? 1 : 3; - int app_width = win[APP].w - bordr; - int app_length = win[APP].h - bordr - title_lines; - long date; - - /* variable inits */ - title_xpos = - win[APP].w - (strlen(_(monthnames[slctd_date.mm - 1])) + 16); - if (slctd_date.dd < 10) - title_xpos++; - date = date2sec(slctd_date, 0, 0); - day_write_pad(date, app_width, app_length, - (which_pan == APP) ? hilt : 0); - - /* Print current date in the top right window corner. */ - erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, - win[APP].h - 2); - custom_apply_attr(win[APP].p, ATTR_HIGHEST); - mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d", - ui_calendar_get_pom(date), - _(monthnames[slctd_date.mm - 1]), slctd_date.dd, - slctd_date.yyyy); - custom_remove_attr(win[APP].p, ATTR_HIGHEST); - - /* Draw the scrollbar if necessary. */ - if ((apad.length >= app_length) || (apad.first_onscreen > 0)) { - int sbar_length = app_length * app_length / apad.length; - int highend = - app_length * apad.first_onscreen / apad.length; - unsigned hilt_bar = (which_pan == APP) ? 1 : 0; - int sbar_top = highend + title_lines + 1; - - if ((sbar_top + sbar_length) > win[APP].h - 1) - sbar_length = win[APP].h - 1 - sbar_top; - draw_scrollbar(win[APP].p, sbar_top, win[APP].w - 2, - sbar_length, title_lines + 1, - win[APP].h - 1, hilt_bar); - } + if (day_item_count() <= 0) + return; - wnoutrefresh(win[APP].p); - pnoutrefresh(apad.ptrwin, apad.first_onscreen, 0, - win[APP].y + title_lines + 1, win[APP].x + bordr, - win[APP].y + win[APP].h - 2 * bordr, - win[APP].x + win[APP].w - 3 * bordr); + struct day_item *item = day_get_item(listbox_get_sel(&lb_apt)); + day_edit_note(item, conf.editor); } @@ -51,6 +51,7 @@ /* Variables to handle calcurse windows. */ struct window win[NBWINS]; struct scrollwin sw_cal; +struct listbox lb_apt; struct listbox lb_todo; /* User-configurable side bar width. */ @@ -248,18 +249,13 @@ static void wins_init_panels(void) CALHEIGHT + (conf.compact_panels ? 2 : 4), wins_sbar_width(), _("Calendar")); - win[APP].p = - newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); - wins_show(win[APP].p, _("Appointments")); - apad.width = win[APP].w - 3; - apad.ptrwin = newpad(apad.length, apad.width); + listbox_init(&lb_apt, win[APP].y, win[APP].x, win[APP].h, win[APP].w, + _("Appointments"), ui_day_height, ui_day_draw); + ui_day_load_items(); listbox_init(&lb_todo, win[TOD].y, win[TOD].x, win[TOD].h, win[TOD].w, _("TODO"), ui_todo_height, ui_todo_draw); ui_todo_load_items(); - - /* Enable function keys (i.e. arrow keys) in those windows */ - keypad(win[APP].p, TRUE); } /* Create all the windows. */ @@ -401,8 +397,7 @@ void wins_scrollwin_ensure_visible(struct scrollwin *sw, unsigned line) void wins_reinit_panels(void) { wins_scrollwin_delete(&sw_cal); - delwin(win[APP].p); - delwin(apad.ptrwin); + listbox_delete(&lb_apt); listbox_delete(&lb_todo); wins_get_config(); wins_init_panels(); @@ -415,8 +410,7 @@ void wins_reinit_panels(void) void wins_reinit(void) { wins_scrollwin_delete(&sw_cal); - delwin(win[APP].p); - delwin(apad.ptrwin); + listbox_delete(&lb_apt); listbox_delete(&lb_todo); delwin(win[STA].p); delwin(win[KEY].p); @@ -547,12 +541,8 @@ void wins_update_border(int flags) wins_scrollwin_draw_deco(&sw_cal, (slctd_win == CAL)); WINS_CALENDAR_UNLOCK; } - if (flags & FLAG_APP) { - if (slctd_win == APP) - border_color(win[APP].p); - else - border_nocolor(win[APP].p); - } + if (flags & FLAG_APP) + listbox_draw_deco(&lb_apt, (slctd_win == APP)); if (flags & FLAG_TOD) listbox_draw_deco(&lb_todo, (slctd_win == TOD)); } @@ -560,7 +550,7 @@ void wins_update_border(int flags) void wins_update_panels(int flags) { if (flags & FLAG_APP) - ui_day_update_panel(slctd_win, *ui_calendar_get_slctd_day()); + ui_day_update_panel(slctd_win); if (flags & FLAG_TOD) ui_todo_update_panel(slctd_win); if (flags & FLAG_CAL) |