[tepl] StyleSchemeChooserWidget: scroll to selected row



commit 4a23e0a1f6898fae5c71ac78a5ec8ee7ac0a2c5c
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Wed Apr 22 20:35:03 2020 +0200

    StyleSchemeChooserWidget: scroll to selected row
    
    I should try to write a utility function for doing that, because it's
    rather complicated for someone not knowing well GtkListBox.

 tepl/tepl-style-scheme-chooser-widget.c | 45 ++++++++++++++++++++++++++++++---
 1 file changed, 42 insertions(+), 3 deletions(-)
---
diff --git a/tepl/tepl-style-scheme-chooser-widget.c b/tepl/tepl-style-scheme-chooser-widget.c
index 8f0ecfb..5b0c276 100644
--- a/tepl/tepl-style-scheme-chooser-widget.c
+++ b/tepl/tepl-style-scheme-chooser-widget.c
@@ -26,10 +26,14 @@
  * @Short_description: A simple #GtkSourceStyleSchemeChooser
  *
  * #TeplStyleSchemeChooserWidget is a simple implementation of the
- * #GtkSourceStyleSchemeChooser interface.
+ * #GtkSourceStyleSchemeChooser interface. It already contains a
+ * #GtkScrolledWindow internally.
  *
- * There is an additional convenience property:
- * #TeplStyleSchemeChooserWidget:tepl-style-scheme-id.
+ * Additional features compared to #GtkSourceStyleSchemeChooserWidget:
+ * - There is an additional convenience property:
+ *   #TeplStyleSchemeChooserWidget:tepl-style-scheme-id.
+ * - When the #GtkWidget::map signal is emitted, #TeplStyleSchemeChooserWidget
+ *   scrolls to the selected row.
  */
 
 struct _TeplStyleSchemeChooserWidgetPrivate
@@ -155,15 +159,46 @@ tepl_style_scheme_chooser_widget_dispose (GObject *object)
        G_OBJECT_CLASS (tepl_style_scheme_chooser_widget_parent_class)->dispose (object);
 }
 
+static void
+scroll_to_selected_row (GtkListBox *list_box)
+{
+       GtkListBoxRow *selected_row = gtk_list_box_get_selected_row (list_box);
+
+       if (selected_row != NULL)
+       {
+               /* See also the call to gtk_container_set_focus_vadjustment()
+                * below.
+                */
+               gtk_container_set_focus_child (GTK_CONTAINER (list_box),
+                                              GTK_WIDGET (selected_row));
+       }
+}
+
+static void
+tepl_style_scheme_chooser_widget_map (GtkWidget *widget)
+{
+       TeplStyleSchemeChooserWidget *chooser = TEPL_STYLE_SCHEME_CHOOSER_WIDGET (widget);
+
+       if (GTK_WIDGET_CLASS (tepl_style_scheme_chooser_widget_parent_class)->map != NULL)
+       {
+               GTK_WIDGET_CLASS (tepl_style_scheme_chooser_widget_parent_class)->map (widget);
+       }
+
+       scroll_to_selected_row (chooser->priv->list_box);
+}
+
 static void
 tepl_style_scheme_chooser_widget_class_init (TeplStyleSchemeChooserWidgetClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->get_property = tepl_style_scheme_chooser_widget_get_property;
        object_class->set_property = tepl_style_scheme_chooser_widget_set_property;
        object_class->dispose = tepl_style_scheme_chooser_widget_dispose;
 
+       widget_class->map = tepl_style_scheme_chooser_widget_map;
+
        g_object_class_override_property (object_class, PROP_STYLE_SCHEME, "style-scheme");
 
        /**
@@ -316,6 +351,7 @@ static void
 tepl_style_scheme_chooser_widget_init (TeplStyleSchemeChooserWidget *chooser)
 {
        GtkWidget *scrolled_window;
+       GtkAdjustment *vadjustment;
 
        chooser->priv = tepl_style_scheme_chooser_widget_get_instance_private (chooser);
 
@@ -336,6 +372,9 @@ tepl_style_scheme_chooser_widget_init (TeplStyleSchemeChooserWidget *chooser)
        gtk_widget_show_all (scrolled_window);
        gtk_container_add (GTK_CONTAINER (chooser), scrolled_window);
 
+       vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window));
+       gtk_container_set_focus_vadjustment (GTK_CONTAINER (chooser->priv->list_box), vadjustment);
+
        g_signal_connect (chooser->priv->list_box,
                          "selected-rows-changed",
                          G_CALLBACK (list_box_selected_rows_changed_cb),


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