From d56cc7acfe85119b70f7aac8dfd13ba41ec119e3 Mon Sep 17 00:00:00 2001 From: Lars Henriksen Date: Sat, 19 Aug 2017 10:23:52 +0200 Subject: Make heading in appointments panel configurable Add a new configuration variable format.dayheading to set the format of the date displayed at the top of the event and appointment list. Signed-off-by: Lars Henriksen Signed-off-by: Lukas Fleischer --- src/calcurse.h | 4 ++++ src/config.c | 1 + src/custom.c | 20 +++++++++++++++++++- src/ui-day.c | 21 +++++++++++++++------ src/vars.c | 1 + 5 files changed, 40 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/calcurse.h b/src/calcurse.h index 4ddb066..392e93e 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -264,6 +264,7 @@ struct conf { const char *mergetool; char output_datefmt[BUFSIZ]; /* format for displaying date */ int input_datefmt; /* format for reading date */ + char day_heading[BUFSIZ]; /* format for displaying heading in appts panel */ }; /* Daemon-related configuration. */ @@ -291,6 +292,9 @@ enum datefmt { _("mm/dd/yyyy") : (datefmt == DATEFMT_DDMMYYYY ? _("dd/mm/yyyy") : \ (datefmt == DATEFMT_YYYYMMDD ? _("yyyy/mm/dd") : _("yyyy-mm-dd")))) +/* Day heading default format. */ +#define DAY_HEADING_DEFAULT "%B %-d, %Y" + struct date { unsigned dd; unsigned mm; diff --git a/src/config.c b/src/config.c index 3f073f3..896b192 100644 --- a/src/config.c +++ b/src/config.c @@ -102,6 +102,7 @@ static const struct confvar confmap[] = { {"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)}, {"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)}, {"format.outputdate", config_parse_output_datefmt, config_serialize_output_datefmt, NULL}, + {"format.dayheading", CONFIG_HANDLER_STR(conf.day_heading)}, {"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)}, {"general.autosave", CONFIG_HANDLER_BOOL(conf.auto_save)}, {"general.confirmdelete", CONFIG_HANDLER_BOOL(conf.confirm_delete)}, diff --git a/src/custom.c b/src/custom.c index 20311b6..fd99e25 100644 --- a/src/custom.c +++ b/src/custom.c @@ -531,6 +531,7 @@ enum { FIRST_DAY_OF_WEEK, OUTPUT_DATE_FMT, INPUT_DATE_FMT, + DAY_HEADING_FMT, NB_OPTIONS }; @@ -550,7 +551,8 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d "general.progressbar = ", "general.firstdayofweek = ", "format.outputdate = ", - "format.inputdate = " + "format.inputdate = ", + "format.dayheading = " }; const char *panel; @@ -654,6 +656,14 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d datefmt_str[0], datefmt_str[1], datefmt_str[2], datefmt_str[3]); break; + case DAY_HEADING_FMT: + custom_apply_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y, XPOS + strlen(opt[DAY_HEADING_FMT]), + conf.day_heading); + custom_remove_attr(win, ATTR_HIGHEST); + mvwaddstr(win, y + 1, XPOS, + _("(Format of the date displayed in the appointments panel)")); + break; } if (hilt) @@ -752,6 +762,14 @@ static void general_option_edit(int i) if (val != -1) conf.input_datefmt = val; break; + case DAY_HEADING_FMT: + status_mesg(output_datefmt_str, ""); + strcpy(buf, conf.day_heading); + if (updatestring(win[STA].p, &buf, 0, 1) == 0) { + strcpy(conf.day_heading, buf); + } + status_mesg(number_str, keys); + break; } mem_free(buf); diff --git a/src/ui-day.c b/src/ui-day.c index 24717dc..ab588fd 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -909,6 +909,17 @@ void ui_day_sel_move(int delta) listbox_sel_move(&lb_apt, delta); } +static char *fmt_day_heading(time_t date) +{ + struct tm tm; + struct string s; + + localtime_r(&date, &tm); + string_printf(&s, "%s ", ui_calendar_get_pom(date)); + string_catftime(&s, conf.day_heading, &tm); + return string_buf(&s); +} + /* Display appointments in the corresponding panel. */ void ui_day_draw(int n, WINDOW *win, int y, int hilt, void *cb_data) { @@ -918,20 +929,18 @@ void ui_day_draw(int n, WINDOW *win, int y, int hilt, void *cb_data) int width = lb_apt.sw.w - 2; hilt = hilt && (wins_slctd() == APP); - if (item->type == EVNT || item->type == RECUR_EVNT) { day_display_item(item, win, !hilt, width - 1, y, 1); } else if (item->type == APPT || item->type == RECUR_APPT) { day_display_item_date(item, win, !hilt, date, y, 1); day_display_item(item, win, !hilt, width - 1, y + 1, 1); } else if (item->type == DAY_HEADING) { - unsigned x = width - (strlen(_(monthnames[slctd_date.mm - 1])) + 15); + char *buf = fmt_day_heading(date); + utf8_chop(buf, width); custom_apply_attr(win, ATTR_HIGHEST); - mvwprintw(win, y, x, "%s %s %02d, %04d", - ui_calendar_get_pom(date), - _(monthnames[slctd_date.mm - 1]), slctd_date.dd, - slctd_date.yyyy); + mvwprintw(win, y, width - utf8_strwidth(buf) - 1, "%s", buf); custom_remove_attr(win, ATTR_HIGHEST); + mem_free(buf); } else if (item->type == DAY_SEPARATOR) { wmove(win, y, 0); whline(win, 0, width); diff --git a/src/vars.c b/src/vars.c index 5a1fcd6..d236805 100644 --- a/src/vars.c +++ b/src/vars.c @@ -147,6 +147,7 @@ void vars_init(void) conf.progress_bar = 1; strncpy(conf.output_datefmt, "%D", 3); conf.input_datefmt = 1; + strcpy(conf.day_heading, DAY_HEADING_DEFAULT); datefmt_str[0] = _("mm/dd/yyyy"); datefmt_str[1] = _("dd/mm/yyyy"); -- cgit v1.2.3-70-g09d2