[gtk+/composite-templates-new: 13/13] GtkAppChooserWidget: Define GtkTreeStore and cell renderers with the GtkBuilder template



commit 81a9f4e6439cbbed8eea10b97e1757f4399c15dd
Author: Tristan Van Berkom <tristanvb openismus com>
Date:   Sat Mar 23 22:20:54 2013 +0900

    GtkAppChooserWidget: Define GtkTreeStore and cell renderers with the GtkBuilder template
    
    This is in a separate commit as the implementation may be delicate.

 gtk/gtkappchooserwidget.c |  122 +++++++++++++-------------------------------
 1 files changed, 36 insertions(+), 86 deletions(-)
---
diff --git a/gtk/gtkappchooserwidget.c b/gtk/gtkappchooserwidget.c
index c32bf04..0ec0747 100644
--- a/gtk/gtkappchooserwidget.c
+++ b/gtk/gtkappchooserwidget.c
@@ -82,7 +82,9 @@ struct _GtkAppChooserWidgetPrivate {
   GtkWidget *program_list;
   GtkListStore *program_list_store;
 
+  GtkTreeViewColumn *column;
   GtkCellRenderer *padding_renderer;
+  GtkCellRenderer *secondary_padding;
 };
 
 enum {
@@ -799,95 +801,12 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self)
 }
 
 static void
-gtk_app_chooser_widget_add_items (GtkAppChooserWidget *self)
+gtk_app_chooser_widget_initialize_items (GtkAppChooserWidget *self)
 {
-  GtkCellRenderer *renderer;
-  GtkTreeViewColumn *column;
-  GtkTreeModel *sort;
-
-  /* create list store */
-  self->priv->program_list_store = gtk_list_store_new (NUM_COLUMNS,
-                                                       G_TYPE_APP_INFO,
-                                                       G_TYPE_ICON,
-                                                       G_TYPE_STRING,
-                                                       G_TYPE_STRING,
-                                                       G_TYPE_STRING,
-                                                       G_TYPE_BOOLEAN,
-                                                       G_TYPE_BOOLEAN,
-                                                       G_TYPE_STRING,
-                                                       G_TYPE_BOOLEAN,
-                                                       G_TYPE_BOOLEAN);
-  sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (self->priv->program_list_store));
-
-  gtk_tree_view_set_model (GTK_TREE_VIEW (self->priv->program_list),
-                           GTK_TREE_MODEL (sort));
-  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort),
-                                        COLUMN_NAME,
-                                        GTK_SORT_ASCENDING);
-  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort),
-                                   COLUMN_NAME,
-                                   gtk_app_chooser_sort_func,
-                                   self, NULL);
-  gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->priv->program_list),
-                                   COLUMN_NAME);
-  gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (self->priv->program_list),
-                                       gtk_app_chooser_search_equal_func,
-                                       NULL, NULL);
-
-  column = gtk_tree_view_column_new ();
-
   /* initial padding */
-  renderer = gtk_cell_renderer_text_new ();
-  gtk_tree_view_column_pack_start (column, renderer, FALSE);
-  g_object_set (renderer,
+  g_object_set (self->priv->padding_renderer,
                 "xpad", self->priv->show_all ? 0 : 6,
                 NULL);
-  self->priv->padding_renderer = renderer;
-
-  /* heading text renderer */
-  renderer = gtk_cell_renderer_text_new ();
-  gtk_tree_view_column_pack_start (column, renderer, FALSE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                       "markup", COLUMN_HEADING_TEXT,
-                                       "visible", COLUMN_HEADING,
-                                       NULL);
-  g_object_set (renderer,
-                "ypad", 6,
-                "xpad", 0,
-                "wrap-width", 350,
-                "wrap-mode", PANGO_WRAP_WORD,
-                NULL);
-
-  /* padding renderer for non-heading cells */
-  renderer = gtk_cell_renderer_text_new ();
-  gtk_tree_view_column_pack_start (column, renderer, FALSE);
-  gtk_tree_view_column_set_cell_data_func (column, renderer,
-                                           padding_cell_renderer_func,
-                                           NULL, NULL);
-
-  /* app icon renderer */
-  renderer = gtk_cell_renderer_pixbuf_new ();
-  gtk_tree_view_column_pack_start (column, renderer, FALSE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                       "gicon", COLUMN_GICON,
-                                       NULL);
-  g_object_set (renderer,
-                "stock-size", GTK_ICON_SIZE_MENU,
-                NULL);
-
-  /* app name renderer */
-  renderer = gtk_cell_renderer_text_new ();
-  gtk_tree_view_column_pack_start (column, renderer, TRUE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                       "markup", COLUMN_DESC,
-                                       NULL);
-  g_object_set (renderer,
-                "ellipsize", PANGO_ELLIPSIZE_END,
-                "ellipsize-set", TRUE,
-                NULL);
-  
-  gtk_tree_view_column_set_sort_column_id (column, COLUMN_NAME);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->program_list), column);
 
   /* populate the widget */
   gtk_app_chooser_widget_real_add_items (self);
