[gtk+/treeview-refactor] Revisit "Handle clicks in indentation area"



commit c8d130efa7a0d807bdaa50381d12c3f4223e8e2c
Author: Kristian Rietveld <kris gtk org>
Date:   Wed Dec 15 23:45:04 2010 +0100

    Revisit "Handle clicks in indentation area"
    
    Check (x, y) is inside background area.  If yes, continue processing
    and clamp the coordinates into cell area.  This way we will properly
    handle getting a cell (which is only used for setting the focus cell)
    for clicks in the indentation area (in LTR and RTL mode) and clicks
    in the focus rectangle area in case focus-line-width is large.

 gtk/gtktreeprivate.h    |    1 +
 gtk/gtktreeview.c       |    1 +
 gtk/gtktreeviewcolumn.c |   30 ++++++++++++++++++++++++------
 3 files changed, 26 insertions(+), 6 deletions(-)
---
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index 9fe2074..9ee61f1 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -123,6 +123,7 @@ gboolean          _gtk_tree_view_column_has_editable_cell(GtkTreeViewColumn  *co
 GtkCellRenderer  *_gtk_tree_view_column_get_edited_cell  (GtkTreeViewColumn  *column);
 GtkCellRenderer  *_gtk_tree_view_column_get_cell_at_pos  (GtkTreeViewColumn  *column,
                                                           GdkRectangle       *cell_area,
+                                                          GdkRectangle       *background_area,
                                                           gint                x,
                                                           gint                y);
 
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 50d367d..f34d6c2 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -3135,6 +3135,7 @@ gtk_tree_view_button_press (GtkWidget      *widget,
            */
           focus_cell = _gtk_tree_view_column_get_cell_at_pos (column,
                                                               &cell_area,
+                                                              &background_area,
                                                               event->x,
                                                               event->y);
 
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index 2621cb3..905a7bb 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -1473,19 +1473,37 @@ _gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn *column)
 GtkCellRenderer *
 _gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column,
                                        GdkRectangle      *cell_area,
+                                       GdkRectangle      *background_area,
                                        gint               x,
                                        gint               y)
 {
   GtkCellRenderer *match = NULL;
   GtkTreeViewColumnPrivate *priv = column->priv;
 
+  /* If (x, y) is outside of the background area, immediately return */
+  if (x < background_area->x ||
+      x > background_area->x + background_area->width ||
+      y < background_area->y ||
+      y > background_area->y + background_area->height)
+    return NULL;
+
+  /* If (x, y) is inside the background area, clamp it to the cell_area
+   * so that a cell is still returned.  The main reason for doing this
+   * (on the x axis) is for handling clicks in the indentation area
+   * (either at the left or right depending on RTL setting).  Another
+   * reason is for handling clicks on the area where the focus rectangle
+   * is drawn (this is outside of cell area), this manifests itself
+   * mainly when a large setting is used for focus-line-width.
+   */
   if (x < cell_area->x)
-    {
-      /* This can happen when we click in the "indentation".  In this
-       * case, we set x to cell_area->x, the start of the first cell.
-       */
-      x = cell_area->x;
-    }
+    x = cell_area->x;
+  else if (x > cell_area->x + cell_area->width)
+    x = cell_area->x + cell_area->width;
+
+  if (y < cell_area->y)
+    y = cell_area->y;
+  else if (y > cell_area->y + cell_area->height)
+    y = cell_area->y + cell_area->height;
 
   match = gtk_cell_area_get_cell_at_position (priv->cell_area,
                                               priv->cell_area_context,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]