Merge cut/delete

Remove the cut function and merge it into the del-item command. This
allows for vim-style cutting/pasting.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer
2012-07-07 19:14:33 +02:00
parent 88588ad704
commit 13c21ac280
6 changed files with 85 additions and 160 deletions

View File

@@ -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();
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);
}
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;
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)