[maemo-commits] [maemo-commits] r9506 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Feb 1 13:36:50 EET 2007
Author: kris
Date: 2007-02-01 13:36:48 +0200 (Thu, 01 Feb 2007)
New Revision: 9506

Modified:
   projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeprivate.h
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeview.c
Log:
2007-02-01  Kristian Rietveld  <kris at imendio.com>

	A first patch to get pen dragging going.

	* gtk/gtktreeview.c (gtk_tree_view_class_init),
	(gtk_tree_view_init), (gtk_tree_view_destroy),
	(gtk_tree_view_button_press), (gtk_tree_view_button_release),
	(gtk_tree_view_update_rubber_band_selection),
	(gtk_tree_view_bin_expose), (gtk_tree_view_set_model): slightly
	modify the rubber banding code to mimic the pen dragging found
	in maemo-gtk-2-6.  Changes include: disabling drawing the rubber
	band, do not immediately set the cursor on button press,
	don't select insensitive rows when rubber banding.

	* gtk/gtktreeprivate.h (struct _GtkTreePrivate): add
	queued_select_row field.



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-01 09:34:00 UTC (rev 9505)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-01 11:36:48 UTC (rev 9506)
@@ -1,3 +1,20 @@
+2007-02-01  Kristian Rietveld  <kris at imendio.com>
+
+	A first patch to get pen dragging going.
+
+	* gtk/gtktreeview.c (gtk_tree_view_class_init),
+	(gtk_tree_view_init), (gtk_tree_view_destroy),
+	(gtk_tree_view_button_press), (gtk_tree_view_button_release),
+	(gtk_tree_view_update_rubber_band_selection),
+	(gtk_tree_view_bin_expose), (gtk_tree_view_set_model): slightly
+	modify the rubber banding code to mimic the pen dragging found
+	in maemo-gtk-2-6.  Changes include: disabling drawing the rubber
+	band, do not immediately set the cursor on button press,
+	don't select insensitive rows when rubber banding.
+
+	* gtk/gtktreeprivate.h (struct _GtkTreePrivate): add
+	queued_select_row field.
+
 2007-01-30  Michael Natterer  <mitch at imendio.com>
 
 	* gtk/gtkentry.c (gtk_entry_real_activate): port over

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeprivate.h
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeprivate.h	2007-02-01 09:34:00 UTC (rev 9505)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeprivate.h	2007-02-01 11:36:48 UTC (rev 9506)
@@ -263,6 +263,11 @@
 
   gboolean tree_lines_enabled;
   GdkGC *tree_line_gc;
+
+#ifdef MAEMO_CHANGES
+  /* Fields for Maemo specific functionality */
+  GtkTreeRowReference *queued_select_row;
+#endif /* MAEMO_CHANGES */
 };
 
 #ifdef __GNUC__

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeview.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeview.c	2007-02-01 09:34:00 UTC (rev 9505)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreeview.c	2007-02-01 11:36:48 UTC (rev 9506)
@@ -725,7 +725,11 @@
                                      g_param_spec_boolean ("rubber-banding",
                                                            P_("Rubber Banding"),
                                                            P_("Whether to enable selection of multiple items by dragging the mouse pointer"),
+#ifndef MAEMO_CHANGES
                                                            FALSE,
+#else /* MAEMO_CHANGES */
+							   TRUE,
+#endif /* MAEMO_CHANGES */
                                                            GTK_PARAM_READWRITE));
 
     g_object_class_install_property (o_class,
@@ -1349,9 +1353,15 @@
 
 #ifdef MAEMO_CHANGES
   tree_view->priv->level_indentation = 10;
+
+  tree_view->priv->queued_select_row = NULL;
 #endif /* MAEMO_CHANGES */
 
+#ifdef MAEMO_CHANGES
+  tree_view->priv->rubber_banding_enable = TRUE;
+#else /* !MAEMO_CHANGES */
   tree_view->priv->rubber_banding_enable = FALSE;
+#endif /* !MAEMO_CHANGES */
 
   tree_view->priv->grid_lines = GTK_TREE_VIEW_GRID_LINES_NONE;
   tree_view->priv->tree_lines_enabled = FALSE;
@@ -1598,6 +1608,14 @@
       tree_view->priv->top_row = NULL;
     }
 
