[gnome-software/wip/templates: 3/6] Use a GtkBuilder template for GsShellCategory
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/templates: 3/6] Use a GtkBuilder template for GsShellCategory
- Date: Fri, 28 Mar 2014 11:01:44 +0000 (UTC)
commit 47516de929939d3437126132682ad53da7894b82
Author: Kalev Lember <kalevlember gmail com>
Date: Thu Mar 27 14:30:17 2014 +0100
Use a GtkBuilder template for GsShellCategory
Move the UI definition to separate file and use a GtkBuilder template
for subclassing the widget.
src/Makefile.am | 1 +
src/gnome-software.gresource.xml | 1 +
src/gnome-software.ui | 75 +-----------------------------
src/gs-shell-category.c | 97 ++++++++++++++++++-------------------
src/gs-shell-category.h | 4 +-
src/gs-shell-category.ui | 84 ++++++++++++++++++++++++++++++++
src/gs-shell.c | 3 +-
7 files changed, 137 insertions(+), 128 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 3600571..6811a99 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,6 +33,7 @@ UI_FILES = \
feature-tile.ui \
gnome-software.ui \
gs-history-dialog.ui \
+ gs-shell-category.ui \
gs-shell-details.ui \
gs-shell-updates.ui \
gs-sources-dialog.ui \
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
index ee87f04..45580a1 100644
--- a/src/gnome-software.gresource.xml
+++ b/src/gnome-software.gresource.xml
@@ -11,6 +11,7 @@
<file preprocess="xml-stripblanks">app-folder-dialog.ui</file>
<file preprocess="xml-stripblanks">screenshot-image.ui</file>
<file preprocess="xml-stripblanks">gs-history-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-shell-category.ui</file>
<file preprocess="xml-stripblanks">gs-shell-details.ui</file>
<file preprocess="xml-stripblanks">gs-shell-updates.ui</file>
<file preprocess="xml-stripblanks">gs-sources-dialog.ui</file>
diff --git a/src/gnome-software.ui b/src/gnome-software.ui
index 92d0592..a39704a 100644
--- a/src/gnome-software.ui
+++ b/src/gnome-software.ui
@@ -854,81 +854,8 @@
<child>
- <object class="GsBox" id="box_category">
+ <object class="GsShellCategory" id="shell_category">
<property name="visible">True</property>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow_filter">
- <property name="visible">True</property>
- <property name="margin-top">15</property>
- <property name="margin-bottom">15</property>
- <property name="margin-left">12</property>
- <property name="margin-right">12</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">automatic</property>
- <property name="shadow_type">none</property>
- <property name="valign">fill</property>
- <child>
- <object class="GtkFrame" id="frame_filter">
- <property name="visible">True</property>
- <property name="shadow_type">in</property>
- <property name="halign">fill</property>
- <property name="valign">start</property>
- <style>
- <class name="view"/>
- </style>
- <child>
- <object class="GtkListBox" id="listbox_filter">
- <property name="visible">True</property>
- <property name="selection_mode">browse</property>
- <property name="halign">fill</property>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="relative_size">1.0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow_category">
- <property name="visible">True</property>
- <property name="shadow_type">none</property>
- <property name="can_focus">False</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">automatic</property>
- <style>
- <class name="main-scrolled-software"/>
- </style>
- <child>
- <object class="GtkViewport" id="viewport3">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkGrid" id="category_detail_grid">
- <property name="margin_start">12</property>
- <property name="margin_end">12</property>
- <property name="margin_top">12</property>
- <property name="margin_bottom">12</property>
- <property name="halign">fill</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="row_spacing">12</property>
- <property name="column_spacing">12</property>
- <property name="row_homogeneous">True</property>
- <property name="column_homogeneous">True</property>
- <property name="hexpand">True</property>
- <property name="valign">start</property>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="relative_size">2.0</property>
- </packing>
- </child>
</object>
<packing>
<property name="name">category</property>
diff --git a/src/gs-shell-category.c b/src/gs-shell-category.c
index 6bb7a66..284847a 100644
--- a/src/gs-shell-category.c
+++ b/src/gs-shell-category.c
@@ -37,9 +37,15 @@ struct GsShellCategoryPrivate {
GsCategory *category;
GtkWidget *col0_placeholder;
GtkWidget *col1_placeholder;
+
+ GtkWidget *category_detail_grid;
+ GtkWidget *frame_filter;
+ GtkWidget *listbox_filter;
+ GtkWidget *scrolledwindow_category;
+ GtkWidget *scrolledwindow_filter;
};
-G_DEFINE_TYPE_WITH_PRIVATE (GsShellCategory, gs_shell_category, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE (GsShellCategory, gs_shell_category, GTK_TYPE_BIN)
void
gs_shell_category_refresh (GsShellCategory *shell)
@@ -81,7 +87,6 @@ gs_shell_category_get_apps_cb (GObject *source_object,
GList *l;
GList *list;
GsApp *app;
- GtkWidget *grid;
GtkWidget *tile;
GsShellCategory *shell = GS_SHELL_CATEGORY (user_data);
GsShellCategoryPrivate *priv = shell->priv;
@@ -97,20 +102,19 @@ gs_shell_category_get_apps_cb (GObject *source_object,
g_error_free (error);
goto out;
}
- grid = GTK_WIDGET (gtk_builder_get_object (priv->builder, "category_detail_grid"));
- gtk_grid_remove_column (GTK_GRID (grid), 1);
- gtk_grid_remove_column (GTK_GRID (grid), 0);
+ gtk_grid_remove_column (GTK_GRID (priv->category_detail_grid), 1);
+ gtk_grid_remove_column (GTK_GRID (priv->category_detail_grid), 0);
for (l = list, i = 0; l != NULL; l = l->next, i++) {
app = GS_APP (l->data);
tile = gs_app_tile_new (app);
g_signal_connect (tile, "clicked",
G_CALLBACK (app_tile_clicked), shell);
- gtk_grid_attach (GTK_GRID (grid), tile, (i % 2), i / 2, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), tile, (i % 2), i / 2, 1, 1);
}
if (i == 1)
- gtk_grid_attach (GTK_GRID (grid), priv->col1_placeholder, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), priv->col1_placeholder, 1, 0, 1, 1);
out:
gs_plugin_list_free (list);
@@ -121,7 +125,6 @@ static void
gs_shell_category_populate_filtered (GsShellCategory *shell)
{
GsShellCategoryPrivate *priv = shell->priv;
- GtkWidget *grid;
GsCategory *parent;
GtkWidget *tile;
guint i;
@@ -139,17 +142,16 @@ gs_shell_category_populate_filtered (GsShellCategory *shell)
gs_category_get_id (priv->category));
}
- grid = GTK_WIDGET (gtk_builder_get_object (priv->builder, "category_detail_grid"));
- gtk_grid_remove_column (GTK_GRID (grid), 1);
- gtk_grid_remove_column (GTK_GRID (grid), 0);
+ gtk_grid_remove_column (GTK_GRID (priv->category_detail_grid), 1);
+ gtk_grid_remove_column (GTK_GRID (priv->category_detail_grid), 0);
for (i = 0; i < MIN (30, gs_category_get_size (priv->category)); i++) {
tile = gs_app_tile_new (NULL);
- gtk_grid_attach (GTK_GRID (grid), tile, (i % 2), i / 2, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), tile, (i % 2), i / 2, 1, 1);
}
- gtk_grid_attach (GTK_GRID (grid), priv->col0_placeholder, 0, 0, 1, 1);
- gtk_grid_attach (GTK_GRID (grid), priv->col1_placeholder, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), priv->col0_placeholder, 0, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), priv->col1_placeholder, 1, 0, 1, 1);
gs_plugin_loader_get_category_apps_async (priv->plugin_loader,
priv->category,
@@ -189,30 +191,23 @@ static void
gs_shell_category_create_filter_list (GsShellCategory *shell, GsCategory *category, GsCategory *subcategory)
{
GsShellCategoryPrivate *priv = shell->priv;
- GtkWidget *grid;
- GtkWidget *list_box;
GtkWidget *row;
GList *list, *l;
GsCategory *s;
- GtkWidget *frame, *swin;
- grid = GTK_WIDGET (gtk_builder_get_object (priv->builder, "category_detail_grid"));
- gs_container_remove_all (GTK_CONTAINER (grid));
+ gs_container_remove_all (GTK_CONTAINER (priv->category_detail_grid));
- frame = GTK_WIDGET (gtk_builder_get_object (priv->builder, "frame_filter"));
- swin = GTK_WIDGET (gtk_builder_get_object (priv->builder, "scrolledwindow_filter"));
- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_NONE);
+ gtk_frame_set_shadow_type (GTK_FRAME (priv->frame_filter), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scrolledwindow_filter),
GTK_SHADOW_NONE);
list = gs_category_get_subcategories (category);
if (!list)
return;
- gtk_grid_attach (GTK_GRID (grid), priv->col0_placeholder, 0, 0, 1, 1);
- gtk_grid_attach (GTK_GRID (grid), priv->col1_placeholder, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), priv->col0_placeholder, 0, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (priv->category_detail_grid), priv->col1_placeholder, 1, 0, 1, 1);
- list_box = GTK_WIDGET (gtk_builder_get_object (priv->builder, "listbox_filter"));
- gs_container_remove_all (GTK_CONTAINER (list_box));
+ gs_container_remove_all (GTK_CONTAINER (priv->listbox_filter));
for (l = list; l; l = l->next) {
s = l->data;
@@ -222,9 +217,9 @@ gs_shell_category_create_filter_list (GsShellCategory *shell, GsCategory *catego
g_object_set_data_full (G_OBJECT (row), "category", g_object_ref (s), g_object_unref);
g_object_set (row, "xalign", 0.0, "margin", 6, NULL);
gtk_widget_show (row);
- gtk_list_box_insert (GTK_LIST_BOX (list_box), row, -1);
+ gtk_list_box_insert (GTK_LIST_BOX (priv->listbox_filter), row, -1);
if (subcategory == s)
- gtk_list_box_select_row (GTK_LIST_BOX (list_box), GTK_LIST_BOX_ROW
(gtk_widget_get_parent (row)));
+ gtk_list_box_select_row (GTK_LIST_BOX (priv->listbox_filter), GTK_LIST_BOX_ROW
(gtk_widget_get_parent (row)));
}
g_list_free (list);
}
@@ -276,6 +271,8 @@ gs_shell_category_init (GsShellCategory *shell)
{
GsShellCategoryPrivate *priv;
+ gtk_widget_init_template (GTK_WIDGET (shell));
+
priv = gs_shell_category_get_instance_private (shell);
shell->priv = priv;
@@ -306,8 +303,17 @@ static void
gs_shell_category_class_init (GsShellCategoryClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->finalize = gs_shell_category_finalize;
+
+ gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/software/gs-shell-category.ui");
+
+ gtk_widget_class_bind_template_child_private (widget_class, GsShellCategory, category_detail_grid);
+ gtk_widget_class_bind_template_child_private (widget_class, GsShellCategory, frame_filter);
+ gtk_widget_class_bind_template_child_private (widget_class, GsShellCategory, listbox_filter);
+ gtk_widget_class_bind_template_child_private (widget_class, GsShellCategory, scrolledwindow_category);
+ gtk_widget_class_bind_template_child_private (widget_class, GsShellCategory, scrolledwindow_filter);
}
static void
@@ -329,27 +335,24 @@ scrollbar_mapped_cb (GtkWidget *sb, GtkScrolledWindow *swin)
static gboolean
key_event (GtkWidget *listbox, GdkEvent *event, GsShellCategory *shell)
{
+ GsShellCategoryPrivate *priv = shell->priv;
guint keyval;
- GtkWidget *sw;
- GtkWidget *grid;
gboolean handled;
if (!gdk_event_get_keyval (event, &keyval))
return FALSE;
- sw = GTK_WIDGET (gtk_builder_get_object (shell->priv->builder, "scrolledwindow_category"));
- grid = GTK_WIDGET (gtk_builder_get_object (shell->priv->builder, "category_detail_grid"));
if (keyval == GDK_KEY_Page_Up ||
keyval == GDK_KEY_KP_Page_Up)
- g_signal_emit_by_name (sw, "scroll-child",
+ g_signal_emit_by_name (priv->scrolledwindow_category, "scroll-child",
GTK_SCROLL_PAGE_UP, FALSE, &handled);
else if (keyval == GDK_KEY_Page_Down ||
keyval == GDK_KEY_KP_Page_Down)
- g_signal_emit_by_name (sw, "scroll-child",
+ g_signal_emit_by_name (priv->scrolledwindow_category, "scroll-child",
GTK_SCROLL_PAGE_DOWN, FALSE, &handled);
else if (keyval == GDK_KEY_Tab ||
keyval == GDK_KEY_KP_Tab)
- gtk_widget_child_focus (grid, GTK_DIR_TAB_FORWARD);
+ gtk_widget_child_focus (priv->category_detail_grid, GTK_DIR_TAB_FORWARD);
else
return FALSE;
@@ -365,7 +368,6 @@ gs_shell_category_setup (GsShellCategory *shell_category,
{
GsShellCategoryPrivate *priv = shell_category->priv;
GtkWidget *widget;
- GtkWidget *sw;
GtkAdjustment *adj;
priv->plugin_loader = g_object_ref (plugin_loader);
@@ -373,22 +375,17 @@ gs_shell_category_setup (GsShellCategory *shell_category,
priv->cancellable = g_cancellable_new ();
priv->shell = shell;
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "listbox_filter"));
- g_signal_connect (widget, "row-selected", G_CALLBACK (filter_selected), shell_category);
- gtk_list_box_set_header_func (GTK_LIST_BOX (widget), add_separator, NULL, NULL);
+ g_signal_connect (priv->listbox_filter, "row-selected", G_CALLBACK (filter_selected), shell_category);
+ gtk_list_box_set_header_func (GTK_LIST_BOX (priv->listbox_filter), add_separator, NULL, NULL);
- sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "scrolledwindow_filter"));
- widget = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (sw));
- g_signal_connect (widget, "map", G_CALLBACK (scrollbar_mapped_cb), sw);
- g_signal_connect (widget, "unmap", G_CALLBACK (scrollbar_mapped_cb), sw);
+ widget = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (priv->scrolledwindow_filter));
+ g_signal_connect (widget, "map", G_CALLBACK (scrollbar_mapped_cb), priv->scrolledwindow_filter);
+ g_signal_connect (widget, "unmap", G_CALLBACK (scrollbar_mapped_cb), priv->scrolledwindow_filter);
- sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "scrolledwindow_category"));
- adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (sw));
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "category_detail_grid"));
- gtk_container_set_focus_vadjustment (GTK_CONTAINER (widget), adj);
+ adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scrolledwindow_category));
+ gtk_container_set_focus_vadjustment (GTK_CONTAINER (priv->category_detail_grid), adj);
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "listbox_filter"));
- g_signal_connect (widget, "key-press-event",
+ g_signal_connect (priv->listbox_filter, "key-press-event",
G_CALLBACK (key_event), shell_category);
}
diff --git a/src/gs-shell-category.h b/src/gs-shell-category.h
index f436400..b88e77b 100644
--- a/src/gs-shell-category.h
+++ b/src/gs-shell-category.h
@@ -42,13 +42,13 @@ typedef struct GsShellCategoryPrivate GsShellCategoryPrivate;
typedef struct
{
- GObject parent;
+ GtkBin parent;
GsShellCategoryPrivate *priv;
} GsShellCategory;
typedef struct
{
- GObjectClass parent_class;
+ GtkBinClass parent_class;
} GsShellCategoryClass;
GType gs_shell_category_get_type (void);
diff --git a/src/gs-shell-category.ui b/src/gs-shell-category.ui
new file mode 100644
index 0000000..85b127a
--- /dev/null
+++ b/src/gs-shell-category.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsShellCategory" parent="GtkBin">
+ <child>
+ <object class="GsBox" id="box_category">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_filter">
+ <property name="visible">True</property>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ <property name="margin-left">12</property>
+ <property name="margin-right">12</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">none</property>
+ <property name="valign">fill</property>
+ <child>
+ <object class="GtkFrame" id="frame_filter">
+ <property name="visible">True</property>
+ <property name="shadow_type">in</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="view"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="listbox_filter">
+ <property name="visible">True</property>
+ <property name="selection_mode">browse</property>
+ <property name="halign">fill</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="relative_size">1.0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_category">
+ <property name="visible">True</property>
+ <property name="shadow_type">none</property>
+ <property name="can_focus">False</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <style>
+ <class name="main-scrolled-software"/>
+ </style>
+ <child>
+ <object class="GtkViewport" id="viewport3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkGrid" id="category_detail_grid">
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="halign">fill</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <property name="row_homogeneous">True</property>
+ <property name="column_homogeneous">True</property>
+ <property name="hexpand">True</property>
+ <property name="valign">start</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="relative_size">2.0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 9919dfa..96fac98 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -547,6 +547,7 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
priv->plugin_loader,
priv->builder,
priv->cancellable);
+ priv->shell_category = GS_SHELL_CATEGORY (gtk_builder_get_object (priv->builder, "shell_category"));
gs_shell_category_setup (priv->shell_category,
shell,
priv->plugin_loader,
@@ -734,7 +735,6 @@ gs_shell_init (GsShell *shell)
shell->priv = gs_shell_get_instance_private (shell);
shell->priv->shell_overview = gs_shell_overview_new ();
shell->priv->shell_installed = gs_shell_installed_new ();
- shell->priv->shell_category = gs_shell_category_new ();
shell->priv->shell_search = gs_shell_search_new ();
shell->priv->ignore_primary_buttons = FALSE;
}
@@ -754,7 +754,6 @@ gs_shell_finalize (GObject *object)
g_object_unref (priv->plugin_loader);
g_object_unref (priv->shell_overview);
g_object_unref (priv->shell_installed);
- g_object_unref (priv->shell_category);
g_object_unref (priv->shell_search);
G_OBJECT_CLASS (gs_shell_parent_class)->finalize (object);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]