[tepl] StyleSchemeChooserWidget: scroll to selected row
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] StyleSchemeChooserWidget: scroll to selected row
- Date: Wed, 22 Apr 2020 19:19:24 +0000 (UTC)
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]