summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-08 13:33:16 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-16 12:26:28 +0000
commite1616039d69d8656b4ba70a30fa853822bfe7444 (patch)
treea14584dcc7082977dd2352af5ec0d6ab50653bf9 /src
parenta55bf69dfbbc8a27d5bf9e5b3c252d9cdd53e80c (diff)
downloadgnome-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.
Diffstat (limited to 'src')
-rw-r--r--src/gui/views/gcal-week-view.c33
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;
}