]> Pileus Git - ~andy/gtk/commitdiff
new function to handle reordering of trees. Seems to mostly work w/ the
authorJonathan Blandford <jrb@redhat.com>
Wed, 28 Mar 2001 22:27:20 +0000 (22:27 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Wed, 28 Mar 2001 22:27:20 +0000 (22:27 +0000)
Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>

* gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
handle reordering of trees.  Seems to mostly work w/ the exception
of the parity flag.

* gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
signal.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkrbtree.c
gtk/gtkrbtree.h
gtk/gtktreeview.c
tests/testtreesort.c

index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index c742455edb5d08ee37e38d0ce65a0022f011b875..51700f8c4573a01c4e55c696db7fe2fea81c4253 100644 (file)
@@ -1,3 +1,12 @@
+Wed Mar 28 17:27:12 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_reorder): new function to
+       handle reordering of trees.  Seems to mostly work w/ the exception
+       of the parity flag.
+
+       * gtk/gtktreeview.c (gtk_tree_view_reordered): handle "reordered"
+       signal.
+
 Wed Mar 28 21:12:37 2001  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkwidget.h: c++ fixes.
index f4e7a1793636c03eda5f6a4aea75f94e1937886e..878a577a62cf091e455c705d857e4804a267111b 100644 (file)
@@ -714,6 +714,101 @@ _gtk_rbtree_node_set_height (GtkRBTree *tree,
     }
 }
 
+typedef struct _GtkRBReorder
+{
+  GtkRBTree *children;
+  gint height;
+  gint flags;
+  gint order;
+} GtkRBReorder;
+
+static int
+gtk_rbtree_reorder_sort_func (gconstpointer a,
+                             gconstpointer b)
+{
+  return ((GtkRBReorder *) a)->order > ((GtkRBReorder *) b)->order;
+}
+
+static void
+gtk_rbtree_reorder_fixup (GtkRBTree *tree,
+                         GtkRBNode *node)
+{
+  if (node == tree->nil)
+    return;
+
+  if (node->left != tree->nil)
+    {
+      gtk_rbtree_reorder_fixup (tree, node->left);
+      node->offset += node->left->offset;
+    }
+  if (node->right != tree->nil)
+    {
+      gtk_rbtree_reorder_fixup (tree, node->right);
+      node->offset += node->right->offset;
+    }
+      
+  if (node->children)
+    node->offset += node->children->root->offset;
+}
+
+/* It basically pulls everything out of the tree, rearranges it, and puts it
+ * back together.  Our strategy is to keep the old RBTree intact, and just
+ * rearrange the contents.  When that is done, we go through and update the
+ * heights.  There is probably a more elegant way to write this function.  If
+ * anyone wants to spend the time writing it, patches will be accepted.
+ */
+
+void
+_gtk_rbtree_reorder (GtkRBTree *tree,
+                    gint      *new_order,
+                    gint       length)
+{
+  GtkRBReorder reorder;
+  GArray *array;
+  GtkRBNode *node;
+  gint i;
+
+  node = tree->root;
+  while (node && node->left != tree->nil)
+    node = node->left;
+
+  /* Sort the trees values in the new tree. */
+  array = g_array_sized_new (FALSE, FALSE, sizeof (GtkRBReorder), length);
+  for (i = 0; i < length; i++)
+    {
+      g_assert (node != tree->nil);
+      reorder.children = node->children;
+      reorder.flags = GTK_RBNODE_NON_COLORS & node->flags;
+      reorder.height = GTK_RBNODE_GET_HEIGHT (node);
+      reorder.order = new_order[i];
+      g_array_append_val (array, reorder);
+
+      node = _gtk_rbtree_next (tree, node);
+    }
+
+  g_array_sort (array, gtk_rbtree_reorder_sort_func);
+
+  /* rewind node*/
+  node = tree->root;
+  while (node && node->left != tree->nil)
+    node = node->left;
+
+  /* Go through the tree and change the values to the new ones. */
+  for (i = 0; i < length; i++)
+    {
+      reorder = g_array_index (array, GtkRBReorder, i);
+
+      node->children = reorder.children;
+      node->flags = GTK_RBNODE_GET_COLOR (node) | reorder.flags;
+      /* We temporarily set the height to this. */
+      node->offset = reorder.height;
+      node = _gtk_rbtree_next (tree, node);
+    }
+
+  gtk_rbtree_reorder_fixup (tree, tree->root);
+}
+
+
 gint
 _gtk_rbtree_node_find_offset (GtkRBTree *tree,
                              GtkRBNode *node)