+#ifdef MAEMO_CHANGES
+  if (tree_view->priv->queued_select_row != NULL)
+    {
+      gtk_tree_row_reference_free (tree_view->priv->queued_select_row);
+      tree_view->priv->queued_select_row = NULL;
+    }
+#endif /* MAEMO_CHANGES */
+
   if (tree_view->priv->column_drop_func_data &&
       tree_view->priv->column_drop_func_data_destroy)
     {
@@ -2455,6 +2473,9 @@
       gboolean row_double_click = FALSE;
       gboolean rtl;
       gboolean node_selected;
+#ifdef MAEMO_CHANGES
+      gboolean node_is_selectable;
+#endif /* MAEMO_CHANGES */
 
       /* Empty tree? */
       if (tree_view->priv->tree == NULL)
@@ -2622,6 +2643,40 @@
 	    gtk_tree_path_free (anchor);
 	}
 
+#ifdef MAEMO_CHANGES
+      node_selected = GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED);
+      node_is_selectable =
+	_gtk_tree_selection_row_is_selectable (tree_view->priv->selection,
+					       node, path);
+
+      /* Save press to possibly begin a drag
+       */
+      if (!column_handled_click &&
+	  !tree_view->priv->in_grab &&
+	  tree_view->priv->pressed_button < 0)
+        {
+          tree_view->priv->pressed_button = event->button;
+          tree_view->priv->press_start_x = event->x;
+          tree_view->priv->press_start_y = event->y;
+
+	  if (tree_view->priv->rubber_banding_enable
+	      && node_is_selectable
+	      && !node_selected
+	      && tree_view->priv->selection->type == GTK_SELECTION_MULTIPLE)
+	    {
+	      tree_view->priv->press_start_y += tree_view->priv->dy;
+	      tree_view->priv->rubber_band_x = event->x;
+	      tree_view->priv->rubber_band_y = event->y + tree_view->priv->dy;
+	      tree_view->priv->rubber_band_status = RUBBER_BAND_MAYBE_START;
+
+	      if ((event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
+		tree_view->priv->rubber_band_ctrl = TRUE;
+	      if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
+		tree_view->priv->rubber_band_shift = TRUE;
+	    }
+        }
+#endif /* MAEMO_CHANGES */
+
       /* select */
       node_selected = GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED);
       pre_val = tree_view->priv->vadjustment->value;
@@ -2639,7 +2694,48 @@
           if (focus_cell)
             gtk_tree_view_column_focus_cell (column, focus_cell);
 
-          if (event->state & GDK_CONTROL_MASK)
+#ifdef MAEMO_CHANGES
+	  if (node_is_selectable
+	      && tree_view->priv->rubber_band_status == RUBBER_BAND_OFF
+	      && gtk_tree_selection_get_mode (tree_view->priv->selection) == GTK_SELECTION_MULTIPLE)
+	    {
+	      /* We do not know at this stage if a user is going to do
+	       * a DnD or tap and hold operation, so avoid clearing
+	       * the current selection.
+	       */
+	      if (tree_view->priv->queued_select_row)
+		gtk_tree_row_reference_free (tree_view->priv->queued_select_row);
+	      tree_view->priv->queued_select_row = NULL;
+
+	      if (node_is_selectable)
+	        {
+		  GtkTreePath *old_cursor_path = NULL;
+
+		  /* Do move the focus */
+		  if (tree_view->priv->cursor)
+		    {
+		      old_cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor);
+		      gtk_tree_row_reference_free (tree_view->priv->cursor);
+		    }
+
+		  tree_view->priv->cursor = gtk_tree_row_reference_new (tree_view->priv->model, path);
+
+		  gtk_tree_view_queue_draw_path (tree_view, path, NULL);
+		  if (old_cursor_path)
+		    {
+		      gtk_tree_view_queue_draw_path (tree_view,
+						     old_cursor_path, NULL);
+		      gtk_tree_path_free (old_cursor_path);
+		    }
+
+		  tree_view->priv->queued_select_row =
+		    gtk_tree_row_reference_new (tree_view->priv->model, path);
+		}
+	    }
+	  /* Else, set the cursor as usual */
+	  else
+#endif /* MAEMO_CHANGES */
+	  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);
@@ -2668,6 +2764,7 @@
       cell_area.y += dval;
       background_area.y += dval;
 
