[gnome-control-center] shell: Fix list box scrolling helper
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] shell: Fix list box scrolling helper
- Date: Wed, 25 Jun 2014 16:10:32 +0000 (UTC)
commit 61a6c6f0cbc634f8ab2a0c8d83c32b9cce295c2b
Author: Rui Matos <tiagomatos gmail com>
Date: Tue Jun 24 18:41:42 2014 +0200
shell: Fix list box scrolling helper
GtkListBox doesn't implement GtkScrollable so it needs to be added to
a GtkViewport. Instead of having to do this in all .ui files, add a
new helper function to setup the widget tree correctly.
https://bugzilla.gnome.org/show_bug.cgi?id=732175
panels/region/cc-region-panel.c | 14 +++++---------
panels/region/region.ui | 16 ++--------------
panels/sharing/cc-sharing-panel.c | 7 ++++---
panels/sharing/sharing.ui | 22 ++++------------------
shell/list-box-helper.c | 32 ++++++++++++++++++++++++++++----
shell/list-box-helper.h | 5 ++++-
6 files changed, 47 insertions(+), 49 deletions(-)
---
diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
index b13d6ce..fe9c576 100644
--- a/panels/region/cc-region-panel.c
+++ b/panels/region/cc-region-panel.c
@@ -112,8 +112,6 @@ struct _CcRegionPanelPrivate {
GtkWidget *remove_input;
GtkWidget *show_config;
GtkWidget *show_layout;
- GtkWidget *input_scrolledwindow;
- guint n_input_rows;
GSettings *input_settings;
GnomeXkbInfo *xkb_info;
@@ -849,8 +847,7 @@ add_input_row (CcRegionPanel *self,
g_object_set_data_full (G_OBJECT (row), "app-info", g_object_ref (app_info), g_object_unref);
}
- priv->n_input_rows += 1;
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (self->priv->input_scrolledwindow));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (priv->input_list));
return row;
}
@@ -935,8 +932,7 @@ clear_input_sources (CcRegionPanel *self)
}
g_list_free (list);
- priv->n_input_rows = 0;
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (self->priv->input_scrolledwindow));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (priv->input_list));
}
static void
@@ -1246,8 +1242,7 @@ do_remove_selected_input (CcRegionPanel *self)
gtk_container_remove (GTK_CONTAINER (priv->input_list), GTK_WIDGET (selected));
gtk_list_box_select_row (GTK_LIST_BOX (priv->input_list), GTK_LIST_BOX_ROW (sibling));
- priv->n_input_rows -= 1;
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (self->priv->input_scrolledwindow));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (priv->input_list));
update_buttons (self);
update_input (self);
@@ -1414,7 +1409,6 @@ setup_input_section (CcRegionPanel *self)
priv->remove_input = WID ("input_source_remove");
priv->show_config = WID ("input_source_config");
priv->show_layout = WID ("input_source_layout");
- priv->input_scrolledwindow = WID ("input_scrolledwindow");
g_signal_connect_swapped (priv->options_button, "clicked",
G_CALLBACK (show_input_options), self);
@@ -1427,6 +1421,8 @@ setup_input_section (CcRegionPanel *self)
g_signal_connect_swapped (priv->show_layout, "clicked",
G_CALLBACK (show_selected_layout), self);
+ cc_list_box_setup_scrolling (GTK_LIST_BOX (priv->input_list));
+
gtk_list_box_set_selection_mode (GTK_LIST_BOX (priv->input_list),
GTK_SELECTION_SINGLE);
gtk_list_box_set_header_func (GTK_LIST_BOX (priv->input_list),
diff --git a/panels/region/region.ui b/panels/region/region.ui
index 6b24f50..7c8f743 100644
--- a/panels/region/region.ui
+++ b/panels/region/region.ui
@@ -181,21 +181,9 @@
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
- <object class="GtkScrolledWindow" id="input_scrolledwindow">
+ <object class="GtkListBox" id="input_list">
<property name="visible">True</property>
- <property name="hscrollbar-policy">never</property>
- <property name="vscrollbar-policy">never</property>
- <child>
- <object class="GtkViewport" id="input_viewport">
- <property name="visible">True</property>
- <child>
- <object class="GtkListBox" id="input_list">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </object>
- </child>
- </object>
- </child>
+ <property name="can_focus">True</property>
</object>
</child>
</object>
diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c
index cd1cc50..f75bae2 100644
--- a/panels/sharing/cc-sharing-panel.c
+++ b/panels/sharing/cc-sharing-panel.c
@@ -527,7 +527,7 @@ cc_sharing_panel_add_folder (GtkListBox *box,
i = g_list_length (rows);
gtk_list_box_insert (GTK_LIST_BOX (box), row, i - 1);
}
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (WID ("shared-folders-scrolledwindow")));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (box));
bail:
g_free (folder);
@@ -543,7 +543,7 @@ cc_sharing_panel_remove_folder (GtkButton *button,
row = g_object_get_data (G_OBJECT (button), "row");
gtk_widget_destroy (row);
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (WID ("shared-folders-scrolledwindow")));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (WID ("shared-folders-listbox")));
}
static void
@@ -724,6 +724,7 @@ cc_sharing_panel_setup_media_sharing_dialog (CcSharingPanel *self)
gtk_list_box_set_header_func (GTK_LIST_BOX (box),
cc_list_box_update_header_func, NULL,
NULL);
+ cc_list_box_setup_scrolling (GTK_LIST_BOX (box));
list = folders;
while (list && *list)
@@ -738,7 +739,7 @@ cc_sharing_panel_setup_media_sharing_dialog (CcSharingPanel *self)
gtk_list_box_insert (GTK_LIST_BOX (box),
cc_sharing_panel_new_add_media_sharing_row (self), -1);
- cc_list_box_adjust_scrolling (GTK_SCROLLED_WINDOW (WID ("shared-folders-scrolledwindow")));
+ cc_list_box_adjust_scrolling (GTK_LIST_BOX (box));
g_signal_connect (G_OBJECT (box), "row-activated",
G_CALLBACK (cc_sharing_panel_add_folder), self);
diff --git a/panels/sharing/sharing.ui b/panels/sharing/sharing.ui
index 9711b97..43c96ba 100644
--- a/panels/sharing/sharing.ui
+++ b/panels/sharing/sharing.ui
@@ -911,7 +911,7 @@
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Folders</property>
- <property name="mnemonic_widget">shared-folders-scrolledwindow</property>
+ <property name="mnemonic_widget">shared-folders-listbox</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
@@ -923,29 +923,15 @@
</packing>
</child>
<child>
- <object class="GtkBox" id="shared-folders-box">
+ <object class="GtkFrame" id="shared-folders-frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
+ <property name="shadow_type">in</property>
<child>
- <object class="GtkScrolledWindow" id="shared-folders-scrolledwindow">
+ <object class="GtkListBox" id="shared-folders-listbox">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="vexpand">True</property>
- <property name="shadow_type">in</property>
- <property name="vscrollbar-policy">never</property>
- <child>
- <object class="GtkListBox" id="shared-folders-listbox">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </object>
- </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
</child>
</object>
<packing>
diff --git a/shell/list-box-helper.c b/shell/list-box-helper.c
index ba3f44d..514da6c 100644
--- a/shell/list-box-helper.c
+++ b/shell/list-box-helper.c
@@ -40,15 +40,18 @@ cc_list_box_update_header_func (GtkListBoxRow *row,
}
void
-cc_list_box_adjust_scrolling (GtkScrolledWindow *scrolled_window)
+cc_list_box_adjust_scrolling (GtkListBox *listbox)
{
- GtkWidget *listbox;
GtkWidget *parent;
+ GtkWidget *scrolled_window;
GList *children;
guint n_rows;
- listbox = gtk_bin_get_child (GTK_BIN (scrolled_window));
- parent = gtk_widget_get_parent (GTK_WIDGET (scrolled_window));
+ parent = g_object_get_data (G_OBJECT (listbox), "cc-scrolling-parent");
+ scrolled_window = g_object_get_data (G_OBJECT (listbox), "cc-scrolling-scrolled-window");
+ if (!parent || !scrolled_window)
+ return;
+
children = gtk_container_get_children (GTK_CONTAINER (listbox));
n_rows = g_list_length (children);
g_list_free (children);
@@ -70,3 +73,24 @@ cc_list_box_adjust_scrolling (GtkScrolledWindow *scrolled_window)
GTK_POLICY_NEVER, GTK_POLICY_NEVER);
}
}
+
+void
+cc_list_box_setup_scrolling (GtkListBox *listbox)
+{
+ GtkWidget *parent;
+ GtkWidget *scrolled_window;
+
+ parent = gtk_widget_get_parent (GTK_WIDGET (listbox));
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolled_window);
+
+ g_object_ref (listbox);
+ gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (listbox));
+ gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (listbox));
+ g_object_unref (listbox);
+
+ gtk_container_add (GTK_CONTAINER (parent), scrolled_window);
+
+ g_object_set_data (G_OBJECT (listbox), "cc-scrolling-parent", parent);
+ g_object_set_data (G_OBJECT (listbox), "cc-scrolling-scrolled-window", scrolled_window);
+}
diff --git a/shell/list-box-helper.h b/shell/list-box-helper.h
index 327a85d..0aad95d 100644
--- a/shell/list-box-helper.h
+++ b/shell/list-box-helper.h
@@ -24,4 +24,7 @@ cc_list_box_update_header_func (GtkListBoxRow *row,
gpointer user_data);
void
-cc_list_box_adjust_scrolling (GtkScrolledWindow *scrolled_window);
+cc_list_box_adjust_scrolling (GtkListBox *listbox);
+
+void
+cc_list_box_setup_scrolling (GtkListBox *listbox);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]