summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--ChangeLog.pre-2-09
-rw-r--r--ChangeLog.pre-2-109
-rw-r--r--ChangeLog.pre-2-29
-rw-r--r--ChangeLog.pre-2-49
-rw-r--r--ChangeLog.pre-2-69
-rw-r--r--ChangeLog.pre-2-89
-rw-r--r--gtk/gtkrbtree.c95
-rw-r--r--gtk/gtkrbtree.h6
-rw-r--r--gtk/gtktreeview.c29
-rw-r--r--tests/testtreesort.c2
11 files changed, 187 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index c742455edb..51700f8c45 100644
--- 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.
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -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.
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -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.
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -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.
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -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.
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -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.
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index c742455edb..51700f8c45 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -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.
diff --git a/gtk/gtkrbtree.c b/gtk/gtkrbtree.c
index f4e7a17936..878a577a62 100644
--- a/gtk/gtkrbtree.c
+++ b/gtk/gtkrbtree.c
@@ -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)
diff --git a/gtk/gtkrbtree.h b/gtk/gtkrbtree.h
index 8937b3200d..932648166f 100644
--- a/gtk/gtkrbtree.h
+++ b/gtk/gtkrbtree.h
@@ -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,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 1410dc70e3..ad9374947d 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -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)
diff --git a/tests/testtreesort.c b/tests/testtreesort.c
index cc084d465e..30d5ca3149 100644
--- a/tests/testtreesort.c
+++ b/tests/testtreesort.c
@@ -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"},