ui-calendar: Use scroll window implementation

Make use of the generic scroll window implementation for the calendar
view. Note that this is useful despite the panel not needing a scroll
bar, since the scroll window functions can be used to draw the panel
border and take care of relative positions.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2014-05-15 21:49:32 +02:00
parent 655218b7df
commit cf1565648b
4 changed files with 60 additions and 66 deletions

View File

@ -667,7 +667,7 @@ void ui_calendar_init_slctd_day(void);
struct date *ui_calendar_get_slctd_day(void); struct date *ui_calendar_get_slctd_day(void);
long ui_calendar_get_slctd_day_sec(void); long ui_calendar_get_slctd_day_sec(void);
void ui_calendar_monthly_view_cache_set_invalid(void); void ui_calendar_monthly_view_cache_set_invalid(void);
void ui_calendar_update_panel(struct window *); void ui_calendar_update_panel(void);
void ui_calendar_goto_today(void); void ui_calendar_goto_today(void);
void ui_calendar_change_day(int); void ui_calendar_change_day(int);
void ui_calendar_move(enum move, int); void ui_calendar_move(enum move, int);
@ -1056,6 +1056,7 @@ void vars_init(void);
/* wins.c */ /* wins.c */
extern struct window win[NBWINS]; extern struct window win[NBWINS];
extern struct scrollwin sw_cal;
extern struct listbox lb_todo; extern struct listbox lb_todo;
unsigned wins_nbar_lock(void); unsigned wins_nbar_lock(void);
void wins_nbar_unlock(void); void wins_nbar_unlock(void);

View File