+#ifndef MAEMO_CHANGES
       /* Save press to possibly begin a drag
        */
       if (!column_handled_click &&
@@ -2693,6 +2790,7 @@
 		tree_view->priv->rubber_band_shift = TRUE;
 	    }
         }
+#endif /* !MAEMO_CHANGES */
 
       /* Test if a double click happened on the same row. */
       if (event->button == 1)
@@ -2916,6 +3014,20 @@
   if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE))
     return gtk_tree_view_button_release_column_resize (widget, event);
 
+#ifdef MAEMO_CHANGES
+  if (gtk_tree_row_reference_valid (tree_view->priv->queued_select_row))
+    {
+      GtkTreePath *path;
+
+      path = gtk_tree_row_reference_get_path (tree_view->priv->queued_select_row);
+      gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
+
+      gtk_tree_path_free (path);
+      gtk_tree_row_reference_free (tree_view->priv->queued_select_row);
+      tree_view->priv->queued_select_row = NULL;
+    }
+#endif /* MAEMO_CHANGES */
+
   if (tree_view->priv->button_pressed_node == NULL)
     return FALSE;
 
@@ -3675,6 +3787,24 @@
 
   do
     {
+#ifdef MAEMO_CHANGES
+      /* Small optimization by assuming insensitive nodes are never
+       * selected.
+       */
+      if (!GTK_RBNODE_FLAG_SET (start_node, GTK_RBNODE_IS_SELECTED))
+        {
+	  GtkTreePath *path;
+	  gboolean selectable;
+
+	  path = _gtk_tree_view_find_path (tree_view, start_tree, start_node);
+	  selectable = _gtk_tree_selection_row_is_selectable (tree_view->priv->selection, start_node, path);
+	  gtk_tree_path_free (path);
+
+	  if (!selectable)
+	    goto node_not_selectable;
+	}
+#endif /* MAEMO_CHANGES */
+
       if (select)
         {
 	  if (tree_view->priv->rubber_band_shift)
@@ -3709,6 +3839,9 @@
 
       _gtk_tree_view_queue_draw_node (tree_view, start_tree, start_node, NULL);
 
+#ifdef MAEMO_CHANGES
+node_not_selectable:
+#endif /* MAEMO_CHANGES */
       if (start_node == end_node)
 	break;
 
@@ -4818,6 +4951,7 @@
 done:
   gtk_tree_view_draw_grid_lines (tree_view, event, n_visible_columns);
 
+#ifndef MAEMO_CHANGES
  if (tree_view->priv->rubber_band_status == RUBBER_BAND_ACTIVE)
    {
      GdkRectangle *rectangles;
@@ -4832,6 +4966,7 @@
 
      g_free (rectangles);
    }
+#endif /* !MAEMO_CHANGES */
 
   if (cursor_path)
     gtk_tree_path_free (cursor_path);
@@ -10751,6 +10886,11 @@
       gtk_tree_row_reference_free (tree_view->priv->scroll_to_path);
       tree_view->priv->scroll_to_path = NULL;
 
+#ifdef MAEMO_CHANGES
+      gtk_tree_row_reference_free (tree_view->priv->queued_select_row);
+      tree_view->priv->queued_select_row = NULL;
+#endif /* MAEMO_CHANGES */
+
       tree_view->priv->scroll_to_column = NULL;
 
       g_object_unref (tree_view->priv->model);


More information about the maemo-commits mailing list