diff options
author | Lars Henriksen <LarsHenriksen@get2net.dk> | 2018-12-19 08:59:05 +0100 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2019-05-22 01:56:59 -0400 |
commit | 1ccfe128cce8d670d12c350326bb13fbc0276d0a (patch) | |
tree | 116fd3e8861e13cc22060ce2eb47593381a8f61c /src/calcurse.c | |
parent | 066df02cbf44d58a9b1e3a30b1310dc0f460e4c4 (diff) | |
download | calcurse-1ccfe128cce8d670d12c350326bb13fbc0276d0a.tar.gz calcurse-1ccfe128cce8d670d12c350326bb13fbc0276d0a.zip |
Redesign selected-item implementation for the APP panel
The day vector, day_items, is displayed in the appointments panel; the
selected day_item object is highlighted (when the panel has the focus).
When items are inserted, edited, moved etc., and when the day is
changed, the day vector is rebuilt and displayed anew.
Problem: How shall the selection be set automatically in the context of
the new day vector?
In previous versions all of the above is mostly handled by the function
do_storage() in calcurse.c The function saves data about the selection
as needed, rebuilds the day vector, loads the listbox and sets the
selection from the saved selection data. This works well in "single
day" calcurse in cases where the selected item is present in the day
vector both before and after the rebuild, or when the item ordering in
the listbox is unaffected by the changes. But when a new item is added
the selection cannot be set to the new object by do_storage(). Instead
the necessary operations are performed by ui_day_item_add(), and
do_storage() is bypassed. In general, when an item cannot be found in
the new vector, the item which occupies the old place in the list gets
selected, e.g. when an item is deleted. When an item is turned into a
repeating one, the old item is deleted and a new is created. Here the
new selection is not always the affected item, but in any case not far
away. Generally, with only one day in the panel an erronous selection
might not be noticed or be accurate by chance.
In "multiple day" calcurse the existing scheme works less well; in
addition the day vector may now contain more than one object that refer
to the same event or appointment (recurrent items or multi-day
appointments). The scheme has therefore been modified. The do_storage()
function is no longer bypassed, but handles day vector rebuild, load of
listbox and item selection exclusively. To make that possible, data
about the selected item is no longer saved in a local automatic
variable, private to do_storage(), but in an external static variable in
day.c, which may be set not only by do_storage(). The variable is
declared as
static struct day_item sel_data;
and used as follows:
1. On startup sel_data is initialized to empty (i.e. no selection).
2. In any operation involving the appointments panel:
2.1 Do the work and if necessary set sel_data. This is the case when
deleting, adding or pasting an item, and when turning an ordinary
item into a recurrent one.
2.2 Call do_storage().
3. In do_storage():
3.1 If sel_data is empty, set it to the current selection.
3.2 Rebuild the day vector.
3.3 Set the selection from sel_data.
3.4 Set sel_data to empty.
Further remarks
---------------
The selection is found in the new day vector by searching for the saved
(order, item.<pointer>) pair. Previously the item.<pointer> alone
sufficed and in some cases it still does. In case the item cannot be
found, the selection stays in the same day as before the rebuild.
An attempt at more consistently named APP-related functions has led to:
ui_day_sel_date() replaces ui_day_sel_day() ui_day_get_sel() replaces
ui_day_selitem()
Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src/calcurse.c')
-rw-r--r-- | src/calcurse.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/calcurse.c b/src/calcurse.c index 757b3cd..b99f210 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -41,26 +41,35 @@ #define HANDLE_KEY(key, fn) case key: fn(); break; int count, reg; - /* - * Store the events and appointments for the selected day and reset the - * appointment highlight pointer if a new day was selected. + * Store events and appointments for a range of days in the day vector - + * beginning with the selected day - and load them into the APP listbox. If no + * day-change occurs, reset the selected APP item and with it the selected day, + * thereby storing and loading the same range of days. */ static void do_storage(int day_changed) { - /* * Save the selected item before rebuilding the day vector. */ - struct day_item *day = ui_day_selitem(); - union aptev_ptr item; - if (day) - item = day->item; + /* + * Save the selected item before rebuilding the day vector - + * unless already set. + */ + if (!day_check_sel_data()) + day_set_sel_data(ui_day_get_sel()); + + if (!day_changed) + ui_day_sel_reset(); + /* The day_items vector. */ day_store_items(get_slctd_day(), 1, day_get_nb()); + /* The APP listbox. */ ui_day_load_items(); if (day_changed) ui_day_sel_reset(); - else if (day) - ui_day_set_selitem_by_aptev_ptr(item); + else + ui_day_find_sel(); + + day_set_sel_data(&empty_day); } static inline void key_generic_change_view(void) @@ -115,6 +124,7 @@ static inline void key_generic_config_menu(void) static inline void key_generic_add_appt(void) { ui_day_item_add(); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); } @@ -130,6 +140,7 @@ static inline void key_add_item(void) case APP: case CAL: ui_day_item_add(); + do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); break; case TOD: @@ -143,7 +154,7 @@ static inline void key_add_item(void) static inline void key_edit_item(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) { + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) { ui_day_item_edit(); do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); @@ -155,7 +166,7 @@ static inline void key_edit_item(void) static inline void key_del_item(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) { + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) { ui_day_item_delete(reg); do_storage(0); wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); @@ -167,11 +178,8 @@ static inline void key_del_item(void) static inline void key_generic_copy(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) { + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) ui_day_item_copy(reg); - do_storage(0); - wins_update(FLAG_CAL | FLAG_APP); - } } static inline void key_generic_paste(void) @@ -185,15 +193,16 @@ static inline void key_generic_paste(void) static inline void key_repeat_item(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) { ui_day_item_repeat(); - do_storage(0); - wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + do_storage(0); + wins_update(FLAG_CAL | FLAG_APP | FLAG_STA); + } } static inline void key_flag_item(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) { + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) { ui_day_flag(); do_storage(0); wins_update(FLAG_APP); @@ -232,7 +241,7 @@ static inline void key_lower_priority(void) static inline void key_edit_note(void) { - if (wins_slctd() == APP && !event_dummy(ui_day_selitem())) { + if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) { ui_day_edit_note(); do_storage(0); } else if (wins_slctd() == TOD) { |