diff options
author | Jonathan Blandford <jrb@redhat.com> | 2001-06-01 22:57:30 +0000 |
---|---|---|
committer | Jonathan Blandford <jrb@src.gnome.org> | 2001-06-01 22:57:30 +0000 |
commit | 11043de66f76cfb2e88693a365c857969ede7c74 (patch) | |
tree | 61e2fe372434eaaddbcf374c31063fc3e522a767 | |
parent | fe3e516aa1e2a7f793557b0b8094d5ee96653d40 (diff) | |
download | gtk+-11043de66f76cfb2e88693a365c857969ede7c74.tar.gz |
Initial stab at getting the focus code to work.
Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at
getting the focus code to work.
(gtk_tree_view_class_init): Add a bunch of keybindings.
* gtk/gtktreeviewcolumn.c
(gtk_tree_view_column_set_cell_data_func):
s/GtkCellDataFunc/GtkTreeCellDataFunc.
(_gtk_tree_view_column_set_tree_view): Use "notify::model" instead
of "properties_changed" to help justify the death of the latter
signal. (-:
* tests/testtreefocus.c (main): Let some columns be focussable to
test focus better.
-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/gtktreeview.c | 402 | ||||
-rw-r--r-- | gtk/gtktreeview.h | 14 | ||||
-rw-r--r-- | gtk/gtktreeviewcolumn.c | 38 | ||||
-rw-r--r-- | gtk/gtktreeviewcolumn.h | 14 | ||||
-rw-r--r-- | tests/testtreefocus.c | 7 |
12 files changed, 435 insertions, 152 deletions
@@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index e4da124063..610b344f18 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +Fri Jun 1 18:54:47 2001 Jonathan Blandford <jrb@redhat.com> + + * gtk/gtktreeview.c: (gtk_tree_view_focus): Initial stab at + getting the focus code to work. + (gtk_tree_view_class_init): Add a bunch of keybindings. + + * gtk/gtktreeviewcolumn.c + (gtk_tree_view_column_set_cell_data_func): + s/GtkCellDataFunc/GtkTreeCellDataFunc. + (_gtk_tree_view_column_set_tree_view): Use "notify::model" instead + of "properties_changed" to help justify the death of the latter + signal. (-: + + * tests/testtreefocus.c (main): Let some columns be focussable to + test focus better. + 2001-06-01 Havoc Pennington <hp@redhat.com> * gtk/gtkentry.c (gtk_entry_commit_cb): implement overwrite mode diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index f19424f145..73b915a70c 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -31,6 +31,7 @@ #include "gtkhbox.h" #include "gtkarrow.h" #include "gtkintl.h" +#include "gtkbindings.h" #include <gdk/gdkkeysyms.h> @@ -95,6 +96,7 @@ enum EXPAND_ROW, COLLAPSE_ROW, COLUMNS_CHANGED, + MOVE_CURSOR, LAST_SIGNAL }; @@ -208,6 +210,10 @@ static void gtk_tree_view_drag_data_received (GtkWidget *widget, static void gtk_tree_view_set_adjustments (GtkTreeView *tree_view, GtkAdjustment *hadj, GtkAdjustment *vadj); +static void gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, + GtkMovementStep step, + gint count, + gboolean extend_selection); static void gtk_tree_view_range_changed (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, @@ -231,6 +237,12 @@ static void gtk_tree_view_reordered (GtkTreeModel *model, gint *new_order, gpointer data); /* Internal functions */ + +static void gtk_tree_view_add_move_binding (GtkBindingSet *binding_set, + guint keyval, + guint modmask, + GtkMovementStep step, + gint count); static void gtk_tree_view_unref_tree (GtkTreeView *tree_view, GtkRBTree *tree); static void gtk_tree_view_queue_draw_node (GtkTreeView *tree_view, @@ -284,7 +296,10 @@ static void gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view, static gboolean gtk_tree_view_maybe_begin_dragging_row (GtkTreeView *tree_view, GdkEventMotion *event); static void _gtk_tree_view_update_col_width (GtkTreeView *tree_view); - +static void gtk_tree_view_set_cursor_focus (GtkTreeView *tree_view); +static void gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view, + gint count, + gboolean extend_selection); static GtkContainerClass *parent_class = NULL; static guint tree_view_signals[LAST_SIGNAL] = { 0 }; @@ -327,8 +342,10 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; + GtkBindingSet *binding_set; parent_class = g_type_class_peek_parent (class); + binding_set = gtk_binding_set_by_class (class); o_class = (GObjectClass *) class; object_class = (GtkObjectClass *) class; @@ -374,6 +391,8 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) container_class->set_focus_child = gtk_tree_view_set_focus_child; class->set_scroll_adjustments = gtk_tree_view_set_adjustments; + class->move_cursor = gtk_tree_view_real_move_cursor; + /* Properties */ g_object_class_install_property (o_class, PROP_MODEL, @@ -441,6 +460,50 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) FALSE, G_PARAM_READWRITE)); + /* Style properties */ + /* the width of the column resize windows */ +#define _TREE_VIEW_EXPANDER_WIDTH 14 +#define _TREE_VIEW_EXPANDER_HEIGHT 14 +#define _TREE_VIEW_VERTICAL_SEPARATOR 2 +#define _TREE_VIEW_HORIZONTAL_SEPARATOR 0 + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_int ("expander_width", + _("Expander Width"), + _("Width of the expander arrow"), + 0, + G_MAXINT, + _TREE_VIEW_EXPANDER_WIDTH, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_int ("expander_height", + _("Expander Height"), + _("Height of the expander arrow"), + 4, + G_MAXINT, + _TREE_VIEW_EXPANDER_HEIGHT, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_int ("vertical_separator", + _("Vertical Separator Width"), + _("Vertical space between cells"), + 0, + G_MAXINT, + _TREE_VIEW_VERTICAL_SEPARATOR, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_int ("horizontal_separator", + _("Horizontal Separator Width"), + _("Horizontal space between cells"), + 0, + G_MAXINT, + _TREE_VIEW_HORIZONTAL_SEPARATOR, + G_PARAM_READABLE)); + + /* Signals */ widget_class->set_scroll_adjustments_signal = gtk_signal_new ("set_scroll_adjustments", GTK_RUN_LAST, @@ -491,47 +554,51 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) gtk_marshal_NONE__NONE, G_TYPE_NONE, 0); -/* the width of the column resize windows */ -#define _TREE_VIEW_EXPANDER_WIDTH 14 -#define _TREE_VIEW_EXPANDER_HEIGHT 14 -#define _TREE_VIEW_VERTICAL_SEPARATOR 2 -#define _TREE_VIEW_HORIZONTAL_SEPARATOR 0 + tree_view_signals[MOVE_CURSOR] = + g_signal_newc ("move_cursor", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | GTK_RUN_ACTION, + G_STRUCT_OFFSET (GtkTreeViewClass, move_cursor), + NULL, NULL, + gtk_marshal_VOID__ENUM_INT_BOOLEAN, + GTK_TYPE_NONE, 3, GTK_TYPE_MOVEMENT_STEP, GTK_TYPE_INT, GTK_TYPE_BOOL); - gtk_widget_class_install_style_property (widget_class, - g_param_spec_int ("expander_width", - _("Expander Width"), - _("Width of the expander arrow"), - 0, - G_MAXINT, - _TREE_VIEW_EXPANDER_WIDTH, - G_PARAM_READABLE)); + /* Key bindings */ + gtk_tree_view_add_move_binding (binding_set, GDK_Right, 0, + GTK_MOVEMENT_VISUAL_POSITIONS, 1); - gtk_widget_class_install_style_property (widget_class, - g_param_spec_int ("expander_height", - _("Expander Height"), - _("Height of the expander arrow"), - 4, - G_MAXINT, - _TREE_VIEW_EXPANDER_HEIGHT, - G_PARAM_READABLE)); + gtk_tree_view_add_move_binding (binding_set, GDK_Left, 0, + GTK_MOVEMENT_VISUAL_POSITIONS, -1); - gtk_widget_class_install_style_property (widget_class, - g_param_spec_int ("vertical_separator", - _("Vertical Separator Width"), - _("Vertical space between cells"), - 0, - G_MAXINT, - _TREE_VIEW_VERTICAL_SEPARATOR, - G_PARAM_READABLE)); + gtk_tree_view_add_move_binding (binding_set, GDK_f, GDK_CONTROL_MASK, + GTK_MOVEMENT_LOGICAL_POSITIONS, 1); - gtk_widget_class_install_style_property (widget_class, - g_param_spec_int ("horizontal_separator", - _("Horizontal Separator Width"), - _("Horizontal space between cells"), - 0, - G_MAXINT, - _TREE_VIEW_HORIZONTAL_SEPARATOR, - G_PARAM_READABLE)); + gtk_tree_view_add_move_binding (binding_set, GDK_b, GDK_CONTROL_MASK, + GTK_MOVEMENT_LOGICAL_POSITIONS, -1); + + gtk_tree_view_add_move_binding (binding_set, GDK_Up, 0, + GTK_MOVEMENT_DISPLAY_LINES, -1); + + gtk_tree_view_add_move_binding (binding_set, GDK_Down, 0, + GTK_MOVEMENT_DISPLAY_LINES, 1); + + gtk_tree_view_add_move_binding (binding_set, GDK_p, GDK_CONTROL_MASK, + GTK_MOVEMENT_DISPLAY_LINES, -1); + + gtk_tree_view_add_move_binding (binding_set, GDK_n, GDK_CONTROL_MASK, + GTK_MOVEMENT_DISPLAY_LINES, 1); + + gtk_tree_view_add_move_binding (binding_set, GDK_Home, 0, + GTK_MOVEMENT_BUFFER_ENDS, -1); + + gtk_tree_view_add_move_binding (binding_set, GDK_End, 0, + GTK_MOVEMENT_BUFFER_ENDS, 1); + + gtk_tree_view_add_move_binding (binding_set, GDK_Page_Up, 0, + GTK_MOVEMENT_PAGES, -1); + + gtk_tree_view_add_move_binding (binding_set, GDK_Page_Down, 0, + GTK_MOVEMENT_PAGES, 1); } static void @@ -2538,7 +2605,7 @@ gtk_tree_view_key_press (GtkWidget *widget, } return TRUE; } - return FALSE; + return (* GTK_WIDGET_CLASS (parent_class)->key_press_event) (widget, event); } /* FIXME Is this function necessary? Can I get an enter_notify event @@ -3743,57 +3810,23 @@ gtk_tree_view_focus (GtkContainer *container, focus_child = container->focus_child; - /* Case 1. Headers have focus. */ + /* Case 1. Headers currently have focus. */ if (focus_child) { switch (direction) { case GTK_DIR_LEFT: case GTK_DIR_RIGHT: - return (gtk_tree_view_header_focus (tree_view, direction)); + gtk_tree_view_header_focus (tree_view, direction); + return TRUE; case GTK_DIR_TAB_BACKWARD: case GTK_DIR_UP: return FALSE; case GTK_DIR_TAB_FORWARD: case GTK_DIR_DOWN: - if (tree_view->priv->tree == NULL) return FALSE; - - GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS); - gtk_widget_grab_focus (GTK_WIDGET (container)); - - if (tree_view->priv->selection == NULL) - tree_view->priv->selection = - _gtk_tree_selection_new_with_tree_view (tree_view); - - /* if there is no keyboard focus yet, we select the first node - */ - - cursor_path = NULL; - - if (tree_view->priv->cursor) - cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); - - if (cursor_path == NULL) - { - GtkTreePath *tmp_path = gtk_tree_path_new_root (); - - if (tree_view->priv->cursor) - gtk_tree_row_reference_free (tree_view->priv->cursor); - - tree_view->priv->cursor = - gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, tmp_path); - cursor_path = tmp_path; - } - - gtk_tree_selection_select_path (tree_view->priv->selection, - cursor_path); - - gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL); - - gtk_tree_path_free (cursor_path); - + gtk_tree_view_set_cursor_focus (tree_view); return TRUE; } } @@ -3801,56 +3834,35 @@ gtk_tree_view_focus (GtkContainer *container, /* Case 2. We don't have focus at all. */ if (!GTK_WIDGET_HAS_FOCUS (container)) { - if ((direction == GTK_DIR_TAB_FORWARD) || - (direction == GTK_DIR_RIGHT) || - (direction == GTK_DIR_DOWN) || - (direction == GTK_DIR_LEFT) || - (tree_view->priv->tree == NULL)) + if (tree_view->priv->tree == NULL && + (direction == GTK_DIR_TAB_BACKWARD || + direction == GTK_DIR_UP)) return gtk_tree_view_header_focus (tree_view, direction); + if (((direction == GTK_DIR_TAB_FORWARD) || + (direction == GTK_DIR_RIGHT) || + (direction == GTK_DIR_DOWN) || + (direction == GTK_DIR_LEFT)) && + gtk_tree_view_header_focus (tree_view, direction)) + return TRUE; - /* The headers didn't want the focus, so we take it. */ - GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS); - gtk_widget_grab_focus (GTK_WIDGET (container)); - - if (tree_view->priv->selection == NULL) - tree_view->priv->selection = - _gtk_tree_selection_new_with_tree_view (tree_view); - - cursor_path = NULL; - if (tree_view->priv->cursor) - cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); - - if (cursor_path == NULL) - { - GtkTreePath *tmp_path = gtk_tree_path_new_root (); - - if (tree_view->priv->cursor) - gtk_tree_row_reference_free (tree_view->priv->cursor); - - tree_view->priv->cursor = - gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, tmp_path); - cursor_path = tmp_path; - } - - gtk_tree_selection_select_path (tree_view->priv->selection, - cursor_path); - - gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL); - - gtk_tree_path_free (cursor_path); - + if (tree_view->priv->tree == NULL) + return FALSE; + gtk_tree_view_set_cursor_focus (tree_view); return TRUE; } /* Case 3. We have focus already. */ if (tree_view->priv->tree == NULL) - return FALSE; + return gtk_tree_view_header_focus (tree_view, direction); if (direction == GTK_DIR_TAB_BACKWARD) return (gtk_tree_view_header_focus (tree_view, direction)); else if (direction == GTK_DIR_TAB_FORWARD) return FALSE; + /* Other directions caught by the keybindings */ + return TRUE; +#if 0 cursor_path = NULL; if (tree_view->priv->cursor) cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); @@ -3989,6 +4001,7 @@ gtk_tree_view_focus (GtkContainer *container, /* we've reached the end of the tree. Go on. */ return FALSE; +#endif } @@ -4069,6 +4082,48 @@ gtk_tree_view_set_adjustments (GtkTreeView *tree_view, gtk_tree_view_adjustment_changed (NULL, tree_view); } +static void +gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, + GtkMovementStep step, + gint count, + gboolean extend_selection) +{ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_return_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS || + step == GTK_MOVEMENT_VISUAL_POSITIONS || + step == GTK_MOVEMENT_DISPLAY_LINES || + step == GTK_MOVEMENT_PAGES || + step == GTK_MOVEMENT_BUFFER_ENDS); + + switch (step) + { + /* currently we make no distinction. When we go bi-di, we need to */ + case GTK_MOVEMENT_LOGICAL_POSITIONS: + case GTK_MOVEMENT_VISUAL_POSITIONS: + if (count == 1) + g_print ("go right\n"); + else + g_print ("go_left\n"); + break; + case GTK_MOVEMENT_DISPLAY_LINES: + gtk_tree_view_move_cursor_up_down (tree_view, count, extend_selection); + break; + case GTK_MOVEMENT_PAGES: + if (count == -1) + g_print ("page up\n"); + else + g_print ("page_down\n"); + break; + case GTK_MOVEMENT_BUFFER_ENDS: + if (count == -1) + g_print ("start\n"); + else + g_print ("end\n"); + break; + default: + g_assert_not_reached (); + } +} /* TreeModel Callbacks */ @@ -5054,6 +5109,29 @@ _gtk_tree_view_find_node (GtkTreeView *tree_view, } static void +gtk_tree_view_add_move_binding (GtkBindingSet *binding_set, + guint keyval, + guint modmask, + GtkMovementStep step, + gint count) +{ + g_return_if_fail ((modmask & GDK_SHIFT_MASK) == 0); + + gtk_binding_entry_add_signal (binding_set, keyval, modmask, + "move_cursor", 3, + GTK_TYPE_ENUM, step, + GTK_TYPE_INT, count, + GTK_TYPE_BOOL, FALSE); + + /* Selection-extending version */ + gtk_binding_entry_add_signal (binding_set, keyval, modmask | GDK_SHIFT_MASK, + "move_cursor", 3, + GTK_TYPE_ENUM, step, + GTK_TYPE_INT, count, + GTK_TYPE_BOOL, TRUE); +} + +static void gtk_tree_view_unref_tree_helper (GtkTreeModel *model, GtkTreeIter *iter, GtkRBTree *tree, @@ -5435,6 +5513,100 @@ _gtk_tree_view_update_col_width (GtkTreeView *tree_view) column->displayed_width = MAX (GTK_WIDGET (tree_view)->allocation.width, tree_view->priv->width) - width; } +static void +gtk_tree_view_set_cursor_focus (GtkTreeView *tree_view) + +{ + GtkTreePath *cursor_path; + + if ((tree_view->priv->tree == NULL) || + (! GTK_WIDGET_REALIZED (tree_view))) + return; + + if (tree_view->priv->selection == NULL) + tree_view->priv->selection = + _gtk_tree_selection_new_with_tree_view (tree_view); + + GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS); + gtk_widget_grab_focus (GTK_WIDGET (tree_view)); + + cursor_path = NULL; + if (tree_view->priv->cursor) + cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); + + if (cursor_path == NULL) + { + GtkTreePath *tmp_path = gtk_tree_path_new_root (); + /* FIXME: Get the first one visible!!! */ + if (tree_view->priv->cursor) + gtk_tree_row_reference_free (tree_view->priv->cursor); + + tree_view->priv->cursor = + gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, tmp_path); + cursor_path = tmp_path; + } + + gtk_tree_selection_select_path (tree_view->priv->selection, cursor_path); + gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL); + gtk_tree_path_free (cursor_path); + +} + +static void +gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view, + gint count, + gboolean extend_selection) +{ + GtkRBTree *cursor_tree = NULL; + GtkRBNode *cursor_node = NULL; + GtkTreePath *cursor_path = NULL; + + cursor_path = NULL; + if (tree_view->priv->cursor) + cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); + + g_print ("up_down: cursor path is %s\n", cursor_path?"non NULL":"NULL"); + _gtk_tree_view_find_node (tree_view, cursor_path, + &cursor_tree, + &cursor_node); + gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL); + if (tree_view->priv->cursor) + { + gtk_tree_row_reference_free (tree_view->priv->cursor); + tree_view->priv->cursor = NULL; + } + + if (count == -1) + _gtk_rbtree_prev_full (cursor_tree, cursor_node, + &cursor_tree, &cursor_node); + else + _gtk_rbtree_next_full (cursor_tree, cursor_node, + &cursor_tree, &cursor_node); + gtk_tree_path_free (cursor_path); + + if (cursor_node) + { + cursor_path = _gtk_tree_view_find_path (tree_view, + cursor_tree, + cursor_node); + if (cursor_path) + { + _gtk_tree_selection_internal_select_node (tree_view->priv->selection, + cursor_node, + cursor_tree, + cursor_path, + extend_selection?0:0); + + tree_view->priv->cursor = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, cursor_path); + gtk_tree_view_queue_draw_path (tree_view, cursor_path, NULL); + + gtk_tree_path_free (cursor_path); + } + gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node); + gtk_widget_grab_focus (GTK_WIDGET (tree_view)); + } +} + void _gtk_tree_view_update_size (GtkTreeView *tree_view) { @@ -6165,7 +6337,7 @@ gtk_tree_view_insert_column_with_data_func (GtkTreeView *tree_vie gint position, gchar *title, GtkCellRenderer *cell, - GtkCellDataFunc func, + GtkTreeCellDataFunc func, gpointer data, GDestroyNotify dnotify) { diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index 6568dbd00f..aef4ae5e2c 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -77,6 +77,18 @@ struct _GtkTreeViewClass GtkTreeIter *iter, GtkTreePath *path); void (* columns_changed) (GtkTreeView *tree_view); + + /* Key Binding signals */ + void (* move_cursor) (GtkTreeView *tree_view, + GtkMovementStep step, + gint count, + gboolean extend_selection); + void (* set_anchor) (GtkTreeView *tree_view); + void (* expand_selected_row) (GtkTreeView *tree_view); + void (* collapse_selected_row) (GtkTreeView *tree_view); + void (* expand_all_selected_row)(GtkTreeView *tree_view); + void (* select_selected_parent) (GtkTreeView *tree_view); + }; @@ -142,7 +154,7 @@ gint gtk_tree_view_insert_column_with_data_func (GtkTreeView gint position, gchar *title, GtkCellRenderer *cell, - GtkCellDataFunc func, + GtkTreeCellDataFunc func, gpointer data, GDestroyNotify dnotify); GtkTreeViewColumn *gtk_tree_view_get_column (GtkTreeView *tree_view, diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index b3ec91e44e..26d8743df4 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -84,10 +84,6 @@ static void gtk_tree_view_column_button_clicked (GtkWidget gpointer data); /* Property handlers */ -static void gtk_tree_view_model_property_changed (GtkTreeView *view, - guint n_pspecs, - GParamSpec **pspecs, - GtkTreeViewColumn *tree_column); static void gtk_tree_view_model_sort_column_changed (GtkTreeSortable *sortable, GtkTreeViewColumn *tree_column); @@ -763,23 +759,6 @@ gtk_tree_view_column_button_clicked (GtkWidget *widget, gpointer data) } static void -gtk_tree_view_model_property_changed (GtkTreeView *view, - guint n_pspecs, - GParamSpec **pspecs, - GtkTreeViewColumn *tree_column) -{ - gint i; - - for (i = 0; i < n_pspecs; i++) - { - if (! strcmp (pspecs[i]->name, "model")) - { - gtk_tree_view_column_setup_sort_column_id_callback (tree_column); - } - } -} - -static void gtk_tree_view_model_sort_column_changed (GtkTreeSortable *sortable, GtkTreeViewColumn *column) { @@ -959,10 +938,11 @@ _gtk_tree_view_column_set_tree_view (GtkTreeViewColumn *column, column->tree_view = GTK_WIDGET (tree_view); gtk_tree_view_column_create_button (column); - column->property_changed_signal = gtk_signal_connect (GTK_OBJECT (tree_view), - "properties_changed", - GTK_SIGNAL_FUNC (gtk_tree_view_model_property_changed), - column); + column->property_changed_signal = + g_signal_connect_data (GTK_OBJECT (tree_view), + "notify::model", + GTK_SIGNAL_FUNC (gtk_tree_view_column_setup_sort_column_id_callback), + column, NULL, TRUE, FALSE); gtk_tree_view_column_setup_sort_column_id_callback (column); } @@ -1212,10 +1192,10 @@ gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column, * may be NULL to remove an older one. **/ void -gtk_tree_view_column_set_cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellDataFunc func, - gpointer func_data, - GtkDestroyNotify destroy) +gtk_tree_view_column_set_cell_data_func (GtkTreeViewColumn *tree_column, + GtkTreeCellDataFunc func, + gpointer func_data, + GtkDestroyNotify destroy) { g_return_if_fail (tree_column != NULL); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h index a3fa3c45f2..65e2eb8b28 100644 --- a/gtk/gtktreeviewcolumn.h +++ b/gtk/gtktreeviewcolumn.h @@ -46,11 +46,11 @@ typedef enum typedef struct _GtkTreeViewColumn GtkTreeViewColumn; typedef struct _GtkTreeViewColumnClass GtkTreeViewColumnClass; -typedef void (* GtkCellDataFunc) (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data); +typedef void (* GtkTreeCellDataFunc) (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gpointer data); struct _GtkTreeViewColumn @@ -76,7 +76,7 @@ struct _GtkTreeViewColumn gint drag_x; gint drag_y; - GtkCellDataFunc func; + GtkTreeCellDataFunc func; gpointer func_data; GtkDestroyNotify destroy; gchar *title; @@ -120,7 +120,7 @@ void gtk_tree_view_column_add_attribute (GtkTreeViewColum void gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column, ...); void gtk_tree_view_column_set_cell_data_func (GtkTreeViewColumn *tree_column, - GtkCellDataFunc func, + GtkTreeCellDataFunc func, gpointer func_data, GtkDestroyNotify destroy); void gtk_tree_view_column_clear_attributes (GtkTreeViewColumn *tree_column); diff --git a/tests/testtreefocus.c b/tests/testtreefocus.c index 7c7401ef2a..1368aa1a38 100644 --- a/tests/testtreefocus.c +++ b/tests/testtreefocus.c @@ -334,6 +334,8 @@ main (int argc, char *argv[]) -1, "Holiday", renderer, "text", HOLIDAY_COLUMN, NULL); + column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); g_object_unref (renderer); /* Alex Column */ @@ -351,6 +353,7 @@ main (int argc, char *argv[]) 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); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); g_object_unref (renderer); /* Havoc Column */ @@ -367,6 +370,7 @@ main (int argc, char *argv[]) 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); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); g_object_unref (renderer); /* Tim Column */ @@ -383,6 +387,7 @@ main (int argc, char *argv[]) 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_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50); g_object_unref (renderer); @@ -398,6 +403,7 @@ main (int argc, char *argv[]) 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_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); gtk_tree_view_column_set_width (GTK_TREE_VIEW_COLUMN (column), 50); g_object_unref (renderer); @@ -414,6 +420,7 @@ main (int argc, char *argv[]) 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); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); g_object_unref (renderer); gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); |