From cc86516f64fefc565c5b2477b4696085a297e5a0 Mon Sep 17 00:00:00 2001
From: Lars Henriksen <LarsHenriksen@get2net.dk>
Date: Mon, 10 Jun 2019 21:48:16 +0200
Subject: Treat recurrence item parameters as a unit

An edit session, and in particular, a cancelled edit session should encompass
all parameters.

Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 src/calcurse.h |  2 +-
 src/recur.c    |  5 ++++-
 src/ui-day.c   | 59 +++++++++++++++++++++++++++++++++++++---------------------
 3 files changed, 43 insertions(+), 23 deletions(-)

(limited to 'src')

diff --git a/src/calcurse.h b/src/calcurse.h
index d32c534..98b1f71 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1022,7 +1022,7 @@ void pcal_export_data(FILE *);
 /* recur.c */
 extern llist_ts_t recur_alist_p;
 extern llist_t recur_elist;
-void recur_update_exc(llist_t *, char *);
+int recur_update_exc(llist_t *, char *);
 char *recur_exc2str(llist_t *);
 struct recur_event *recur_event_dup(struct recur_event *);
 struct recur_apoint *recur_apoint_dup(struct recur_apoint *);
diff --git a/src/recur.c b/src/recur.c
index 46f669d..fc1d538 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -106,8 +106,9 @@ char *recur_exc2str(llist_t *exc)
  * Update the list of exceptions from a string of days. Any positive number of
  * spaces are allowed before, between and after the days.
  */
-void recur_update_exc(llist_t *exc, char *days)
+int recur_update_exc(llist_t *exc, char *days)
 {
+	int updated = 0;
 	char *d;
 	time_t t = get_today();
 	llist_t nexc;
@@ -131,8 +132,10 @@ void recur_update_exc(llist_t *exc, char *days)
 	}
 	free_exc_list(exc);
 	exc_dup(exc, &nexc);
+	updated = 1;
 cleanup:
 	free_exc_list(&nexc);
+	return updated;
 }
 
 struct recur_event *recur_event_dup(struct recur_event *in)
diff --git a/src/ui-day.c b/src/ui-day.c
index fa106c8..30e7540 100644
--- a/src/ui-day.c
+++ b/src/ui-day.c
@@ -272,7 +272,38 @@ static void update_desc(char **desc)
 	updatestring(win[STA].p, desc, 0, 1);
 }
 
-static void update_rept(struct rpt **rpt, const long start)
+/* Edit the list of exception days for a recurrent item. */
+static int update_exc(llist_t *exc)
+{
+	int updated = 0;
+
+	if (!exc->head)
+		return updated;
+	char *days;
+	enum getstr ret;
+
+	status_mesg(_("Exception days:"), "");
+	days = recur_exc2str(exc);
+	while (1) {
+		ret = updatestring(win[STA].p, &days, 0, 1);
+		if (ret == GETSTRING_VALID || ret == GETSTRING_RET) {
+			if (recur_update_exc(exc, days)) {
+				updated = 1;
+				break;
+			} else {
+				status_mesg(_("Invalid date format - try again:."), "");
+				mem_free(days);
+				days = recur_exc2str(exc);
+			}
+		} else if (ret == GETSTRING_ESC)
+			break;
+	}
+	mem_free(days);
+
+	return updated;
+}
+
+static void update_rept(struct rpt **rpt, const time_t start, llist_t *exc)
 {
 	/* Pointers to dynamically allocated memory. */
 	char *msg_rpt_current = NULL;
@@ -412,6 +443,10 @@ static void update_rept(struct rpt **rpt, const long start)
 		keys_wgetch(win[KEY].p);
 	}
 
+	/* Update exception list. */
+	if (!update_exc(exc))
+		goto cleanup;
+
 	(*rpt)->type = recur_char2def(newtype);
 	(*rpt)->freq = newfreq;
 	(*rpt)->until = newuntil;
@@ -424,22 +459,6 @@ cleanup:
 	mem_free(outstr);
 }
 
-/* Edit the list of exception days for a recurrent item. */
-static void update_exc(llist_t *exc)
-{
-	if (!exc->head)
-		return;
-	char *days;
-	enum getstr ret;
-
-	status_mesg(_("Exception days:"), "");
-	days = recur_exc2str(exc);
-	ret = updatestring(win[STA].p, &days, 0, 1);
-	if (ret == GETSTRING_VALID || ret == GETSTRING_RET)
-		recur_update_exc(exc, days);
-	mem_free(days);
-}
-
 /* Edit an already existing item. */
 void ui_day_item_edit(void)
 {
@@ -468,8 +487,7 @@ void ui_day_item_edit(void)
 			io_set_modified();
 			break;
 		case 2:
-			update_rept(&re->rpt, re->day);
-			update_exc(&re->exc);
+			update_rept(&re->rpt, re->day, &re->exc);
 			io_set_modified();
 			break;
 		default:
@@ -510,8 +528,7 @@ void ui_day_item_edit(void)
 			break;
 		case 4:
 			need_check_notify = 1;
-			update_rept(&ra->rpt, ra->start);
-			update_exc(&ra->exc);
+			update_rept(&ra->rpt, ra->start, &ra->exc);
 			io_set_modified();
 			break;
 		case 5:
-- 
cgit v1.2.3-70-g09d2