@@ -975,7 +894,7 @@ gtk_app_chooser_widget_constructed (GObject *object)
   if (G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->constructed != NULL)
     G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->constructed (object);
 
-  gtk_app_chooser_widget_add_items (self);
+  gtk_app_chooser_widget_initialize_items (self);
 }
 
 static void
@@ -1168,6 +1087,14 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass)
                                    "/org/gtk/libgtk/gtkappchooserwidget.ui");
   gtk_container_class_automate_child (container_class, "program_list", FALSE, GTK_AUTOMATE_CHILD_PRIVATE,
                                      G_STRUCT_OFFSET (GtkAppChooserWidgetPrivate, program_list));
+  gtk_container_class_automate_child (container_class, "program_list_store", FALSE, 
GTK_AUTOMATE_CHILD_PRIVATE,
+                                     G_STRUCT_OFFSET (GtkAppChooserWidgetPrivate, program_list_store));
+  gtk_container_class_automate_child (container_class, "column", FALSE, GTK_AUTOMATE_CHILD_PRIVATE,
+                                     G_STRUCT_OFFSET (GtkAppChooserWidgetPrivate, column));
+  gtk_container_class_automate_child (container_class, "padding_renderer", FALSE, GTK_AUTOMATE_CHILD_PRIVATE,
+                                     G_STRUCT_OFFSET (GtkAppChooserWidgetPrivate, padding_renderer));
+  gtk_container_class_automate_child (container_class, "secondary_padding", FALSE, 
GTK_AUTOMATE_CHILD_PRIVATE,
+                                     G_STRUCT_OFFSET (GtkAppChooserWidgetPrivate, secondary_padding));
   gtk_container_class_declare_callbacks (container_class,
                                         "refresh_and_emit_app_selected", 
(GCallback)refresh_and_emit_app_selected,
                                         "program_list_selection_activated", 
(GCallback)program_list_selection_activated,
@@ -1181,15 +1108,38 @@ static void
 gtk_app_chooser_widget_init (GtkAppChooserWidget *self)
 {
   GtkTreeSelection *selection;
+  GtkTreeModel *sort;
 
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTK_TYPE_APP_CHOOSER_WIDGET,
                                             GtkAppChooserWidgetPrivate);
 
   gtk_container_init_template (GTK_CONTAINER (self));
 
+  /* Various parts of the GtkTreeView code need custom code to setup, mostly
+   * because we lack signals to connect to, or properties to set.
+   */
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->program_list));
   gtk_tree_selection_set_select_function (selection, gtk_app_chooser_selection_func,
                                           self, NULL);
+
+  sort = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list));
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort),
+                                        COLUMN_NAME,
+                                        GTK_SORT_ASCENDING);
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort),
+                                   COLUMN_NAME,
+                                   gtk_app_chooser_sort_func,
+                                   self, NULL);
+
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->priv->program_list), COLUMN_NAME);
+  gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (self->priv->program_list),
+                                       gtk_app_chooser_search_equal_func,
+                                       NULL, NULL);
+
+  gtk_tree_view_column_set_cell_data_func (self->priv->column,
+                                          self->priv->secondary_padding,
+                                           padding_cell_renderer_func,
+                                           NULL, NULL);
 }
 
 static GAppInfo *


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