@ -71,9 +71,9 @@ static unsigned ui_calendar_view, week_begins_on_monday;
static pthread_mutex_t date_thread_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t date_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_t ui_calendar_t_date; static pthread_t ui_calendar_t_date;
static void draw_monthly_view(struct window *, struct date *, unsigned); static void draw_monthly_view(struct scrollwin *, struct date *, unsigned);
static void draw_weekly_view(struct window *, struct date *, unsigned); static void draw_weekly_view(struct scrollwin *, struct date *, unsigned);
static void (*draw_calendar[CAL_VIEWS]) (struct window *, struct date *, static void (*draw_calendar[CAL_VIEWS]) (struct scrollwin *, struct date *,
unsigned) = { unsigned) = {
draw_monthly_view, draw_weekly_view}; draw_monthly_view, draw_weekly_view};
@ -120,7 +120,7 @@ static void *ui_calendar_date_thread(void *arg)
sleep(tomorrow - actual); sleep(tomorrow - actual);
ui_calendar_set_current_date(); ui_calendar_set_current_date();
ui_calendar_update_panel(&win[CAL]); ui_calendar_update_panel();
} }
return NULL; return NULL;
@ -277,14 +277,13 @@ void ui_calendar_monthly_view_cache_set_invalid(void)
/* Draw the monthly view inside calendar panel. */ /* Draw the monthly view inside calendar panel. */
static void static void
draw_monthly_view(struct window *cwin, struct date *current_day, draw_monthly_view(struct scrollwin *sw, struct date *current_day,
unsigned sunday_first) unsigned sunday_first)
{ {
const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1);
struct date check_day; struct date check_day;
int c_day, c_day_1, day_1_sav, numdays, j; int c_day, c_day_1, day_1_sav, numdays, j;
unsigned yr, mo; unsigned yr, mo;
int OFFX, SBAR_WIDTH, ofs_x, ofs_y; int OFFY, OFFX, SBAR_WIDTH, ofs_x, ofs_y;
int item_this_day = 0; int item_this_day = 0;
mo = slctd_day.mm; mo = slctd_day.mm;
@ -292,6 +291,7 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
/* offset for centering calendar in window */ /* offset for centering calendar in window */
SBAR_WIDTH = wins_sbar_width(); SBAR_WIDTH = wins_sbar_width();
OFFY = 0;
OFFX = (SBAR_WIDTH - 27) / 2; OFFX = (SBAR_WIDTH - 27) / 2;
ofs_y = OFFY; ofs_y = OFFY;
ofs_x = OFFX; ofs_x = OFFX;
@ -311,20 +311,20 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
/* Write the current month and year on top of the calendar */ /* Write the current month and year on top of the calendar */
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwprintw(cwin->p, ofs_y, mvwprintw(sw->inner, ofs_y,
(SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2, (SBAR_WIDTH - (strlen(_(monthnames[mo - 1])) + 5)) / 2,
"%s %d", _(monthnames[mo - 1]), slctd_day.yyyy); "%s %d", _(monthnames[mo - 1]), slctd_day.yyyy);
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
++ofs_y; ++ofs_y;
/* print the days, with regards to the first day of the week */ /* print the days, with regards to the first day of the week */
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
for (j = 0; j < WEEKINDAYS; j++) { for (j = 0; j < WEEKINDAYS; j++) {
mvwaddstr(cwin->p, ofs_y, ofs_x + 4 * j, mvwaddstr(sw->inner, ofs_y, ofs_x + 4 * j,
_(daynames[1 + j - sunday_first])); _(daynames[1 + j - sunday_first]));
} }
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7; day_1_sav = (c_day_1 + 1) * 3 + c_day_1 - 7;
@ -360,27 +360,27 @@ draw_monthly_view(struct window *cwin, struct date *current_day,
&& current_day->yyyy == slctd_day.yyyy && current_day->yyyy == slctd_day.yyyy
&& current_day->dd != slctd_day.dd) { && current_day->dd != slctd_day.dd) {
/* This is today, so print it in yellow. */ /* This is today, so print it in yellow. */
custom_apply_attr(cwin->p, ATTR_LOWEST); custom_apply_attr(sw->inner, ATTR_LOWEST);
mvwprintw(cwin->p, ofs_y + 1, mvwprintw(sw->inner, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
c_day); c_day);
custom_remove_attr(cwin->p, ATTR_LOWEST); custom_remove_attr(sw->inner, ATTR_LOWEST);
} else if (c_day == slctd_day.dd) { } else if (c_day == slctd_day.dd) {
/* This is the selected day, print it according to user's theme. */ /* This is the selected day, print it according to user's theme. */
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwprintw(cwin->p, ofs_y + 1, mvwprintw(sw->inner, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
c_day); c_day);
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
} else if (item_this_day) { } else if (item_this_day) {
custom_apply_attr(cwin->p, ATTR_LOW); custom_apply_attr(sw->inner, ATTR_LOW);
mvwprintw(cwin->p, ofs_y + 1, mvwprintw(sw->inner, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
c_day); c_day);
custom_remove_attr(cwin->p, ATTR_LOW); custom_remove_attr(sw->inner, ATTR_LOW);
} else { } else {
/* otherwise, print normal days in black */ /* otherwise, print normal days in black */
mvwprintw(cwin->p, ofs_y + 1, mvwprintw(sw->inner, ofs_y + 1,
ofs_x + day_1_sav + 4 * c_day + 1, "%2d", ofs_x + day_1_sav + 4 * c_day + 1, "%2d",
c_day); c_day);
} }
@ -465,15 +465,15 @@ static int ISO8601weeknum(const struct tm *t)
/* Draw the weekly view inside calendar panel. */ /* Draw the weekly view inside calendar panel. */
static void static void
draw_weekly_view(struct window *cwin, struct date *current_day, draw_weekly_view(struct scrollwin *sw, struct date *current_day,
unsigned sunday_first) unsigned sunday_first)
{ {
#define DAYSLICESNO 6 #define DAYSLICESNO 6
const int WCALWIDTH = 30; const int WCALWIDTH = 30;
const int OFFY = CALHEIGHT / 2 - (conf.compact_panels ? 3 : 1);
struct tm t; struct tm t;
int OFFX, j, c_wday, days_to_remove, weeknum; int OFFY, OFFX, j, c_wday, days_to_remove, weeknum;
OFFY = 0;
OFFX = (wins_sbar_width() - WCALWIDTH) / 2 + 1; OFFX = (wins_sbar_width() - WCALWIDTH) / 2 + 1;
/* Fill in a tm structure with the first day of the selected week. */ /* Fill in a tm structure with the first day of the selected week. */
@ -493,10 +493,10 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
/* Print the week number. */ /* Print the week number. */
weeknum = ISO8601weeknum(&t); weeknum = ISO8601weeknum(&t);
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwprintw(cwin->p, conf.compact_panels ? 0 : 2, cwin->w - 9, mvwprintw(sw->win, conf.compact_panels ? 0 : 2, sw->w - 9,
"(# %02d)", weeknum); "(# %02d)", weeknum);
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
/* Now draw calendar view. */ /* Now draw calendar view. */
@ -506,10 +506,10 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
int i, slices[DAYSLICESNO]; int i, slices[DAYSLICESNO];
/* print the day names, with regards to the first day of the week */ /* print the day names, with regards to the first day of the week */
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwaddstr(cwin->p, OFFY, OFFX + 4 * j, mvwaddstr(sw->inner, OFFY, OFFX + 4 * j,
_(daynames[1 + j - sunday_first])); _(daynames[1 + j - sunday_first]));
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
/* Check if the day to be printed has an item or not. */ /* Check if the day to be printed has an item or not. */
date.dd = t.tm_mday; date.dd = t.tm_mday;
@ -532,11 +532,11 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
if (attr) if (attr)
custom_apply_attr(cwin->p, attr); custom_apply_attr(sw->inner, attr);
mvwprintw(cwin->p, OFFY + 1, OFFX + 1 + 4 * j, "%02d", mvwprintw(sw->inner, OFFY + 1, OFFX + 1 + 4 * j, "%02d",
t.tm_mday); t.tm_mday);
if (attr) if (attr)
custom_remove_attr(cwin->p, attr); custom_remove_attr(sw->inner, attr);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
/* Draw slices indicating appointment times. */ /* Draw slices indicating appointment times. */
@ -546,7 +546,7 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
if (j != WEEKINDAYS - 1 if (j != WEEKINDAYS - 1
&& i != DAYSLICESNO - 1) { && i != DAYSLICESNO - 1) {
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
mvwhline(cwin->p, OFFY + 2 + i, mvwhline(sw->inner, OFFY + 2 + i,
OFFX + 3 + 4 * j, ACS_S9, OFFX + 3 + 4 * j, ACS_S9,
2); 2);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
@ -559,16 +559,16 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
slctd_day.dd) ? 1 : 0; slctd_day.dd) ? 1 : 0;
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
if (highlight) if (highlight)
custom_apply_attr(cwin->p, custom_apply_attr(sw->inner,
attr); attr);
wattron(cwin->p, A_REVERSE); wattron(sw->inner, A_REVERSE);
mvwaddstr(cwin->p, OFFY + 2 + i, mvwaddstr(sw->inner, OFFY + 2 + i,
OFFX + 1 + 4 * j, " "); OFFX + 1 + 4 * j, " ");
mvwaddstr(cwin->p, OFFY + 2 + i, mvwaddstr(sw->inner, OFFY + 2 + i,
OFFX + 2 + 4 * j, " "); OFFX + 2 + 4 * j, " ");
wattroff(cwin->p, A_REVERSE); wattroff(sw->inner, A_REVERSE);
if (highlight) if (highlight)
custom_remove_attr(cwin->p, custom_remove_attr(sw->inner,
attr); attr);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
} }
@ -581,18 +581,18 @@ draw_weekly_view(struct window *cwin, struct date *current_day,
/* Draw marks to indicate midday on the sides of the calendar. */ /* Draw marks to indicate midday on the sides of the calendar. */
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
custom_apply_attr(cwin->p, ATTR_HIGHEST); custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1); mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1);
mvwhline(cwin->p, OFFY + 1 + DAYSLICESNO / 2, mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2,
OFFX + WCALWIDTH - 3, ACS_S9, 1); OFFX + WCALWIDTH - 3, ACS_S9, 1);
custom_remove_attr(cwin->p, ATTR_HIGHEST); custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
#undef DAYSLICESNO #undef DAYSLICESNO
} }
/* Function used to display the calendar panel. */ /* Function used to display the calendar panel. */
void ui_calendar_update_panel(struct window *cwin) void ui_calendar_update_panel(void)
{ {
struct date current_day; struct date current_day;
unsigned sunday_first; unsigned sunday_first;
@ -600,17 +600,14 @@ void ui_calendar_update_panel(struct window *cwin)
ui_calendar_store_current_date(&current_day); ui_calendar_store_current_date(&current_day);
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
erase_window_part(cwin->p, 1, conf.compact_panels ? 1 : 3, werase(sw_cal.inner);
cwin->w - 2, cwin->h - 2);
if (!conf.compact_panels)
mvwhline(cwin->p, 2, 1, ACS_HLINE, cwin->w - 2);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
sunday_first = ui_calendar_week_begins_on_monday()? 0 : 1; sunday_first = ui_calendar_week_begins_on_monday()? 0 : 1;
draw_calendar[ui_calendar_view] (cwin, &current_day, sunday_first); draw_calendar[ui_calendar_view] (&sw_cal, &current_day, sunday_first);
wnoutrefresh(cwin->p); wins_scrollwin_display(&sw_cal);
} }
/* Set the selected day in calendar to current day. */ /* Set the selected day in calendar to current day. */

