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

@ -275,7 +275,7 @@ int main(int argc, char **argv)
case KEY_DEL_ITEM:
if (wins_slctd() == APP && apoint_hilt() != 0) {
interact_day_item_delete(&inday.nb_events, &inday.nb_apoints);
interact_day_item_delete(&inday.nb_events, &inday.nb_apoints, reg);
inday = do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
} else if (wins_slctd() == TOD && todo_hilt() != 0) {
@ -284,14 +284,6 @@ int main(int argc, char **argv)
}
break;
case KEY_GENERIC_CUT:
if (wins_slctd() == APP && apoint_hilt() != 0) {
interact_day_item_cut(&inday.nb_events, &inday.nb_apoints, reg);
inday = do_storage(0);
wins_update(FLAG_CAL | FLAG_APP);
}
break;
case KEY_GENERIC_COPY:
if (wins_slctd() == APP && apoint_hilt() != 0) {
interact_day_item_copy(&inday.nb_events, &inday.nb_apoints, reg);

View File

@ -398,7 +398,6 @@ enum key {
KEY_GENERIC_HELP,
KEY_GENERIC_QUIT,
KEY_GENERIC_SAVE,
KEY_GENERIC_CUT,
KEY_GENERIC_COPY,
KEY_GENERIC_PASTE,
KEY_GENERIC_CHANGE_VIEW,
@ -722,12 +721,11 @@ void ical_export_data(FILE *);
/* interaction.c */
void interact_day_item_add(void);
void interact_day_item_delete(unsigned *, unsigned *);
void interact_day_item_delete(unsigned *, unsigned *, unsigned);
void interact_day_item_edit(void);
void interact_day_item_pipe(void);
void interact_day_item_repeat(void);
void interact_day_item_cut_free(unsigned);
void interact_day_item_cut(unsigned *, unsigned *, unsigned);
void interact_day_item_copy(unsigned *, unsigned *, unsigned);
void interact_day_item_paste(unsigned *, unsigned *, unsigned);
void interact_todo_add(void);

View File

@ -60,7 +60,7 @@ typedef enum {
HELP_GOTO,
HELP_DELETE,
HELP_ADD,
HELP_CUT_COPY_PASTE,
HELP_COPY_PASTE,
HELP_EDIT,
HELP_ENOTE,
HELP_VNOTE,
@ -126,7 +126,6 @@ help_write_pad(struct window *win, char *title, char *text, enum key action)
case KEY_GENERIC_NEXT_YEAR:
case KEY_GENERIC_GOTO_TODAY:
case KEY_GENERIC_CREDITS:
case KEY_GENERIC_CUT:
case KEY_GENERIC_COPY:
case KEY_GENERIC_PASTE:
break;
@ -262,10 +261,9 @@ static int wanted_page(int ch)
page = HELP_DELETE;
break;
case KEY_GENERIC_CUT:
case KEY_GENERIC_COPY:
case KEY_GENERIC_PASTE:
page = HELP_CUT_COPY_PASTE;
page = HELP_COPY_PASTE;
break;
case KEY_EDIT_ITEM:
@ -538,22 +536,17 @@ void help_screen(void)
keys_action_firstkey(KEY_ADD_ITEM),
keys_action_firstkey(KEY_ADD_ITEM));
hscr[HELP_CUT_COPY_PASTE].title = _("Cut and Paste\n");
snprintf(hscr[HELP_CUT_COPY_PASTE].text, HELPTEXTSIZ,
hscr[HELP_COPY_PASTE].title = _("Copy and Paste\n");
snprintf(hscr[HELP_COPY_PASTE].text, HELPTEXTSIZ,
_
(
"Cut/copy and paste the currently selected item. This is useful to\n"
"quickly move or copy an item from one date to another.\n"
"To do so, one must first highlight the item that needs to be moved or\n"
"copied, then press '%s' to cut (or '%s' to copy) this item. Once the\n"
"new date is chosen in the calendar, the appointment panel must be\n"
"selected and the '%s' key must be pressed to paste the item. The item\n"
"will appear again in the appointment panel, assigned to the newly\n"
"selected date.\n\n"
"Be careful that if two cuts are performed successively without pasting\n"
"between them, the item that was cut at first will be lost, together\n"
"with its associated note if it had one."),
keys_action_firstkey(KEY_GENERIC_CUT),
"Copy and paste the currently selected item. This is useful to quickly\n"
"copy an item from one date to another. To do so, one must first\n"
"highlight the item that needs to be copied, then press '%s' to copy.\n"
"Once the new date is chosen in the calendar, the appointment panel must\n"
"be selected and the '%s' key must be pressed to paste the item. The item\n"
"will appear in the appointment panel, assigned to the newly selected\n"
"date.\n\n"),
keys_action_firstkey(KEY_GENERIC_COPY),
keys_action_firstkey(KEY_GENERIC_PASTE));

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)

View File

@ -56,7 +56,6 @@ static struct keydef_s keydef[NBKEYS] = {
{"generic-help", "?"},
{"generic-quit", "q Q"},
{"generic-save", "s S C-s"},
{"generic-cut", "C-x"},
{"generic-copy", "c"},
{"generic-paste", "C-v"},
{"generic-change-view", "TAB"},
@ -461,7 +460,6 @@ void keys_popup_info(enum key key)
_("Display hints whenever some help screens are available.");
info[KEY_GENERIC_QUIT] = _("Exit from the current menu, or quit calcurse.");
info[KEY_GENERIC_SAVE] = _("Save calcurse data.");
info[KEY_GENERIC_CUT] = _("Cut the item that is currently selected.");
info[KEY_GENERIC_COPY] = _("Copy the item that is currently selected.");
info[KEY_GENERIC_PASTE] = _("Paste an item at the current position.");
info[KEY_GENERIC_CHANGE_VIEW] =

View File

@ -587,7 +587,6 @@ void wins_status_bar(void)
struct binding help = { _("Help"), KEY_GENERIC_HELP };
struct binding quit = { _("Quit"), KEY_GENERIC_QUIT };
struct binding save = { _("Save"), KEY_GENERIC_SAVE };
struct binding cut = { _("Cut"), KEY_GENERIC_CUT };
struct binding copy = { _("Copy"), KEY_GENERIC_COPY };
struct binding paste = { _("Paste"), KEY_GENERIC_PASTE };
struct binding chgvu = { _("Chg Win"), KEY_GENERIC_CHANGE_VIEW };
@ -639,7 +638,7 @@ void wins_status_bar(void)
&help, &quit, &save, &chgvu, &import, &export, &add, &del, &edit, &view,
&pipe, &draw, &rept, &flag, &enote, &vnote, &up, &down, &gpday, &gnday,
&gpweek, &gnweek, &gpmonth, &gnmonth, &gpyear, &gnyear, &togo, &today,
&conf, &appt, &todo, &cut, &copy, &paste
&conf, &appt, &todo, &copy, &paste
};
struct binding *bindings_todo[] = {