[gnome-initial-setup/wip/gbsneto/low-res-screens: 2/5] driver: scroll to top when page changes



commit 7ce893807a56d25ecc9dfa0944672c9e07596bf7
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Mar 15 17:16:41 2016 -0300

    driver: scroll to top when page changes
    
    When the user changes the page, the scrolled window
    should be scrolled to the top.
    
    Fix that by adding a new GisAssistant::page-changed
    signal and scrolling to top whenever this signal is
    fired.

 gnome-initial-setup/gis-assistant.c  |   30 ++++++++++++++++++++++++++++++
 gnome-initial-setup/gis-assistant.ui |    1 +
 gnome-initial-setup/gis-driver.c     |   11 +++++++++++
 3 files changed, 42 insertions(+), 0 deletions(-)
---
diff --git a/gnome-initial-setup/gis-assistant.c b/gnome-initial-setup/gis-assistant.c
index 82a4f84..38e730e 100644
--- a/gnome-initial-setup/gis-assistant.c
+++ b/gnome-initial-setup/gis-assistant.c
@@ -34,6 +34,12 @@ enum {
   PROP_LAST,
 };
 
+enum {
+  PAGE_CHANGED,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
 static GParamSpec *obj_props[PROP_LAST];
 
 struct _GisAssistantPrivate
@@ -63,6 +69,12 @@ struct _GisAssistantPagePrivate
 };
 
 static void
+visible_child_changed (GisAssistant *assistant)
+{
+  g_signal_emit (assistant, signals[PAGE_CHANGED], 0);
+}
+
+static void
 widget_destroyed (GtkWidget    *widget,
                   GisAssistant *assistant)
 {
@@ -463,6 +475,8 @@ gis_assistant_class_init (GisAssistantClass *klass)
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAssistant, title);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAssistant, stack);
 
+  gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (klass), visible_child_changed);
+
   gobject_class->get_property = gis_assistant_get_property;
 
   obj_props[PROP_TITLE] =
@@ -471,5 +485,21 @@ gis_assistant_class_init (GisAssistantClass *klass)
                          NULL,
                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
+
+  /**
+   * GisAssistant::page-changed:
+   * @assistant: the #GisAssistant
+   *
+   * The ::page-changed signal is emitted when the visible page
+   * changed.
+   */
+  signals[PAGE_CHANGED] =
+    g_signal_new ("page-changed",
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE, 0);
+
   g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
 }
diff --git a/gnome-initial-setup/gis-assistant.ui b/gnome-initial-setup/gis-assistant.ui
index 3dc0295..49a1a24 100644
--- a/gnome-initial-setup/gis-assistant.ui
+++ b/gnome-initial-setup/gis-assistant.ui
@@ -87,6 +87,7 @@
             <property name="hexpand">True</property>
             <property name="hhomogeneous">False</property>
             <property name="vhomogeneous">False</property>
+            <signal name="notify::visible-child" handler="visible_child_changed" object="GisAssistant" 
swapped="yes"/>
           </object>
         </child>
       </object>
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index aecec2d..9861c6c 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -99,6 +99,12 @@ gis_driver_finalize (GObject *object)
 }
 
 static void
+assistant_page_changed (GtkScrolledWindow *sw)
+{
+  gtk_adjustment_set_value (gtk_scrolled_window_get_vadjustment (sw), 0);
+}
+
+static void
 prepare_main_window (GisDriver *driver)
 {
   GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
@@ -112,6 +118,11 @@ prepare_main_window (GisDriver *driver)
   gtk_container_add (GTK_CONTAINER (sw), child);
   g_object_unref (child);
 
+  g_signal_connect_swapped (priv->assistant,
+                            "page-changed",
+                            G_CALLBACK (assistant_page_changed),
+                            sw);
+
   gtk_window_set_titlebar (priv->main_window,
                            gis_assistant_get_titlebar (priv->assistant));
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]