View File

@ -53,7 +53,6 @@ void ui_todo_add(void)
ch = wgetch(win[KEY].p); ch = wgetch(win[KEY].p);
} }
todo_add(todo_input, ch - '0', NULL); todo_add(todo_input, ch - '0', NULL);
ui_todo_sel_move(1);
ui_todo_load_items(); ui_todo_load_items();
} }
} }

View File

@ -50,6 +50,7 @@
/* Variables to handle calcurse windows. */ /* Variables to handle calcurse windows. */
struct window win[NBWINS]; struct window win[NBWINS];
struct scrollwin sw_cal;
struct listbox lb_todo; struct listbox lb_todo;
/* User-configurable side bar width. */ /* User-configurable side bar width. */
@ -243,9 +244,9 @@ void wins_slctd_next(void)
static void wins_init_panels(void) static void wins_init_panels(void)
{ {
win[CAL].p = newwin(CALHEIGHT + (conf.compact_panels ? 2 : 4), wins_scrollwin_init(&sw_cal, win[CAL].y, win[CAL].x,
wins_sbar_width(), win[CAL].y, win[CAL].x); CALHEIGHT + (conf.compact_panels ? 2 : 4),
wins_show(win[CAL].p, _("Calendar")); wins_sbar_width(), _("Calendar"));
win[APP].p = win[APP].p =
newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x); newwin(win[APP].h, win[APP].w, win[APP].y, win[APP].x);
@ -258,7 +259,6 @@ static void wins_init_panels(void)
ui_todo_load_items(); ui_todo_load_items();
/* Enable function keys (i.e. arrow keys) in those windows */ /* Enable function keys (i.e. arrow keys) in those windows */
keypad(win[CAL].p, TRUE);
keypad(win[APP].p, TRUE); keypad(win[APP].p, TRUE);
} }
@ -400,7 +400,7 @@ void wins_scrollwin_ensure_visible(struct scrollwin *sw, unsigned line)
void wins_reinit_panels(void) void wins_reinit_panels(void)
{ {
delwin(win[CAL].p); wins_scrollwin_delete(&sw_cal);
delwin(win[APP].p); delwin(win[APP].p);
delwin(apad.ptrwin); delwin(apad.ptrwin);
listbox_delete(&lb_todo); listbox_delete(&lb_todo);
@ -414,7 +414,7 @@ void wins_reinit_panels(void)
*/ */
void wins_reinit(void) void wins_reinit(void)
{ {
delwin(win[CAL].p); wins_scrollwin_delete(&sw_cal);
delwin(win[APP].p); delwin(win[APP].p);
delwin(apad.ptrwin); delwin(apad.ptrwin);
listbox_delete(&lb_todo); listbox_delete(&lb_todo);
@ -544,10 +544,7 @@ void wins_update_border(int flags)
{ {
if (flags & FLAG_CAL) { if (flags & FLAG_CAL) {
WINS_CALENDAR_LOCK; WINS_CALENDAR_LOCK;
if (slctd_win == CAL) wins_scrollwin_draw_deco(&sw_cal, (slctd_win == CAL));
border_color(win[CAL].p);
else
border_nocolor(win[CAL].p);
WINS_CALENDAR_UNLOCK; WINS_CALENDAR_UNLOCK;
} }
if (flags & FLAG_APP) { if (flags & FLAG_APP) {
@ -567,7 +564,7 @@ void wins_update_panels(int flags)
if (flags & FLAG_TOD) if (flags & FLAG_TOD)
ui_todo_update_panel(slctd_win); ui_todo_update_panel(slctd_win);
if (flags & FLAG_CAL) if (flags & FLAG_CAL)
ui_calendar_update_panel(&win[CAL]); ui_calendar_update_panel();
} }
/* /*