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:
parent
88588ad704
commit
13c21ac280
@ -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);
|
||||
|
@ -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);
|
||||
|
29
src/help.c
29
src/help.c
@ -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));
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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] =
|
||||
|
@ -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, ©, &paste
|
||||
&conf, &appt, &todo, ©, &paste
|
||||
};
|
||||
|
||||
struct binding *bindings_todo[] = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user