diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 16 | ||||
-rw-r--r-- | gtk/gtkcellrenderertoggle.c | 4 | ||||
-rw-r--r-- | gtk/gtkliststore.c | 1 | ||||
-rw-r--r-- | gtk/gtktextview.c | 2 | ||||
-rw-r--r-- | gtk/gtktreemodel.c | 1 | ||||
-rw-r--r-- | gtk/gtktreeprivate.h | 7 | ||||
-rw-r--r-- | gtk/gtktreestore.c | 1 | ||||
-rw-r--r-- | gtk/gtktreeview.c | 288 | ||||
-rw-r--r-- | gtk/gtktreeview.h | 29 | ||||
-rw-r--r-- | gtk/gtktreeviewcolumn.c | 67 | ||||
-rw-r--r-- | gtk/gtktreeviewcolumn.h | 6 | ||||
-rw-r--r-- | tests/testgtk.c | 2 | ||||
-rw-r--r-- | tests/testtreefocus.c | 248 | ||||
-rw-r--r-- | tests/testtreesort.c | 35 |
20 files changed, 644 insertions, 159 deletions
@@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index ef8a85ae2..30cba023a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +Sun Apr 8 05:36:06 2001 Jonathan Blandford <jrb@webwynk.net> + + * gtk/gtktextview.c (gtk_text_view_class_init): fix a fixme. + + * gtk/gtkcellrendertoggle.c: change GTK_TYPE_POINTER to + GTK_TYPE_STRING. + + * gtk/gtktreeview.c: New functions to allow initial column + dragging work. + + * gtk/gtktreeviewcolumn.c: Initial column dragging support. + + * tests/testtreefocus.c: give dave some love. + + * tests/testtreesort.c: Modify test to check really long samples. + 2001-04-11 Alexander Larsson <alexl@redhat.com> * gtk-2.0.m4: Pass pkg-config options diff --git a/gtk/gtkcellrenderertoggle.c b/gtk/gtkcellrenderertoggle.c index 3970f3246..281c4adbe 100644 --- a/gtk/gtkcellrenderertoggle.c +++ b/gtk/gtkcellrenderertoggle.c @@ -145,9 +145,9 @@ gtk_cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class) GTK_RUN_LAST, GTK_CLASS_TYPE (object_class), GTK_SIGNAL_OFFSET (GtkCellRendererToggleClass, toggled), - gtk_marshal_VOID__POINTER, + gtk_marshal_VOID__STRING, GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); + GTK_TYPE_STRING); } static void diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c index 1a4d0710f..5737a306e 100644 --- a/gtk/gtkliststore.c +++ b/gtk/gtkliststore.c @@ -723,6 +723,7 @@ gtk_list_store_set_valist (GtkListStore *list_store, break; } + /* FIXME: instead of calling this n times, refactor with above */ gtk_list_store_set_value (list_store, iter, column, diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index b60250b73..9cba2fffe 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -516,7 +516,7 @@ gtk_text_view_class_init (GtkTextViewClass *klass) GTK_ARG_READWRITE, ARG_RIGHT_MARGIN); gtk_object_add_arg_type ("GtkTextView::indent", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_INDENT); - gtk_object_add_arg_type ("GtkTextView::tabs", GTK_TYPE_POINTER, /* FIXME */ + gtk_object_add_arg_type ("GtkTextView::tabs", GTK_TYPE_PANGO_TAB_ARRAY, GTK_ARG_READWRITE, ARG_TABS); /* diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index 7356e7aae..982639b30 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -64,7 +64,6 @@ gtk_tree_model_get_type (void) return tree_model_type; } - static void gtk_tree_model_base_init (gpointer g_class) { diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index cc2f89dd3..1d6076a93 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -87,6 +87,8 @@ struct _GtkTreeViewPrivate GdkWindow *bin_window; GdkWindow *header_window; + GdkWindow *drag_window; + GtkTreeViewColumn *drag_column; gint expander_column; @@ -116,6 +118,8 @@ struct _GtkTreeViewPrivate gint n_columns; GList *columns; gint header_height; + GtkTreeViewColumnDropFunc *column_drop_func; + GList *column_drag_info; /* Scroll timeout (e.g. during dnd) */ guint scroll_timeout; @@ -232,7 +236,8 @@ void _gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column); void _gtk_tree_view_column_set_tree_view (GtkTreeViewColumn *column, GtkTreeView *tree_view); void _gtk_tree_view_column_unset_tree_view (GtkTreeViewColumn *column); - +void _gtk_tree_view_column_start_drag (GtkTreeView *tree_view, + GtkTreeViewColumn *column); GtkTreeSelection* _gtk_tree_selection_new (void); GtkTreeSelection* _gtk_tree_selection_new_with_tree_view (GtkTreeView *tree_view); diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 6fc2d963e..cc7c17835 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -741,6 +741,7 @@ gtk_tree_store_set_valist (GtkTreeStore *tree_store, break; } + /* FIXME: instead of calling this n times, refactor with above */ gtk_tree_store_set_value (tree_store, iter, column, diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index e8a14ed3a..a4a115a6a 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -34,6 +34,16 @@ #include <gdk/gdkkeysyms.h> +#if defined (GDK_WINDOWING_X11) +#include "x11/gdkx.h" +#elif defined (GDK_WINDOWING_WIN32) +#include "win32/gdkwin32.h" +#elif defined(GDK_WINDOWING_FB) +#include "linux-fb/gdkfb.h" +#elif defined (GDK_WINDOWING_NANOX) +#include "nanox/gdkprivate-nanox.h" +#endif + /* The "background" areas of all rows/cells add up to cover the entire tree. * The background includes all inter-row and inter-cell spacing. @@ -59,6 +69,16 @@ struct _GtkTreeViewChild gint y; }; + +typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder; +struct _GtkTreeViewColumnReorder +{ + gint left_align; + gint right_align; + GtkTreeViewColumn *left_column; + GtkTreeViewColumn *right_column; +}; + enum { ROW_ACTIVATED, @@ -241,11 +261,6 @@ static void gtk_tree_view_discover_dirty (GtkTreeView *tree_view, GtkTreeIter *iter, gint depth); static void gtk_tree_view_check_dirty (GtkTreeView *tree_view); -#if 0 -static void gtk_tree_view_create_button (GtkTreeView *tree_view, - gint i); -static void gtk_tree_view_create_buttons (GtkTreeView *tree_view); -#endif static void gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view, GtkRBTree *tree, GtkRBNode *node); @@ -459,6 +474,7 @@ gtk_tree_view_init (GtkTreeView *tree_view) tree_view->priv->pressed_button = -1; tree_view->priv->press_start_x = -1; tree_view->priv->press_start_y = -1; + tree_view->priv->drag_window = NULL; gtk_tree_view_set_adjustments (tree_view, NULL, NULL); _gtk_tree_view_update_size (tree_view); @@ -1613,6 +1629,49 @@ ensure_unprelighted (GtkTreeView *tree_view) do_unprelight (tree_view, -1000, -1000); /* coords not possibly over an arrow */ } + +static gint +gtk_tree_view_column_button_expose (GtkWidget *button, + GdkEventExpose *event, + gpointer right) +{ + if (button->window != event->window) + return FALSE; + + if (GPOINTER_TO_INT (right)) + { + if (event->area.x + event->area.width < button->allocation.width - 2) + return FALSE; + + gdk_draw_line (button->window, + button->style->black_gc, + button->allocation.width - 2, 0, + button->allocation.width - 2, + button->allocation.height); + gdk_draw_line (button->window, + button->style->white_gc, + button->allocation.width - 1, 0, + button->allocation.width - 1, + button->allocation.height); + } + else + { + if (event->area.x > 2) + return FALSE; + + gdk_draw_line (button->window, + button->style->black_gc, + 1, 0, + 1, button->allocation.height); + gdk_draw_line (button->window, + button->style->white_gc, + 0, 0, + 0, button->allocation.height); + } + + return FALSE; +} + static gboolean gtk_tree_view_motion (GtkWidget *widget, GdkEventMotion *event) @@ -1647,6 +1706,21 @@ gtk_tree_view_motion (GtkWidget *widget, return FALSE; } + if (event->window == tree_view->priv->drag_window) + { + GtkTreeViewColumn *column = tree_view->priv->drag_column; + gint x, y; + + if (column == NULL) + return FALSE; + gdk_window_get_position (tree_view->priv->drag_window, &x, &y); + x = CLAMP (x + (gint)event->x - column->drag_x, 0, + MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->button->allocation.width); + + gdk_window_move (tree_view->priv->drag_window, x, y); + return TRUE; + } + /* Sanity check it */ if (event->window != tree_view->priv->bin_window) return FALSE; @@ -1977,6 +2051,22 @@ gtk_tree_view_button_release (GtkWidget *widget, tree_view = GTK_TREE_VIEW (widget); + if (tree_view->priv->drag_column) + { + gdk_pointer_ungrab (GDK_CURRENT_TIME); + gdk_window_reparent (tree_view->priv->drag_column->button->window, + tree_view->priv->header_window, + tree_view->priv->drag_column->button->allocation.x, + tree_view->priv->drag_column->button->allocation.y); + gtk_widget_set_parent_window (tree_view->priv->drag_column->button, tree_view->priv->header_window); + + tree_view->priv->drag_column = NULL; + gtk_widget_queue_resize (GTK_WIDGET (tree_view)); + gdk_window_hide (tree_view->priv->drag_window); + + return TRUE; + } + if (tree_view->priv->pressed_button == event->button) tree_view->priv->pressed_button = -1; @@ -2041,7 +2131,6 @@ gtk_tree_view_button_release (GtkWidget *widget, gtk_tree_path_get_depth (path) + 1, FALSE, GTK_WIDGET_REALIZED (widget)); - } } } @@ -2743,12 +2832,23 @@ gtk_tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column) { - g_return_if_fail (tree_view != NULL); g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); g_signal_emit (G_OBJECT(tree_view), tree_view_signals[ROW_ACTIVATED], 0, path, column); } + +void +gtk_tree_view_map_open_rows (GtkTreeView *tree_view, + GtkTreeViewMappingFunc func, + gpointer data) +{ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_return_if_fail (func != NULL); + + +} + /* TreeModel Callbacks */ @@ -3410,70 +3510,6 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view) column->dirty = FALSE; } } -#if 0 -static void -gtk_tree_view_create_buttons (GtkTreeView *tree_view) -{ - GtkWidget *alignment; - GtkWidget *label; - GList *list; - GtkTreeViewColumn *column; - gint i; - GtkWidget *hbox; - GtkWidget *arrow; - - /* FIXME this has to be merged with update_button_contents() in - * gtktreeviewcolumn.c - */ - - for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++) - { - column = list->data; - - if (column->button != NULL) - continue; - - gtk_tree_view_create_button (tree_view, i); - alignment = gtk_alignment_new (column->xalign, 0.5, 0.0, 0.0); - - hbox = gtk_hbox_new (FALSE, 2); - arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN); - - column->arrow = arrow; - column->alignment = alignment; - - if (column->child) - label = column->child; - else - { - label = gtk_label_new (column->title); - gtk_widget_show (label); - } - - if (column->xalign <= 0.5) - gtk_box_pack_end (GTK_BOX (hbox), arrow, FALSE, FALSE, 0); - else - gtk_box_pack_start (GTK_BOX (hbox), arrow, FALSE, FALSE, 0); - - gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); - - gtk_container_add (GTK_CONTAINER (alignment), label); - gtk_container_add (GTK_CONTAINER (column->button), hbox); - - gtk_widget_show (hbox); - gtk_widget_show (alignment); - /* don't show the arrow yet */ - } - - gtk_tree_view_size_request_buttons (tree_view); - - if (GTK_WIDGET_REALIZED (tree_view)) - gtk_tree_view_realize_buttons (tree_view); - - if (GTK_WIDGET_MAPPED (tree_view)) - gtk_tree_view_map_buttons (tree_view); -} -#endif /* Make sure the node is visible vertically */ static void @@ -3636,6 +3672,106 @@ gtk_tree_view_unref_tree (GtkTreeView *tree_view, gtk_tree_path_free (path); } +void +_gtk_tree_view_column_start_drag (GtkTreeView *tree_view, + GtkTreeViewColumn *column) +{ + GdkEvent send_event; + GList *list = NULL; + GList *tmp_list; + gint left, right; + GtkTreeViewColumn *left_column; + GtkTreeViewColumn *right_column; + + /* We want to precalculate the motion list such that we know what column slots + * are available. + */ + left = 0; + left_column = NULL; + + for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next) + { + GtkTreeViewColumnReorder *reorder; + + if (GTK_TREE_VIEW_COLUMN (tmp_list->data)->visible == FALSE) + continue; + + right_column = tmp_list->data; + reorder = g_malloc (sizeof (GtkTreeViewColumnReorder), 1); + reorder->left_align = left; + } + /* if (list == NULL) + return;*/ + + if (tree_view->priv->drag_window == NULL) + { + GdkWindowAttr attributes; + guint attributes_mask; + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view)); + attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view)); + attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + tree_view->priv->drag_window = gdk_window_new (tree_view->priv->bin_window, + &attributes, + attributes_mask); + gdk_window_set_user_data (tree_view->priv->drag_window, GTK_WIDGET (tree_view)); + } + + gdk_pointer_ungrab (GDK_CURRENT_TIME); + gdk_keyboard_ungrab (GDK_CURRENT_TIME); + + gtk_grab_remove (column->button); + + send_event.crossing.type = GDK_LEAVE_NOTIFY; + send_event.crossing.send_event = TRUE; + send_event.crossing.window = column->button->window; + send_event.crossing.subwindow = NULL; + send_event.crossing.detail = GDK_NOTIFY_ANCESTOR; + send_event.crossing.time = GDK_CURRENT_TIME; + + gtk_propagate_event (column->button, &send_event); + + send_event.button.type = GDK_BUTTON_RELEASE; + send_event.button.window = GDK_ROOT_PARENT (); + send_event.button.send_event = TRUE; + send_event.button.time = GDK_CURRENT_TIME; + send_event.button.x = -1; + send_event.button.y = -1; + send_event.button.axes = NULL; + send_event.button.state = 0; + send_event.button.button = 1; + send_event.button.device = gdk_core_pointer; + send_event.button.x_root = 0; + send_event.button.y_root = 0; + + gtk_propagate_event (column->button, &send_event); + + gdk_window_move_resize (tree_view->priv->drag_window, + column->button->allocation.x, + column->button->allocation.y + column->button->allocation.height, + column->button->allocation.width, + column->button->allocation.height); + gdk_window_reparent (column->button->window, tree_view->priv->drag_window, 0, 0); + gtk_widget_set_parent_window (column->button, tree_view->priv->drag_window); + + + tree_view->priv->drag_column = column; + gdk_window_show (tree_view->priv->drag_window); + + while (gtk_events_pending ()) + gtk_main_iteration (); + + gdk_pointer_grab (tree_view->priv->drag_window, + FALSE, + GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK, + NULL, NULL, GDK_CURRENT_TIME); + +} + static void gtk_tree_view_queue_draw_node (GtkTreeView *tree_view, GtkRBTree *tree, @@ -3944,27 +4080,27 @@ gtk_tree_view_setup_model (GtkTreeView *tree_view) g_signal_connectc (tree_view->priv->model, "range_changed", - gtk_tree_view_range_changed, + (GCallback) gtk_tree_view_range_changed, tree_view, FALSE); g_signal_connectc (tree_view->priv->model, "inserted", - gtk_tree_view_inserted, + (GCallback) gtk_tree_view_inserted, tree_view, FALSE); g_signal_connectc (tree_view->priv->model, "has_child_toggled", - gtk_tree_view_has_child_toggled, + (GCallback) gtk_tree_view_has_child_toggled, tree_view, FALSE); g_signal_connectc (tree_view->priv->model, "deleted", - gtk_tree_view_deleted, + (GCallback) gtk_tree_view_deleted, tree_view, FALSE); g_signal_connectc (tree_view->priv->model, "reordered", - gtk_tree_view_reordered, + (GCallback) gtk_tree_view_reordered, tree_view, FALSE); diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index 94d7d84aa..640128c5c 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -79,6 +79,22 @@ struct _GtkTreeViewClass }; + +typedef gboolean (* GtkTreeViewColumnDropFunc) (GtkTreeView *tree_view, + GtkTreeViewColumn *column, + GtkTreeViewColumn *prev_column, + GtkTreeViewColumn *next_column, + gpointer data); +typedef gboolean (* GtkTreeViewDraggableFunc) (GtkTreeView *tree_view, + GdkDragContext *context, + GtkTreePath *path, + gpointer user_data); +typedef void (* GtkTreeViewMappingFunc) (GtkTreeView *tree_view, + GtkTreePath *path, + gpointer user_data); + + + GtkType gtk_tree_view_get_type (void); GtkWidget *gtk_tree_view_new (void); GtkWidget *gtk_tree_view_new_with_model (GtkTreeModel *model); @@ -110,6 +126,10 @@ gint gtk_tree_view_insert_column_with_attributes (GtkTreeView gchar *title, GtkCellRenderer *cell, ...); +void gtk_tree_view_move_column (GtkTreeView *tree_view, + GtkTreeViewColumn *column, + GtkTreeViewColumn *base_column, + gint side); GtkTreeViewColumn *gtk_tree_view_get_column (GtkTreeView *tree_view, gint n); void gtk_tree_view_set_expander_column (GtkTreeView *tree_view, @@ -152,6 +172,9 @@ gboolean gtk_tree_view_collapse_row (GtkTreeView void gtk_tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column); +void gtk_tree_view_map_open_rows (GtkTreeView *tree_view, + GtkTreeViewMappingFunc func, + gpointer data); void gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, GdkRectangle *visible_rect); @@ -172,12 +195,6 @@ gboolean gtk_tree_view_get_rules_hint (GtkTreeView *tree_view); /* Drag-and-Drop support */ - -typedef gboolean (* GtkTreeViewDraggableFunc) (GtkTreeView *tree_view, - GdkDragContext *context, - GtkTreePath *path, - gpointer user_data); - /* this func can change "pos" if it likes, in addition to returning * true/false for whether a drop is possible */ diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 2ceba9ff5..83662fbf5 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -28,6 +28,7 @@ #include "gtkarrow.h" #include "gtkintl.h" #include <string.h> + enum { PROP_0, @@ -259,6 +260,8 @@ gtk_tree_view_column_init (GtkTreeViewColumn *tree_column) tree_column->sort_clicked_signal = 0; tree_column->sort_column_changed_signal = 0; tree_column->sort_column_id = -1; + tree_column->reorderable = 1; + tree_column->maybe_reordered = 0; } static void @@ -470,6 +473,57 @@ gtk_tree_view_column_button_clicked (GtkWidget *widget, gpointer data) g_signal_emit_by_name (G_OBJECT (data), "clicked"); } +static void +gtk_tree_view_column_button_released (GtkWidget *widget, gpointer data) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *) data; + + gtk_widget_show (widget); + column->maybe_reordered = FALSE; +} +static gint +gtk_tree_view_column_button_motion_event (GtkWidget *widget, + GdkEventMotion *event, + gpointer data) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *) data; + + if ((column->maybe_reordered) && + (gtk_drag_check_threshold (widget, + column->drag_x, + column->drag_y, + (gint) event->x, + (gint) event->y))) + { + column->maybe_reordered = FALSE; + _gtk_tree_view_column_start_drag (GTK_TREE_VIEW (column->tree_view), + column); + } + + return TRUE; +} + +static void +gtk_tree_view_column_button_realize (GtkWidget *widget, gpointer data) +{ + gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | GDK_POINTER_MOTION_MASK); +} + +static void +gtk_tree_view_column_button_pressed (GtkWidget *widget, gpointer data) +{ + GtkTreeViewColumn *column = (GtkTreeViewColumn *) data; + + if (! column->reorderable) + return; + + column->maybe_reordered = TRUE; + gdk_window_get_pointer (widget->window, + &column->drag_x, + &column->drag_y, + NULL); +} + void _gtk_tree_view_column_create_button (GtkTreeViewColumn *column) { @@ -490,9 +544,21 @@ _gtk_tree_view_column_create_button (GtkTreeViewColumn *column) /* make sure we own a reference to it as well. */ gtk_widget_set_parent (column->button, GTK_WIDGET (tree_view)); + gtk_signal_connect (GTK_OBJECT (column->button), "realize", + (GtkSignalFunc) gtk_tree_view_column_button_realize, + NULL); gtk_signal_connect (GTK_OBJECT (column->button), "clicked", (GtkSignalFunc) gtk_tree_view_column_button_clicked, (gpointer) column); + gtk_signal_connect (GTK_OBJECT (column->button), "pressed", + (GtkSignalFunc) gtk_tree_view_column_button_pressed, + (gpointer) column); + gtk_signal_connect (GTK_OBJECT (column->button), "motion_notify_event", + (GtkSignalFunc) gtk_tree_view_column_button_motion_event, + (gpointer) column); + gtk_signal_connect (GTK_OBJECT (column->button), "released", + (GtkSignalFunc) gtk_tree_view_column_button_released, + (gpointer) column); column->alignment = gtk_alignment_new (column->xalign, 0.5, 0.0, 0.0); @@ -1608,6 +1674,7 @@ sort_clicked_func (GtkTreeViewColumn *tree_column, list = list->next; } + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), tree_column->sort_column_id, tree_column->sort_order); diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h index 79987aabf..779edb39d 100644 --- a/gtk/gtktreeviewcolumn.h +++ b/gtk/gtktreeviewcolumn.h @@ -70,6 +70,10 @@ struct _GtkTreeViewColumn gint max_width; gint displayed_width; + /* dragging columns */ + gint drag_x; + gint drag_y; + GtkCellDataFunc func; gpointer func_data; GtkDestroyNotify destroy; @@ -88,6 +92,8 @@ struct _GtkTreeViewColumn guint button_active : 1; guint dirty : 1; guint show_sort_indicator : 1; + guint maybe_reordered : 1; + guint reorderable : 1; }; struct _GtkTreeViewColumnClass diff --git a/tests/testgtk.c b/tests/testgtk.c index 5d0eceda2..d9af0fdfe 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -10285,7 +10285,7 @@ create_main_window (void) gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); - button = gtk_button_new_with_label ("close"); + button = gtk_button_new_with_mnemonic ("_Close"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (do_exit), window); diff --git a/tests/testtreefocus.c b/tests/testtreefocus.c index 5df51eb37..7c7401ef2 100644 --- a/tests/testtreefocus.c +++ b/tests/testtreefocus.c @@ -8,126 +8,128 @@ struct _TreeStruct gboolean havoc; gboolean tim; gboolean owen; + gboolean dave; gboolean world_holiday; /* shared by the european hackers */ TreeStruct *children; }; + static TreeStruct january[] = { - {"New Years Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL}, - {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, NULL}, - {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL}, + {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct february[] = { - { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL }, - { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL }, { NULL } }; static TreeStruct march[] = { - { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, { NULL } }; static TreeStruct april[] = { - { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Earth Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct may[] = { - { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Memorial Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL }, + { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, { NULL } }; static TreeStruct june[] = { - { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL }, + { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct july[] = { - { "Parents' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL }, + { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct august[] = { - { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct september[] = { - { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, - { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Labor Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL }, + { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, { NULL } }; static TreeStruct october[] = { - { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, NULL }, - { "Halloween", FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, { NULL } }; static TreeStruct november[] = { - { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, TRUE, NULL }, - { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, NULL }, + { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct december[] = { - { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { "Christmas", TRUE, TRUE, TRUE, TRUE, TRUE, NULL }, - { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, { NULL } }; static TreeStruct toplevel[] = { - {"January", FALSE, FALSE, FALSE, FALSE, FALSE, january}, - {"February", FALSE, FALSE, FALSE, FALSE, FALSE, february}, - {"March", FALSE, FALSE, FALSE, FALSE, FALSE, march}, - {"April", FALSE, FALSE, FALSE, FALSE, FALSE, april}, - {"May", FALSE, FALSE, FALSE, FALSE, FALSE, may}, - {"June", FALSE, FALSE, FALSE, FALSE, FALSE, june}, - {"July", FALSE, FALSE, FALSE, FALSE, FALSE, july}, - {"August", FALSE, FALSE, FALSE, FALSE, FALSE, august}, - {"September", FALSE, FALSE, FALSE, FALSE, FALSE, september}, - {"October", FALSE, FALSE, FALSE, FALSE, FALSE, october}, - {"November", FALSE, FALSE, FALSE, FALSE, FALSE, november}, - {"December", FALSE, FALSE, FALSE, FALSE, FALSE, december}, + {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january}, + {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february}, + {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march}, + {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april}, + {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may}, + {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june}, + {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july}, + {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august}, + {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september}, + {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october}, + {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november}, + {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december}, {NULL} }; @@ -139,6 +141,7 @@ enum HAVOC_COLUMN, TIM_COLUMN, OWEN_COLUMN, + DAVE_COLUMN, VISIBLE_COLUMN, WORLD_COLUMN, NUM_COLUMNS @@ -151,7 +154,15 @@ make_model (void) TreeStruct *month = toplevel; GtkTreeIter iter; - model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); + model = gtk_tree_store_new_with_types (NUM_COLUMNS, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); while (month->label) { @@ -164,6 +175,7 @@ make_model (void) HAVOC_COLUMN, FALSE, TIM_COLUMN, FALSE, OWEN_COLUMN, FALSE, + DAVE_COLUMN, FALSE, VISIBLE_COLUMN, FALSE, WORLD_COLUMN, FALSE, -1); @@ -178,6 +190,7 @@ make_model (void) HAVOC_COLUMN, holiday->havoc, TIM_COLUMN, holiday->tim, OWEN_COLUMN, holiday->owen, + DAVE_COLUMN, holiday->dave, VISIBLE_COLUMN, TRUE, WORLD_COLUMN, holiday->world_holiday, -1); @@ -266,6 +279,25 @@ tim_toggled (GtkCellRendererToggle *cell, gtk_tree_path_free (path); } +static void +dave_toggled (GtkCellRendererToggle *cell, + gchar *path_str, + gpointer data) +{ + GtkTreeModel *model = (GtkTreeModel *) data; + GtkTreeIter iter; + GtkTreePath *path = gtk_tree_path_new_from_string (path_str); + gboolean dave; + + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, DAVE_COLUMN, &dave, -1); + + dave = !dave; + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, DAVE_COLUMN, dave, -1); + + gtk_tree_path_free (path); +} + int main (int argc, char *argv[]) { @@ -281,6 +313,7 @@ main (int argc, char *argv[]) gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet"); gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL); vbox = gtk_vbox_new (FALSE, 8); gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); @@ -294,7 +327,6 @@ main (int argc, char *argv[]) model = make_model (); tree_view = gtk_tree_view_new_with_model (model); - g_object_unref (G_OBJECT (model)); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE); renderer = gtk_cell_renderer_text_new (); @@ -369,8 +401,114 @@ main (int argc, char *argv[]) gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50); g_object_unref (renderer); + /* Owen Column */ + renderer = gtk_cell_renderer_toggle_new (); + g_signal_connect_data (G_OBJECT (renderer), "toggled", dave_toggled, model, NULL, FALSE, FALSE); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Dave", + renderer, + "active", DAVE_COLUMN, + "visible", VISIBLE_COLUMN, + NULL); + column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50); + g_object_unref (renderer); + + gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); + + gtk_signal_connect (GTK_OBJECT (tree_view), "realize", + GTK_SIGNAL_FUNC (gtk_tree_view_expand_all), + NULL); + gtk_window_set_default_size (GTK_WINDOW (window), + 650, 400); + gtk_widget_show_all (window); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Model"); + gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL); + vbox = gtk_vbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); + gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("The model revealed"), FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + + scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); + + + tree_view = gtk_tree_view_new_with_model (model); + g_object_unref (G_OBJECT (model)); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Holiday Column", + renderer, + "text", 0, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Alex Column", + renderer, + "text", 1, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Havoc Column", + renderer, + "text", 2, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Tim Column", + renderer, + "text", 3, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Owen Column", + renderer, + "text", 4, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Dave Column", + renderer, + "text", 5, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "Visible Column", + renderer, + "text", 6, NULL); + g_object_unref (renderer); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), + -1, "World Holiday", + renderer, + "text", 7, NULL); + g_object_unref (renderer); + + gtk_signal_connect (GTK_OBJECT (tree_view), "realize", + GTK_SIGNAL_FUNC (gtk_tree_view_expand_all), + NULL); + gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); + + gtk_window_set_default_size (GTK_WINDOW (window), + 650, 400); + gtk_widget_show_all (window); gtk_main (); diff --git a/tests/testtreesort.c b/tests/testtreesort.c index 84169a3fa..f8d8be52a 100644 --- a/tests/testtreesort.c +++ b/tests/testtreesort.c @@ -12,7 +12,7 @@ struct _ListSort static ListSort data[] = { - { "Apples", "Transmorgrify", "Exculpatory", "Gesundheit"}, + { "Apples", "Transmorgrify long word to demonstrate weirdness", "Exculpatory", "Gesundheit"}, { "Oranges", "Wicker", "Adamantine", "Convivial" }, { "Bovine Spongiform Encephilopathy", "Sleazebucket", "Mountaineer", "Pander" }, { "Foot and Mouth", "Lampshade", "Skim Milk\nFull Milk", "Viewless" }, @@ -48,11 +48,12 @@ main (int argc, char *argv[]) GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeIter iter; - gint i; + gint i, j; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Words, words, words"); gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL); vbox = gtk_vbox_new (FALSE, 8); gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); @@ -65,20 +66,22 @@ main (int argc, char *argv[]) gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); model = gtk_list_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), - 0, GTK_TREE_SORT_ASCENDING); - for (i = 0; data[i].word_1 != NULL; i++) - { - gtk_list_store_append (GTK_LIST_STORE (model), &iter); - gtk_list_store_set (GTK_LIST_STORE (model), &iter, - WORD_COLUMN_1, data[i].word_1, - WORD_COLUMN_2, data[i].word_2, - WORD_COLUMN_3, data[i].word_3, - WORD_COLUMN_4, data[i].word_4, - -1); - } - + // gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 0, GTK_TREE_SORT_ASCENDING); + g_print ("start model\n"); tree_view = gtk_tree_view_new_with_model (model); + for (j = 0; j < 2; j++) + for (i = 0; data[i].word_1 != NULL; i++) + { + gtk_list_store_prepend (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + WORD_COLUMN_1, data[i].word_1, + WORD_COLUMN_2, data[i].word_2, + WORD_COLUMN_3, data[i].word_3, + WORD_COLUMN_4, data[i].word_4, + -1); + } + g_print ("done with model\n"); + g_object_unref (G_OBJECT (model)); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE); @@ -105,7 +108,7 @@ main (int argc, char *argv[]) column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer, "text", WORD_COLUMN_3, NULL); - gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1); + gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); g_object_unref (column); g_object_unref (renderer); |