viscal

cairo/gtk vi-like timeblocking calendar
git clone git://jb55.com/viscal
Log | Files | Refs | README | LICENSE

commit 854bc50baeb20265e079193f965d7a86f7d24584
parent ec15f4e499c80bbb1b47636182c5572527c3793f
Author: William Casarin <jb55@jb55.com>
Date:   Mon,  4 Jan 2021 12:21:06 -0800

fix g{j,k} movement

Diffstat:
Mviscal.c | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 66 insertions(+), 17 deletions(-)

diff --git a/viscal.c b/viscal.c @@ -340,7 +340,6 @@ static int find_event_within(struct cal *cal, time_t target, int seconds_range) if (cal->nevents == 0) return -1; - else if (cal->nevents == 1) return 0; @@ -764,20 +763,40 @@ static int timeblock_size(struct cal *cal) return cal->timeblock_size; } - -static inline int relative_selection(struct cal *cal, int rel) +static int find_closest_event(struct cal *cal, time_t near, int rel) { - /* if (cal->selected_event_ind == -1) { */ - /* // TODO: bias direction */ - /* return find_event_within(cal, cal->current); */ - /* } */ + struct event *ev; + int is_up, ind; + time_t start, end, diff, prev; - return clamp(cal->selected_event_ind + rel, 0, cal->nevents - 1); + is_up = rel == -1; + prev = near; + + if (cal->nevents == 0) + return -1; + else if (cal->nevents == 1) + return 0; + + for (int i = cal->nevents-1; i >= 0; i--) { + ev = &cal->events[i]; + vevent_span_timet(ev->vevent, &start, &end); + + if (end <= near) { + ind = is_up ? i : i+1; + return ind == cal->nevents ? -1 : ind; + } + } + + return 0; } -static void select_up(struct cal *cal) +static inline int relative_selection(struct cal *cal, int rel) { - cal->selected_event_ind = relative_selection(cal, -cal->repeat); + if (cal->selected_event_ind == -1) { + return find_closest_event(cal, cal->current, rel); + } + + return clamp(cal->selected_event_ind + rel, 0, cal->nevents - 1); } static time_t get_hour(time_t current) @@ -1108,13 +1127,43 @@ static void shrink_selection(struct cal *cal) expand_selection_relative(cal, -1); } +static void select_event(struct cal *cal, int ind) +{ + time_t start ,end; + struct event *ev; -static void select_down(struct cal *cal) + cal->selected_event_ind = ind; + + if (ind != -1) { + ev = &cal->events[ind]; + vevent_span_timet(ev->vevent, &start, NULL); + cal->current = start; + } +} + +static void select_dir(struct cal *cal, int rel) +{ + int ind = relative_selection(cal, rel); + select_event(cal, ind); + if (!timeline_in_view(cal)) { + center_view(cal); + } +} + +static void select_up(struct cal *cal) { - cal->selected_event_ind = - relative_selection(cal, cal->repeat); + printf("select_up repeat %d\n", cal->repeat); + for (int i = 0; i < cal->repeat; i++) { + select_dir(cal, -1); + } } +static void select_down(struct cal *cal) +{ + for (int i = 0; i < cal->repeat; i++) { + select_dir(cal, 1); + } +} // TODO: make zoom_amt configurable static const int zoom_amt = 1.5; @@ -1729,10 +1778,10 @@ static gboolean on_keypress (GtkWidget *widget, GdkEvent *event, set_chord(cal, key); } - if (key != 0) { - /* printf("DEBUG resetting repeat\n"); */ - cal->repeat = 1; - } + //if (key != 0) { + // printf("DEBUG resetting repeat\n"); + // cal->repeat = 1; + //} break; default: