[dia] Diagram Tree now sortable



commit d5da7114b7721976a03b7db1548a32eb5e869a88
Author: Hans Breuer <hans breuer org>
Date:   Fri Apr 24 23:22:49 2009 +0200

    Diagram Tree now sortable
---
 app/diagram_tree_model.c |  102 +++++++++++++++++++++++++++++++++++++++++++++-
 app/diagram_tree_view.c  |    5 ++-
 2 files changed, 105 insertions(+), 2 deletions(-)

diff --git a/app/diagram_tree_model.c b/app/diagram_tree_model.c
index e8af9a0..ab1b9fa 100644
--- a/app/diagram_tree_model.c
+++ b/app/diagram_tree_model.c
@@ -273,6 +273,7 @@ _dtm_iter_children (GtkTreeModel *tree_model,
     NODE_OBJECT(iter) = NULL;
     return NODE_DIAGRAM(iter) != NULL;
   }
+  return FALSE;
 }
 static gboolean
 _dtm_iter_has_child (GtkTreeModel *tree_model,
@@ -370,8 +371,107 @@ _dtm_iface_init (GtkTreeModelIface *iface)
 #endif
 }
 
+/* SORTABLE 
+ * Wrapper around the original model to allow sorting by various columns IDs
+ */
+static gint
+cmp_diagram (GtkTreeIter  *a,
+	     GtkTreeIter  *b)
+{
+  DiagramData *pa = NODE_DIAGRAM(a), *pb = NODE_DIAGRAM(b);
+  gchar *na, *nb;
+  gint ret;
+  if (pa == pb)
+    return 0;
+  na = diagram_get_name (DIA_DIAGRAM(pa));
+  nb = diagram_get_name (DIA_DIAGRAM(pa));
+  if (!na || !nb)
+    return (na > nb) ? -1 : 1;
+  ret = strcmp (na, nb);
+  g_free (na);
+  g_free (nb);
+  return ret;
+}
+static gint
+cmp_layer (GtkTreeIter  *a,
+	   GtkTreeIter  *b)
+{
+  Layer *pa = NODE_LAYER(a), *pb = NODE_LAYER(b);
+  gchar *na, *nb;
+  gint ret;
+  if (pa == pb)
+    return 0;
+  na = layer_get_name (pa);
+  nb = layer_get_name (pb);
+  if (!na || !nb)
+    return (na > nb) ? -1 : 1;
+  ret = strcmp (na, nb);
+  g_free (na);
+  g_free (nb);
+  return ret;
+}
+static gint
+name_sort_func (GtkTreeModel *model,
+		GtkTreeIter  *a,
+		GtkTreeIter  *b,
+		gpointer      user_data)
+{
+  DiaObject *pa = NODE_OBJECT(a), *pb = NODE_OBJECT(b);
+  gchar *na, *nb;
+  gint ret = cmp_diagram (a, b);
+  if (ret)
+    return ret;
+  ret = cmp_layer (a, b);
+  if (ret)
+    return ret;
+  if (pa == pb)
+    return 0;
+  else if (!pa || !pb)
+    return (pa > pb) ? -1 : 1;
+  na = object_get_displayname (pa);
+  nb = object_get_displayname (pb);
+  if (!na || !nb)
+      return (na > nb) ? -1 : 1;
+  ret = strcmp (na, nb);
+  g_free (na);
+  g_free (nb);
+  return ret;
+}
+static gint
+type_sort_func (GtkTreeModel *model,
+		GtkTreeIter  *a,
+		GtkTreeIter  *b,
+		gpointer      user_data)
+{
+  DiaObject *pa = NODE_OBJECT(a), *pb = NODE_OBJECT(b);
+  gchar *na, *nb;
+  gint ret = cmp_diagram (a, b);
+  if (ret)
+    return ret;
+  ret = cmp_layer (a, b);
+  if (ret)
+    return ret;
+  if (pa == pb)
+    return 0;
+  else if (!pa || !pb)
+    return (pa > pb) ? -1 : 1;
+  return strcmp (pa->type->name, pb->type->name);
+}
+static GtkTreeModel *
+wrap_as_sortable_model (GtkTreeModel *model)
+{
+  GtkTreeModel *sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
+  
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort_model), NAME_COLUMN, name_sort_func, model, NULL);
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort_model), OBJECT_COLUMN, type_sort_func, model, NULL);
+  
+  return sort_model;
+}
+
 GtkTreeModel *
 diagram_tree_model_new (void)
 {
-  return g_object_new (DIAGRAM_TREE_MODEL, NULL);
+  GtkTreeModel *model = g_object_new (DIAGRAM_TREE_MODEL, NULL);
+  model = wrap_as_sortable_model (model);
+  return model;
 }
diff --git a/app/diagram_tree_view.c b/app/diagram_tree_view.c
index 139d313..d7d4bba 100644
--- a/app/diagram_tree_view.c
+++ b/app/diagram_tree_view.c
@@ -447,6 +447,8 @@ _dtv_init (DiagramTreeView *dtv)
 
   /* this is enough for simple name search (just typing) */
   gtk_tree_view_set_search_column (GTK_TREE_VIEW (dtv), NAME_COLUMN);
+  /* must have a sortable model ... */
+  gtk_tree_view_column_set_sort_column_id (column, NAME_COLUMN);
 
   /* type column - show the type icon */
   column = gtk_tree_view_column_new ();
@@ -454,13 +456,14 @@ _dtv_init (DiagramTreeView *dtv)
   /* must have fixed size, too */
   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
   /* without it gets zero size - not very useful! */
-  gtk_tree_view_column_set_min_width (column, font_size * 4);
+  gtk_tree_view_column_set_min_width (column, font_size * 6);
   gtk_tree_view_column_set_resizable (column, TRUE);
   cell = gtk_cell_renderer_pixbuf_new ();
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), cell, TRUE);
   gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (column), cell,
 				      _dtv_cell_pixbuf_func, dtv, NULL);
   gtk_tree_view_insert_column (GTK_TREE_VIEW (dtv), column, -1);
+  gtk_tree_view_column_set_sort_column_id (column, OBJECT_COLUMN);
 
   /*  TODO: other fancy stuff */
 



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