diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-08 13:33:16 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-16 12:26:28 +0000 |
commit | e1616039d69d8656b4ba70a30fa853822bfe7444 (patch) | |
tree | a14584dcc7082977dd2352af5ec0d6ab50653bf9 | |
parent | a55bf69dfbbc8a27d5bf9e5b3c252d9cdd53e80c (diff) | |
download | gnome-calendar-e1616039d69d8656b4ba70a30fa853822bfe7444.tar.gz |
views/week: Special case discrete events
They behave slightly differently from smooth scroll events, and
they don't emit 'scroll-begin' nor 'scroll-end', so we have to
execute that the callbacks of these signals do inside the scroll
callback itself.
-rw-r--r-- | src/gui/views/gcal-week-view.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/gui/views/gcal-week-view.c b/src/gui/views/gcal-week-view.c index 16ac8579..6bfc54a5 100644 --- a/src/gui/views/gcal-week-view.c +++ b/src/gui/views/gcal-week-view.c @@ -289,21 +289,48 @@ on_scroll_controller_scroll_cb (GtkEventControllerScroll *controller, gdouble dy, GcalWeekView *self) { - gdouble scale, view_center_y; + GdkEvent *event; + gboolean discrete; + gdouble view_center_y; + gdouble scale; if (!(gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (controller)) & GDK_CONTROL_MASK)) return FALSE; - scale = dy / 100.0 + self->scroll_scale; + event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (controller)); + + switch (gdk_scroll_event_get_direction (event)) + { + case GDK_SCROLL_SMOOTH: + scale = dy / 100.0 + 1.0; + discrete = FALSE; + break; + + case GDK_SCROLL_UP: + case GDK_SCROLL_DOWN: + scale = dy / 10.0 + 1.0; + discrete = TRUE; + break; + + case GDK_SCROLL_LEFT: + case GDK_SCROLL_RIGHT: + default: + g_assert_not_reached (); + } if (self->pointer_position_valid) view_center_y = self->pointer_position_y; else view_center_y = gtk_widget_get_allocated_height (self->scrolled_window) / 2.0; - begin_zoom (self, view_center_y); + if (discrete) + begin_zoom (self, view_center_y); + apply_zoom (self, view_center_y, scale); + if (discrete) + save_zoom_level (self); + return TRUE; } |