summaryrefslogtreecommitdiff
path: root/src/interaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interaction.c')
-rw-r--r--src/interaction.c193
1 files changed, 69 insertions, 124 deletions
diff --git a/src/interaction.c b/src/interaction.c
index d61ea4e..0a3b743 100644
--- a/src/interaction.c
+++ b/src/interaction.c
@@ -36,7 +36,7 @@
#include "calcurse.h"
-struct day_item day_cut[37] = { { 0, 0, { NULL } } };
+struct day_item day_cut[38] = { { 0, 0, { NULL } } };
/* Request the user to enter a new time. */
static int day_edit_time(int time, unsigned *new_hour, unsigned *new_minute)
@@ -364,68 +364,6 @@ void interact_day_item_edit(void)
notify_check_next_app(1);
}
-/*
- * In order to erase an item, we need to count first the number of
- * items for each type (in order: recurrent events, events,
- * recurrent appointments and appointments) and then to test the
- * type of the item to be deleted.
- */
-static int day_erase_item(long date, int item_number, enum eraseflg flag)
-{
- struct day_item *p;
-
- const char *erase_warning =
- _("This item is recurrent. "
- "Delete (a)ll occurences or just this (o)ne ?");
- const char *erase_choices = _("[ao]");
- const int nb_erase_choices = 2;
-
- const char *note_warning =
- _("This item has a note attached to it. "
- "Delete (i)tem or just its (n)ote ?");
- const char *note_choices = _("[in]");
- const int nb_note_choices = 2;
-
- p = day_get_item(item_number);
- if (flag == ERASE_DONT_FORCE && day_item_get_note(p)) {
- switch (status_ask_choice(note_warning, note_choices, nb_note_choices)) {
- case 1:
- break;
- case 2:
- day_item_erase_note(p);
- return 0;
- default: /* User escaped */
- return 0;
- }
- }
-
- flag = ERASE_FORCE;
-
- if (p->type == EVNT) {
- event_delete(p->item.ev, flag);
- } else if (p->type == APPT) {
- apoint_delete(p->item.apt, flag);
- } else {
- switch (status_ask_choice(erase_warning, erase_choices, nb_erase_choices)) {
- case 1:
- break;
- case 2:
- day_item_add_exc(p, date);
- return 0;
- default:
- return 0;
- }
-
- if (p->type == RECUR_EVNT) {
- recur_event_erase(p->item.rev, flag);
- } else {
- recur_apoint_erase(p->item.rapt, flag);
- }
- }
-
- return p->type;
-}
-
/* Pipe an appointment or event to an external program. */
void interact_day_item_pipe(void)
{
@@ -567,18 +505,32 @@ void interact_day_item_add(void)
}
/* Delete an item from the appointment list. */
-void interact_day_item_delete(unsigned *nb_events, unsigned *nb_apoints)
+void interact_day_item_delete(unsigned *nb_events, unsigned *nb_apoints,
+ unsigned reg)
{
const char *del_app_str = _("Do you really want to delete this item ?");
- long date;
+
+ const char *erase_warning =
+ _("This item is recurrent. "
+ "Delete (a)ll occurences or just this (o)ne ?");
+ const char *erase_choices = _("[ao]");
+ const int nb_erase_choices = 2;
+
+ const char *note_warning =
+ _("This item has a note attached to it. "
+ "Delete (i)tem or just its (n)ote ?");
+ const char *note_choices = _("[in]");
+ const int nb_note_choices = 2;
+
+ long date = calendar_get_slctd_day_sec();
int nb_items = *nb_apoints + *nb_events;
int to_be_removed = 0;
- date = calendar_get_slctd_day_sec();
-
if (nb_items == 0)
return;
+ struct day_item *p = day_get_item(apoint_hilt());
+
if (conf.confirm_delete) {
if (status_ask_bool(del_app_str) != 1) {
wins_erase_status_bar();
@@ -586,34 +538,59 @@ void interact_day_item_delete(unsigned *nb_events, unsigned *nb_apoints)
}
}
- if (nb_items != 0) {
- switch (day_erase_item(date, apoint_hilt(), ERASE_DONT_FORCE)) {
- case EVNT:
- case RECUR_EVNT:
- (*nb_events)--;
- to_be_removed = 1;
+ if (day_item_get_note(p)) {
+ switch (status_ask_choice(note_warning, note_choices, nb_note_choices)) {
+ case 1:
break;
- case APPT:
- case RECUR_APPT:
- (*nb_apoints)--;
- to_be_removed = 3;
+ case 2:
+ day_item_erase_note(p);
+ return;
+ default: /* User escaped */
+ return;
+ }
+ }
+
+ if (p->type == RECUR_EVNT || p->type == RECUR_APPT) {
+ switch (status_ask_choice(erase_warning, erase_choices, nb_erase_choices)) {
+ case 1:
break;
- case 0:
+ case 2:
+ day_item_add_exc(p, date);
return;
default:
- EXIT(_("no such type"));
- /* NOTREACHED */
+ return;
}
+ }
- calendar_monthly_view_cache_set_invalid();
+ interact_day_item_cut_free(reg);
+ p = day_cut_item(date, apoint_hilt());
+ day_cut[reg].type = p->type;
+ day_cut[reg].item = p->item;
- if (apoint_hilt() > 1)
- apoint_hilt_decrease(1);
- if (apad.first_onscreen >= to_be_removed)
- apad.first_onscreen = apad.first_onscreen - to_be_removed;
- if (nb_items == 1)
- apoint_hilt_set(0);
+ 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 */
}
+
+ calendar_monthly_view_cache_set_invalid();
+
+ if (apoint_hilt() > 1)
+ apoint_hilt_decrease(1);
+ if (apad.first_onscreen >= to_be_removed)
+ apad.first_onscreen = apad.first_onscreen - to_be_removed;
+ if (nb_items == 1)
+ apoint_hilt_set(0);
}
/* Request user to enter a new todo item. */
@@ -851,7 +828,11 @@ void interact_day_item_repeat(void)
EXIT(_("wrong item type"));
/* NOTREACHED */
}
- day_erase_item(date, item_nb, ERASE_FORCE);
+
+ interact_day_item_cut_free(REG_BLACK_HOLE);
+ p = day_cut_item(date, item_nb);
+ day_cut[REG_BLACK_HOLE].type = p->type;
+ day_cut[REG_BLACK_HOLE].item = p->item;
calendar_monthly_view_cache_set_invalid();
}
@@ -878,42 +859,6 @@ void interact_day_item_cut_free(unsigned reg)
}
}
-/* Cut an item, so that it can be pasted somewhere else later. */
-void interact_day_item_cut(unsigned *nb_events, unsigned *nb_apoints,
- unsigned reg)
-{
- const int NBITEMS = *nb_apoints + *nb_events;
- int to_be_removed;
-
- if (NBITEMS == 0)
- return;
-
- interact_day_item_cut_free(reg);
- struct day_item *p = day_cut_item(calendar_get_slctd_day_sec(),
- apoint_hilt());
- day_cut[reg].type = p->type;
- day_cut[reg].item = p->item;
-
- calendar_monthly_view_cache_set_invalid();
-
- if (p->type == EVNT || p->type == RECUR_EVNT) {
- (*nb_events)--;
- to_be_removed = 1;
- } else if (p->type == APPT || p->type == RECUR_APPT) {
- (*nb_apoints)--;
- to_be_removed = 3;
- } else
- EXIT(_("no such type"));
- /* NOTREACHED */
-
- if (apoint_hilt() > 1)
- apoint_hilt_decrease(1);
- if (apad.first_onscreen >= to_be_removed)
- apad.first_onscreen = apad.first_onscreen - to_be_removed;
- if (NBITEMS == 1)
- apoint_hilt_set(0);
-}
-
/* Copy an item, so that it can be pasted somewhere else later. */
void interact_day_item_copy(unsigned *nb_events, unsigned *nb_apoints,
unsigned reg)