summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2001-06-01 22:57:30 +0000
committerJonathan Blandford <jrb@src.gnome.org>2001-06-01 22:57:30 +0000
commit11043de66f76cfb2e88693a365c857969ede7c74 (patch)
tree61e2fe372434eaaddbcf374c31063fc3e522a767
parentfe3e516aa1e2a7f793557b0b8094d5ee96653d40 (diff)
downloadgtk+-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--ChangeLog16
-rw-r--r--ChangeLog.pre-2-016
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--ChangeLog.pre-2-216
-rw-r--r--ChangeLog.pre-2-416
-rw-r--r--ChangeLog.pre-2-616
-rw-r--r--ChangeLog.pre-2-816
-rw-r--r--gtk/gtktreeview.c402
-rw-r--r--gtk/gtktreeview.h14
-rw-r--r--gtk/gtktreeviewcolumn.c38
-rw-r--r--gtk/gtktreeviewcolumn.h14
-rw-r--r--tests/testtreefocus.c7
12 files changed, 435 insertions, 152 deletions
diff --git a/ChangeLog b/ChangeLog
index e4da124063..610b344f18 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);