[gtk+] gtk-demo: Expand the filter model example



commit b847937772a1d2c2be98053fe849eca73aa58c7b
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jul 24 14:27:08 2015 -0400

    gtk-demo: Expand the filter model example
    
    Show normal filtering as well.

 demos/gtk-demo/demo.gresource.xml |    3 +
 demos/gtk-demo/filtermodel.c      |  104 +++++++++++--------
 demos/gtk-demo/filtermodel.ui     |  206 +++++++++++++++++++++++++++++++++++++
 3 files changed, 270 insertions(+), 43 deletions(-)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index c3dd82c..2ac7dd5 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -193,4 +193,7 @@
   <gresource prefix="/spinbutton">
     <file>spinbutton.ui</file>
   </gresource>
+  <gresource prefix="/filtermodel">
+    <file>filtermodel.ui</file>
+  </gresource>
 </gresources>
diff --git a/demos/gtk-demo/filtermodel.c b/demos/gtk-demo/filtermodel.c
index c2acea3..bca6674 100644
--- a/demos/gtk-demo/filtermodel.c
+++ b/demos/gtk-demo/filtermodel.c
@@ -1,8 +1,8 @@
 /* Tree View/Filter Model
  *
- * This example demonstrates how GtkTreeModelFilter can be used
- * to compute columns that are not actually present in the underlying
- * model.
+ * This example demonstrates how GtkTreeModelFilter can be used not
+ * just to show a subset of the rows, but also to compute columns
+ * that are not actually present in the underlying model.
  */
 
 #include <gtk/gtk.h>
@@ -69,6 +69,20 @@ filter_modify_func (GtkTreeModel *model,
     }
 }
 
+static gboolean
+visible_func (GtkTreeModel *model,
+              GtkTreeIter  *iter,
+              gpointer      data)
+{
+  gint width;
+
+  gtk_tree_model_get (model, iter,
+                      WIDTH_COLUMN, &width,
+                      -1);
+
+  return width < 10;
+}
+
 GtkWidget *
 do_filtermodel (GtkWidget *do_widget)
 {
@@ -82,62 +96,47 @@ do_filtermodel (GtkWidget *do_widget)
 
   if (!window)
     {
-      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      GtkBuilder *builder;
+
+      builder = gtk_builder_new_from_resource ("/filtermodel/filtermodel.ui");
+      gtk_builder_connect_signals (builder, NULL);
+      window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
       gtk_window_set_screen (GTK_WINDOW (window),
                              gtk_widget_get_screen (do_widget));
-      gtk_window_set_title (GTK_WINDOW (window), "Filter Model");
       g_signal_connect (window, "destroy",
                         G_CALLBACK (gtk_widget_destroyed), &window);
 
-      tree = gtk_tree_view_new ();
-      gtk_container_add (GTK_CONTAINER (window), tree);
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn1");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext1");
+      gtk_tree_view_column_set_cell_data_func (column, cell,
+                                               format_number, GINT_TO_POINTER (WIDTH_COLUMN), NULL);
+
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn2");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext2");
+      gtk_tree_view_column_set_cell_data_func (column, cell,
+                                               format_number, GINT_TO_POINTER (HEIGHT_COLUMN), NULL);
 
-      column = gtk_tree_view_column_new ();
-      gtk_tree_view_column_set_title (column, "Width");
-      cell = gtk_cell_renderer_text_new ();
-      gtk_tree_view_column_pack_start (column, cell, FALSE);
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn3");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext3");
       gtk_tree_view_column_set_cell_data_func (column, cell,
                                                format_number, GINT_TO_POINTER (WIDTH_COLUMN), NULL);
-      gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
-      column = gtk_tree_view_column_new ();
-      gtk_tree_view_column_set_title (column, "Height");
-      cell = gtk_cell_renderer_text_new ();
-      gtk_tree_view_column_pack_start (column, cell, FALSE);
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn4");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext4");
       gtk_tree_view_column_set_cell_data_func (column, cell,
                                                format_number, GINT_TO_POINTER (HEIGHT_COLUMN), NULL);
-      gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
-      column = gtk_tree_view_column_new ();
-      gtk_tree_view_column_set_title (column, "Area");
-      cell = gtk_cell_renderer_text_new ();
-      gtk_tree_view_column_pack_start (column, cell, FALSE);
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn5");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext5");
       gtk_tree_view_column_set_cell_data_func (column, cell,
                                                format_number, GINT_TO_POINTER (AREA_COLUMN), NULL);
-      gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
-      column = gtk_tree_view_column_new ();
-      gtk_tree_view_column_set_title (column, "Square");
-      cell = gtk_cell_renderer_pixbuf_new ();
-      g_object_set (cell, "icon-name", "object-select-symbolic", NULL);
-      gtk_tree_view_column_pack_start (column, cell, FALSE);
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn6");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrendererpixbuf1");
       gtk_tree_view_column_add_attribute (column, cell, "visible", SQUARE_COLUMN);
-      gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
-
-      store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_INT);
-      store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_INT);
-      gtk_list_store_insert_with_values (store, NULL, -1,
-                                         WIDTH_COLUMN, 10,
-                                         HEIGHT_COLUMN, 20,
-                                         -1);
-      gtk_list_store_insert_with_values (store, NULL, -1,
-                                         WIDTH_COLUMN, 5,
-                                         HEIGHT_COLUMN, 25,
-                                         -1);
-      gtk_list_store_insert_with_values (store, NULL, -1,
-                                         WIDTH_COLUMN, 15,
-                                         HEIGHT_COLUMN, 15,
-                                         -1);
+
+      store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1");
+      tree = (GtkWidget*)gtk_builder_get_object (builder, "treeview2");
 
       types[WIDTH_COLUMN] = G_TYPE_INT;
       types[HEIGHT_COLUMN] = G_TYPE_INT;
@@ -149,6 +148,25 @@ do_filtermodel (GtkWidget *do_widget)
                                              filter_modify_func, NULL, NULL);
 
       gtk_tree_view_set_model (GTK_TREE_VIEW (tree), model);
+
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn7");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext6");
+      gtk_tree_view_column_set_cell_data_func (column, cell,
+                                               format_number, GINT_TO_POINTER (WIDTH_COLUMN), NULL);
+
+      column = (GtkTreeViewColumn*)gtk_builder_get_object (builder, "treeviewcolumn8");
+      cell = (GtkCellRenderer*)gtk_builder_get_object (builder, "cellrenderertext7");
+      gtk_tree_view_column_set_cell_data_func (column, cell,
+                                               format_number, GINT_TO_POINTER (HEIGHT_COLUMN), NULL);
+
+      tree = (GtkWidget*)gtk_builder_get_object (builder, "treeview3");
+
+      model = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+      gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
+                                              visible_func, NULL, NULL);
+      gtk_tree_view_set_model (GTK_TREE_VIEW (tree), model);
+
+      g_object_unref (builder);
     }
 
   if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/filtermodel.ui b/demos/gtk-demo/filtermodel.ui
new file mode 100644
index 0000000..e55b555
--- /dev/null
+++ b/demos/gtk-demo/filtermodel.ui
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.16"/>
+  <object class="GtkListStore" id="liststore1">
+    <columns>
+      <!-- column-name width -->
+      <column type="gint"/>
+      <!-- column-name height -->
+      <column type="gint"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0">10</col>
+        <col id="1">20</col>
+      </row>
+      <row>
+        <col id="0">5</col>
+        <col id="1">25</col>
+      </row>
+      <row>
+        <col id="0">15</col>
+        <col id="1">15</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Filter Model</property>
+    <child>
+      <object class="GtkGrid" id="grid1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin_left">10</property>
+        <property name="margin_right">10</property>
+        <property name="margin_top">10</property>
+        <property name="margin_bottom">10</property>
+        <property name="row_spacing">10</property>
+        <property name="column_spacing">10</property>
+        <property name="column_homogeneous">True</property>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Original</property>
+            <property name="xalign">0</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTreeView" id="treeview1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="model">liststore1</property>
+            <property name="headers_clickable">False</property>
+            <child internal-child="selection">
+              <object class="GtkTreeSelection" id="treeview-selection1"/>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+                <property name="title" translatable="yes">Width</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+                <property name="title" translatable="yes">Height</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTreeView" id="treeview2">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="headers_clickable">False</property>
+            <property name="search_column">0</property>
+            <child internal-child="selection">
+              <object class="GtkTreeSelection" id="treeview-selection3"/>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn3">
+                <property name="title" translatable="yes">Width</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext3"/>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn4">
+                <property name="title" translatable="yes">Height</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext4"/>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn5">
+                <property name="title" translatable="yes">Area</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext5"/>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn6">
+                <property name="title" translatable="yes">Square</property>
+                <child>
+                  <object class="GtkCellRendererPixbuf" id="cellrendererpixbuf1">
+                    <property name="icon-name">object-select-symbolic</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Computed Columns</property>
+            <property name="xalign">0</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Filtered</property>
+            <property name="xalign">0</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTreeView" id="treeview3">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="headers_clickable">False</property>
+            <property name="search_column">0</property>
+            <child internal-child="selection">
+              <object class="GtkTreeSelection" id="treeview-selection5"/>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn7">
+                <property name="title" translatable="yes">Width</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext6"/>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkTreeViewColumn" id="treeviewcolumn8">
+                <property name="title" translatable="yes">Height</property>
+                <child>
+                  <object class="GtkCellRendererText" id="cellrenderertext7"/>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">3</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>


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