index 8937b3200d7346ee04cbe983998f7ac9d9a86082..932648166ff9158708a9f46ec1f0d5d477b73fae 100644 (file)
@@ -32,8 +32,7 @@ typedef enum
   GTK_RBNODE_IS_PARENT = 1 << 2,
   GTK_RBNODE_IS_SELECTED = 1 << 3,
   GTK_RBNODE_IS_PRELIT = 1 << 4,
-  GTK_RBNODE_IS_VIEW = 1 << 5,
-  GTK_RBNODE_NON_COLORS = GTK_RBNODE_IS_PARENT | GTK_RBNODE_IS_SELECTED | GTK_RBNODE_IS_PRELIT | GTK_RBNODE_IS_VIEW,
+  GTK_RBNODE_NON_COLORS = GTK_RBNODE_IS_PARENT | GTK_RBNODE_IS_SELECTED | GTK_RBNODE_IS_PRELIT,
 } GtkRBNodeColor;
 
 typedef struct _GtkRBTree GtkRBTree;
@@ -110,6 +109,9 @@ GtkRBNode *_gtk_rbtree_insert_after     (GtkRBTree              *tree,
                                         gint                    height);
 void       _gtk_rbtree_remove_node      (GtkRBTree              *tree,
                                         GtkRBNode              *node);
+void       _gtk_rbtree_reorder          (GtkRBTree              *tree,
+                                        gint                   *new_order,
+                                        gint                    length);
 GtkRBNode *_gtk_rbtree_find_count       (GtkRBTree              *tree,
                                         gint                    count);
 void       _gtk_rbtree_node_set_height  (GtkRBTree              *tree,
index 1410dc70e367c7a1b4c4c12473bb2bb3568136a7..ad9374947da464adbaefa24b7e0d58972a502b57 100644 (file)
@@ -3016,7 +3016,8 @@ gtk_tree_view_reordered (GtkTreeModel *model,
                         gpointer      data)
 {
   GtkTreeView *tree_view = GTK_TREE_VIEW (data);
-  GArray *array;
+  GtkRBTree *tree;
+  GtkRBNode *node;
   gint len;
 
   len = gtk_tree_model_iter_n_children (model, iter);
@@ -3024,7 +3025,25 @@ gtk_tree_view_reordered (GtkTreeModel *model,
   if (len < 2)
     return;
 
-  gtk_widget_queue_draw (GTK_WIDGET (data));
+  if (_gtk_tree_view_find_node (tree_view,
+                               parent,
+                               &tree,
+                               &node))
+    return;
+
+  /* We need to special case the parent path */
+  if (tree == NULL)
+    tree = tree_view->priv->tree;
+  else
+    tree = node->children;
+
+  if (tree == NULL)
+    return;
+
+  /* FIXME: we need to unprelight our tree, if it's prelit. */
+  _gtk_rbtree_reorder (tree, new_order, len);
+
+  gtk_widget_queue_draw (GTK_WIDGET (tree_view));
 }
 
 /* Internal tree functions */
@@ -3474,9 +3493,7 @@ _gtk_tree_view_find_path (GtkTreeView *tree_view,
   return path;
 }
 
-/* Returns TRUE if we ran out of tree before finding the node,
- * so the returned node is the last node we saw and the returned
- * tree is NULL
+/* Returns TRUE if we ran out of tree before finding the path.
  */
 gboolean
 _gtk_tree_view_find_node (GtkTreeView  *tree_view,
@@ -3493,6 +3510,8 @@ _gtk_tree_view_find_node (GtkTreeView  *tree_view,
   *node = NULL;
   *tree = NULL;
 
+  if (depth == 0)
+    return FALSE;
   do
     {
       if (tmptree == NULL)
index cc084d465e9b302927577ef6fb7a64cc7a5c4e4f..30d5ca3149c897c45685153c4307f37f1a62e81f 100644 (file)
@@ -16,7 +16,7 @@ static ListSort data[] =
   { "Oranges", "Wicker", "Adamantine", "Convivial" },
   { "Bovine Spongiform Encephilopathy", "Sleazebucket", "Mountaineer", "Pander" },
   { "Foot and Mouth", "Lampshade", "Skim Milk Full Milk", "Viewless" },
-  { "Blood, sweat, tears", "The Man", "Horses", "Muckety-Muck" },
+  { "Blood,\nsweat,\ntears", "The Man", "Horses", "Muckety-Muck" },
   { "Rare Steak", "Siam", "Watchdog", "Xantippe" },
   { "SIGINT", "Rabbit Breath", "Alligator", "Bloodstained" },
   { "Google", "Chrysanthemums", "Hobnob", "Leapfrog"},