diff options
author | Lukas Fleischer <lfleischer@calcurse.org> | 2016-09-30 18:21:59 +0200 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2016-10-08 14:42:51 +0200 |
commit | 1f39b5c6681536ef833a2e2e1312f2747be728f3 (patch) | |
tree | 26a77922ee9a1eb73c88e6448dccc435fef8116e /src | |
parent | 1003be18dfbf05d0748214711ae8723bceb374c7 (diff) | |
download | calcurse-1f39b5c6681536ef833a2e2e1312f2747be728f3.tar.gz calcurse-1f39b5c6681536ef833a2e2e1312f2747be728f3.zip |
Add support for moving items to another day
When moving an item (or when changing the start time of an item), allow
for optionally specifying a date. If both date and time are entered, the
item is updated to start on the given date and time. If only a date is
entered, the item is modified to start on the given date, keeping the
current start time. If only a time is entered, the item is modified to
start on the current date and the new start time.
Fixes GitHub issue #12.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/ui-day.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/ui-day.c b/src/ui-day.c index c094031..b651ca5 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -61,26 +61,42 @@ void ui_day_set_selitem(struct day_item *day) /* Request the user to enter a new time. */ static int day_edit_time(int time) { - char *timestr = date_sec2date_str(time, "%H:%M"); + char *input = date_sec2date_str(time, "%H:%M"); const char *msg_time = - _("Enter start time ([hh:mm] or [hhmm]):"); + _("Enter start time ([hh:mm] or [hhmm]) or date:"); const char *enter_str = _("Press [Enter] to continue"); const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - int hour, minute; + unsigned int hour, minute; + int year, month, day; + struct date new_date; for (;;) { status_mesg(msg_time, ""); - if (updatestring(win[STA].p, ×tr, 0, 1) != - GETSTRING_VALID) + if (updatestring(win[STA].p, &input, 0, 1) != GETSTRING_VALID) return 0; - if (parse_time(timestr, &hour, &minute) == 1) { - mem_free(timestr); - return update_time_in_date(time, hour, minute); - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); + char *inputcpy = mem_strdup(input); + char *p = strtok(inputcpy, " "); + while (p) { + if (parse_date(p, conf.input_datefmt, &year, &month, + &day, ui_calendar_get_slctd_day())) { + new_date.dd = day; + new_date.mm = month; + new_date.yyyy = year; + time = date2sec(new_date, 0, 0) + + get_item_time(time); + } else if (parse_time(p, &hour, &minute) == 1) { + time = update_time_in_date(time, hour, minute); + } else { + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); + break; + } + p = strtok(NULL, " "); } + mem_free(inputcpy); + if (!p) + return time; } } |