summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-08 11:05:29 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2023-03-16 12:26:28 +0000
commit189c809271184a6bd713eaa4e8b290a54623c51b (patch)
tree8d94f12515677da662558f0b2d20a1250e6dfbaf
parenta9e4a5ae12656d23e9d354c1a61db4fa49107e31 (diff)
downloadgnome-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.in5
-rw-r--r--src/gui/views/gcal-week-view.c207
-rw-r--r--src/gui/views/gcal-week-view.ui2
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>