summaryrefslogtreecommitdiff
path: root/gtk/gtktreeview.c
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2003-08-21 19:00:29 +0000
committerKristian Rietveld <kristian@src.gnome.org>2003-08-21 19:00:29 +0000
commit28a466a69cfcfcdadc70e0ecb7cfafec0d7a51a5 (patch)
tree185e00d4c3791eff3d14152172289aad04e64ee2 /gtk/gtktreeview.c
parent5ff0e3fabe5ef4c9ee232c9f6ae4d775787eda85 (diff)
downloadgdk-pixbuf-28a466a69cfcfcdadc70e0ecb7cfafec0d7a51a5.tar.gz
Slightly modified patch from Yann Rouillard to improve selection behavior
Thu Aug 21 20:53:46 2003 Kristian Rietveld <kris@gtk.org> Slightly modified patch from Yann Rouillard to improve selection behavior with the mouse. Fixes #120187. * gtk/gtktreeview.c (gtk_tree_view_button_press): only select/deselect items on the first button press of button 1, expand checks for row_activated to include triple clicks.
Diffstat (limited to 'gtk/gtktreeview.c')
-rw-r--r--gtk/gtktreeview.c105
1 files changed, 61 insertions, 44 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 9b3107b24..2769cdadf 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -1988,7 +1988,7 @@ gtk_tree_view_button_press (GtkWidget *widget,
GtkTreeViewColumn *column = NULL;
GtkCellRenderer *focus_cell = NULL;
gint column_handled_click = FALSE;
- gboolean emit_row_activated = FALSE;
+ gboolean row_double_click = FALSE;
gboolean rtl;
/* are we in an arrow? */
@@ -2027,6 +2027,7 @@ gtk_tree_view_button_press (GtkWidget *widget,
tree_view->priv->expander_size);
background_area.x = 0;
+
/* Let the column have a chance at selecting it. */
rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
for (list = (rtl ? g_list_last (tree_view->priv->columns) : g_list_first (tree_view->priv->columns));
@@ -2140,24 +2141,30 @@ gtk_tree_view_button_press (GtkWidget *widget,
/* select */
pre_val = tree_view->priv->vadjustment->value;
- focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, event->x - background_area.x);
- if (focus_cell)
- gtk_tree_view_column_focus_cell (column, focus_cell);
+ /* we only handle selection modifications from the first button on
+ * the first button press
+ */
+ if (event->type == GDK_BUTTON_PRESS && event->button == 1)
+ {
+ focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, event->x - background_area.x);
+ if (focus_cell)
+ gtk_tree_view_column_focus_cell (column, focus_cell);
- if (event->state & GDK_CONTROL_MASK)
- {
- gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
- gtk_tree_view_real_toggle_cursor_row (tree_view);
- }
- else if (event->state & GDK_SHIFT_MASK)
- {
- gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
- gtk_tree_view_real_select_cursor_row (tree_view, FALSE);
- }
- else
- {
- gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
- }
+ if (event->state & GDK_CONTROL_MASK)
+ {
+ gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
+ gtk_tree_view_real_toggle_cursor_row (tree_view);
+ }
+ else if (event->state & GDK_SHIFT_MASK)
+ {
+ gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
+ gtk_tree_view_real_select_cursor_row (tree_view, FALSE);
+ }
+ else
+ {
+ gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
+ }
+ }
/* the treeview may have been scrolled because of _set_cursor,
* correct here
@@ -2179,38 +2186,48 @@ gtk_tree_view_button_press (GtkWidget *widget,
tree_view->priv->press_start_y = event->y;
}
- if (event->button == 1 && event->type == GDK_2BUTTON_PRESS &&
- tree_view->priv->last_button_press)
- {
- GtkTreePath *lsc;
+ /* Test if a double click happened on the same row. */
+ if (event->button == 1)
+ {
+ /* We also handle triple clicks here, because a user could have done
+ * a first click and a second double click on different rows.
+ */
+ if ((event->type == GDK_2BUTTON_PRESS
+ || event->type == GDK_3BUTTON_PRESS)
+ && tree_view->priv->last_button_press)
+ {
+ GtkTreePath *lsc;
- lsc = gtk_tree_row_reference_get_path (tree_view->priv->last_button_press);
+ lsc = gtk_tree_row_reference_get_path (tree_view->priv->last_button_press);
- if (tree_view->priv->last_button_press)
- gtk_tree_row_reference_free (tree_view->priv->last_button_press);
- if (tree_view->priv->last_button_press_2)
- gtk_tree_row_reference_free (tree_view->priv->last_button_press_2);
- tree_view->priv->last_button_press = NULL;
- tree_view->priv->last_button_press_2 = NULL;
+ if (lsc)
+ {
+ row_double_click = !gtk_tree_path_compare (lsc, path);
+ gtk_tree_path_free (lsc);
+ }
+ }
- if (lsc)
- {
- if (!gtk_tree_path_compare (lsc, path))
- emit_row_activated = TRUE;
- gtk_tree_path_free (lsc);
- }
- }
- else if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
- {
- if (tree_view->priv->last_button_press)
- gtk_tree_row_reference_free (tree_view->priv->last_button_press);
- tree_view->priv->last_button_press = tree_view->priv->last_button_press_2;
- tree_view->priv->last_button_press_2 = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, path);
- }
+ if (row_double_click)
+ {
+ if (tree_view->priv->last_button_press)
+ gtk_tree_row_reference_free (tree_view->priv->last_button_press);
+ if (tree_view->priv->last_button_press_2)
+ gtk_tree_row_reference_free (tree_view->priv->last_button_press_2);
+ tree_view->priv->last_button_press = NULL;
+ tree_view->priv->last_button_press_2 = NULL;
+ }
+ else
+ {
+ if (tree_view->priv->last_button_press)
+ gtk_tree_row_reference_free (tree_view->priv->last_button_press);
+ tree_view->priv->last_button_press = tree_view->priv->last_button_press_2;
+ tree_view->priv->last_button_press_2 = gtk_tree_row_reference_new_proxy (G_OBJECT (tree_view), tree_view->priv->model, path);
+ }
+ }
GTK_TREE_VIEW_UNSET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
- if (emit_row_activated)
+ if (row_double_click)
{
gtk_grab_remove (widget);
gtk_tree_view_row_activated (tree_view, path, column);