diff options
author | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-08 11:05:29 -0300 |
---|---|---|
committer | Georges Basile Stavracas Neto <georges.stavracas@gmail.com> | 2023-03-16 12:26:28 +0000 |
commit | 189c809271184a6bd713eaa4e8b290a54623c51b (patch) | |
tree | 8d94f12515677da662558f0b2d20a1250e6dfbaf | |
parent | a9e4a5ae12656d23e9d354c1a61db4fa49107e31 (diff) | |
download | gnome-calendar-189c809271184a6bd713eaa4e8b290a54623c51b.tar.gz |
views/week: Store and restore zoom level
Closes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/916
-rw-r--r-- | data/org.gnome.calendar.gschema.xml.in | 5 | ||||
-rw-r--r-- | src/gui/views/gcal-week-view.c | 207 | ||||
-rw-r--r-- | src/gui/views/gcal-week-view.ui | 2 |
3 files changed, 134 insertions, 80 deletions
diff --git a/data/org.gnome.calendar.gschema.xml.in b/data/org.gnome.calendar.gschema.xml.in index 2c9a7231..569a607b 100644 --- a/data/org.gnome.calendar.gschema.xml.in +++ b/data/org.gnome.calendar.gschema.xml.in @@ -21,5 +21,10 @@ <summary>Weather Service Configuration</summary> <description>Whether weather reports are shown, automatic locations are used and a location-name</description> </key> + <key name="week-view-zoom-level" type="d"> + <default>1.0</default> + <summary>Zoom level of the week grid</summary> + <description>The current zoom level of the week grid</description> + </key> </schema> </schemalist> diff --git a/src/gui/views/gcal-week-view.c b/src/gui/views/gcal-week-view.c index d911b57e..f6fad2d9 100644 --- a/src/gui/views/gcal-week-view.c +++ b/src/gui/views/gcal-week-view.c @@ -63,7 +63,9 @@ struct _GcalWeekView gdouble zoom_level; }; -static void schedule_position_scroll (GcalWeekView *self); +static void stack_visible_child_changed_cb (AdwViewStack *stack, + GParamSpec *pspec, + GcalWeekView *self); static void gcal_view_interface_init (GcalViewInterface *iface); @@ -89,12 +91,80 @@ G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GTK_TYPE_BOX, #define MIN_ZOOM_LEVEL 0.334 #define MAX_ZOOM_LEVEL 3.0 -/* Callbacks */ +/* Auxiliary methods */ +static gboolean +update_grid_scroll_position (GcalWeekView *self) +{ + g_autoptr(GDateTime) week_start = NULL; + g_autoptr(GDateTime) week_end = NULL; + g_autoptr(GDateTime) now = NULL; + GtkAdjustment *vadjustment; + gdouble minutes, real_value; + gdouble max, page, page_increment, value; + gboolean dummy; + + /* While the scrolled window is not mapped, we keep waiting */ + if (!gtk_widget_get_realized (self->scrolled_window) || + !gtk_widget_get_mapped (self->scrolled_window)) + { + if (self->stack_page_changed_id == 0) + { + GtkWidget *stack = gtk_widget_get_ancestor (GTK_WIDGET (self), ADW_TYPE_VIEW_STACK); + + self->stack_page_changed_id = g_signal_connect_object (stack, + "notify::visible-child", + G_CALLBACK (stack_visible_child_changed_cb), + self, + 0); + } + + self->scroll_grid_timeout_id = 0; + + GCAL_RETURN (G_SOURCE_REMOVE); + } + + now = g_date_time_new_now_local (); + week_start = gcal_date_time_get_start_of_week (self->date); + week_end = gcal_date_time_get_end_of_week (self->date); + + /* Don't animate when not today */ + if (gcal_date_time_compare_date (now, week_start) < 0 || gcal_date_time_compare_date (now, week_end) >= 0) + GCAL_GOTO (out); + + vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window)); + minutes = g_date_time_get_hour (now) * 60 + g_date_time_get_minute (now); + page = gtk_adjustment_get_page_size (vadjustment); + max = gtk_adjustment_get_upper (vadjustment); + + real_value = max / MINUTES_PER_DAY * minutes - (page / 2.0); + page_increment = gtk_adjustment_get_page_increment (vadjustment); + value = gtk_adjustment_get_value (vadjustment); + + gtk_adjustment_set_page_increment (vadjustment, real_value - value); + + g_signal_emit_by_name (self->scrolled_window, + "scroll-child", + GTK_SCROLL_PAGE_FORWARD, + FALSE, + &dummy); + + gtk_adjustment_set_page_increment (vadjustment, page_increment); + +out: + self->scroll_grid_timeout_id = 0; + GCAL_RETURN (G_SOURCE_REMOVE); +} + static void -on_event_activated (GcalWeekView *self, - GtkWidget *widget) +schedule_position_scroll (GcalWeekView *self) { - gcal_view_event_activated (GCAL_VIEW (self), GCAL_EVENT_WIDGET (widget)); + /* Nothing is scheduled, we should do it now */ + if (self->scroll_grid_timeout_id > 0) + g_source_remove (self->scroll_grid_timeout_id); + + self->scroll_grid_timeout_id = g_timeout_add (200, + (GSourceFunc) update_grid_scroll_position, + self); } static void @@ -137,6 +207,40 @@ apply_zoom (GcalWeekView *self, } static void +save_zoom_level (GcalWeekView *self) +{ + GSettings *settings; + + g_assert (self->context != NULL); + + settings = gcal_context_get_settings (self->context); + g_settings_set_double (settings, "week-view-zoom-level", self->zoom_level); +} + +static void +restore_zoom_level (GcalWeekView *self) +{ + GSettings *settings; + + g_assert (self->context != NULL); + + settings = gcal_context_get_settings (self->context); + self->zoom_level = g_settings_get_double (settings, "week-view-zoom-level"); + + begin_zoom (self, 0); + apply_zoom (self, 0, 1.0); +} + + +/* Callbacks */ +static void +on_event_activated (GcalWeekView *self, + GtkWidget *widget) +{ + gcal_view_event_activated (GCAL_VIEW (self), GCAL_EVENT_WIDGET (widget)); +} + +static void on_motion_controller_enter_cb (GcalWeekView *self, gdouble x, gdouble y, @@ -204,6 +308,13 @@ on_scroll_controller_scroll_cb (GcalWeekView *self, } static void +on_scroll_controller_scroll_end_cb (GtkEventControllerScroll *controller, + GcalWeekView *self) +{ + save_zoom_level (self); +} + +static void on_zoom_gesture_scale_changed_cb (GcalWeekView *self, gdouble scale, GtkGestureZoom *gesture) @@ -228,6 +339,14 @@ on_zoom_gesture_begin_cb (GcalWeekView *self, } static void +on_zoom_gesture_end_cb (GtkGesture *gesture, + GdkEventSequence *sequence, + GcalWeekView *self) +{ + save_zoom_level (self); +} + +static void stack_visible_child_changed_cb (AdwViewStack *stack, GParamSpec *pspec, GcalWeekView *self) @@ -240,81 +359,6 @@ stack_visible_child_changed_cb (AdwViewStack *stack, g_clear_signal_handler (&self->stack_page_changed_id, stack); } -/* Auxiliary methods */ -static gboolean -update_grid_scroll_position (GcalWeekView *self) -{ - g_autoptr(GDateTime) week_start = NULL; - g_autoptr(GDateTime) week_end = NULL; - g_autoptr(GDateTime) now = NULL; - GtkAdjustment *vadjustment; - gdouble minutes, real_value; - gdouble max, page, page_increment, value; - gboolean dummy; - - /* While the scrolled window is not mapped, we keep waiting */ - if (!gtk_widget_get_realized (self->scrolled_window) || - !gtk_widget_get_mapped (self->scrolled_window)) - { - if (self->stack_page_changed_id == 0) - { - GtkWidget *stack = gtk_widget_get_ancestor (GTK_WIDGET (self), ADW_TYPE_VIEW_STACK); - - self->stack_page_changed_id = g_signal_connect_object (stack, - "notify::visible-child", - G_CALLBACK (stack_visible_child_changed_cb), - self, - 0); - } - - self->scroll_grid_timeout_id = 0; - - GCAL_RETURN (G_SOURCE_REMOVE); - } - - now = g_date_time_new_now_local (); - week_start = gcal_date_time_get_start_of_week (self->date); - week_end = gcal_date_time_get_end_of_week (self->date); - - /* Don't animate when not today */ - if (gcal_date_time_compare_date (now, week_start) < 0 || gcal_date_time_compare_date (now, week_end) >= 0) - GCAL_GOTO (out); - - vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window)); - minutes = g_date_time_get_hour (now) * 60 + g_date_time_get_minute (now); - page = gtk_adjustment_get_page_size (vadjustment); - max = gtk_adjustment_get_upper (vadjustment); - - real_value = max / MINUTES_PER_DAY * minutes - (page / 2.0); - page_increment = gtk_adjustment_get_page_increment (vadjustment); - value = gtk_adjustment_get_value (vadjustment); - - gtk_adjustment_set_page_increment (vadjustment, real_value - value); - - g_signal_emit_by_name (self->scrolled_window, - "scroll-child", - GTK_SCROLL_PAGE_FORWARD, - FALSE, - &dummy); - - gtk_adjustment_set_page_increment (vadjustment, page_increment); - -out: - self->scroll_grid_timeout_id = 0; - GCAL_RETURN (G_SOURCE_REMOVE); -} - -static void -schedule_position_scroll (GcalWeekView *self) -{ - /* Nothing is scheduled, we should do it now */ - if (self->scroll_grid_timeout_id > 0) - g_source_remove (self->scroll_grid_timeout_id); - - self->scroll_grid_timeout_id = g_timeout_add (200, - (GSourceFunc) update_grid_scroll_position, - self); -} /* GcalView implementation */ static GDateTime* @@ -516,6 +560,7 @@ gcal_week_view_set_property (GObject *object, gcal_week_grid_set_context (GCAL_WEEK_GRID (self->week_grid), self->context); gcal_week_header_set_context (GCAL_WEEK_HEADER (self->header), self->context); gcal_week_hour_bar_set_context (self->hours_bar, self->context); + restore_zoom_level (self); break; default: @@ -582,8 +627,10 @@ gcal_week_view_class_init (GcalWeekViewClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_motion_controller_leave_cb); gtk_widget_class_bind_template_callback (widget_class, on_scroll_controller_scroll_begin_cb); gtk_widget_class_bind_template_callback (widget_class, on_scroll_controller_scroll_cb); + gtk_widget_class_bind_template_callback (widget_class, on_scroll_controller_scroll_end_cb); gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_scale_changed_cb); gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_begin_cb); + gtk_widget_class_bind_template_callback (widget_class, on_zoom_gesture_end_cb); gtk_widget_class_set_css_name (widget_class, "calendar-view"); } diff --git a/src/gui/views/gcal-week-view.ui b/src/gui/views/gcal-week-view.ui index c729c8f9..bf8147cb 100644 --- a/src/gui/views/gcal-week-view.ui +++ b/src/gui/views/gcal-week-view.ui @@ -20,6 +20,7 @@ <object class="GtkGestureZoom"> <signal name="scale-changed" handler="on_zoom_gesture_scale_changed_cb" object="GcalWeekView" swapped="yes" /> <signal name="begin" handler="on_zoom_gesture_begin_cb" object="GcalWeekView" swapped="yes" /> + <signal name="end" handler="on_zoom_gesture_end_cb" object="GcalWeekView" swapped="no" /> </object> </child> @@ -30,6 +31,7 @@ <property name="flags">vertical|kinetic</property> <signal name="scroll-begin" handler="on_scroll_controller_scroll_begin_cb" object="GcalWeekView" swapped="yes" /> <signal name="scroll" handler="on_scroll_controller_scroll_cb" object="GcalWeekView" swapped="yes" /> + <signal name="scroll-end" handler="on_scroll_controller_scroll_end_cb" object="GcalWeekView" swapped="no" /> </object> </child> |