diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 9 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 9 | ||||
-rw-r--r-- | gtk/gtkrbtree.c | 95 | ||||
-rw-r--r-- | gtk/gtkrbtree.h | 6 | ||||
-rw-r--r-- | gtk/gtktreeview.c | 29 | ||||
-rw-r--r-- | tests/testtreesort.c | 2 |
11 files changed, 187 insertions, 8 deletions
@@ -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"}, |