[gtk+] iconview: add support for prelight cells



commit e9de907f9ea18b3e8363c2498d5b3e84502d558e
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Wed Sep 14 17:32:02 2011 -0400

    iconview: add support for prelight cells
    
    Render GtkIconView cell items with the prelight state flag when they're
    being mouse hovered.
    This works basically in the same way it's done for GtkTreeView cells,
    and e.g. GtkCellRendererPixbuf will need to have its follow-state
    property to opt in to prelight rendering.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=615501

 gtk/gtkiconview.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 2324889..7c4b41b 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -82,6 +82,7 @@ struct _GtkIconViewItem
   
   gint row, col;
 
+  guint prelight : 1;
   guint selected : 1;
   guint selected_before_rubberbanding : 1;
 
@@ -134,6 +135,7 @@ struct _GtkIconViewPrivate
   GtkIconViewItem *cursor_item;
 
   GtkIconViewItem *last_single_clicked;
+  GtkIconViewItem *last_prelight;
 
   GtkOrientation item_orientation;
 
@@ -1740,6 +1742,33 @@ gtk_icon_view_motion (GtkWidget      *widget,
       else 
 	remove_scroll_timeout (icon_view);
     }
+  else
+    {
+      GtkIconViewItem *item, *last_prelight_item;
+      GtkCellRenderer *cell = NULL;
+
+      last_prelight_item = icon_view->priv->last_prelight;
+      item = gtk_icon_view_get_item_at_coords (icon_view,
+                                               event->x, event->y,
+                                               FALSE,
+                                               &cell);
+
+      if (item != NULL)
+        {
+          item->prelight = TRUE;
+          gtk_icon_view_queue_draw_item (icon_view, item);
+        }
+
+      if (last_prelight_item != NULL &&
+          last_prelight_item != item)
+        {
+          last_prelight_item->prelight = FALSE;
+          gtk_icon_view_queue_draw_item (icon_view,
+                                         icon_view->priv->last_prelight);
+        }
+
+      icon_view->priv->last_prelight = item;
+    }
   
   return TRUE;
 }
@@ -2947,9 +2976,18 @@ gtk_icon_view_paint_item (GtkIconView     *icon_view,
 
       state |= GTK_STATE_FLAG_SELECTED;
       flags |= GTK_CELL_RENDERER_SELECTED;
+    }
+
+  if (item->prelight)
+    {
+      state |= GTK_STATE_FLAG_PRELIGHT;
+      flags |= GTK_CELL_RENDERER_PRELIT;
+    }
 
-      gtk_style_context_set_state (style_context, state);
+  gtk_style_context_set_state (style_context, state);
 
+  if (item->selected)
+    {
       gtk_render_background (style_context, cr,
                              x - icon_view->priv->item_padding,
                              y - icon_view->priv->item_padding,
@@ -3368,6 +3406,9 @@ gtk_icon_view_row_deleted (GtkTreeModel *model,
   if (item == icon_view->priv->cursor_item)
     icon_view->priv->cursor_item = NULL;
 
+  if (item == icon_view->priv->last_prelight)
+    icon_view->priv->last_prelight = NULL;
+
   if (item->selected)
     emit = TRUE;
   
@@ -4845,6 +4886,7 @@ gtk_icon_view_set_model (GtkIconView *icon_view,
       icon_view->priv->anchor_item = NULL;
       icon_view->priv->cursor_item = NULL;
       icon_view->priv->last_single_clicked = NULL;
+      icon_view->priv->last_prelight = NULL;
       icon_view->priv->width = 0;
       icon_view->priv->height = 0;
     }



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