[gtk+] GtkListBox: Style selectable rows differently



commit 7932370ef85c22142ba1e0073fd276fb65326eb2
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jul 15 23:13:43 2014 -0400

    GtkListBox: Style selectable rows differently
    
    We now apply the .button style class to rows that are either
    activatable or selectable. Selectable rows only get the .button
    if the listbox allows selection. This implies that we need to
    update row styles when the selection mode changes, or when the
    row gets added to a listbox.

 gtk/gtklistbox.c |   37 +++++++++++++++++++++++++++++++++----
 1 files changed, 33 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index b07898c..a679edb 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -244,6 +244,9 @@ static void gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gest
                                                       gdouble               y,
                                                       GtkListBox           *box);
 
+static void gtk_list_box_update_row_styles (GtkListBox    *box);
+static void gtk_list_box_update_row_style  (GtkListBox    *box,
+                                            GtkListBoxRow *row);
 
 static GParamSpec *properties[LAST_PROPERTY] = { NULL, };
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -974,6 +977,8 @@ gtk_list_box_set_selection_mode (GtkListBox       *box,
 
   priv->selection_mode = mode;
 
+  gtk_list_box_update_row_styles (box);
+
   g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_SELECTION_MODE]);
 
   if (dirty)
@@ -2587,6 +2592,7 @@ gtk_list_box_insert (GtkListBox *box,
   if (ROW_PRIV (row)->visible)
     list_box_add_visible_rows (box, 1);
   gtk_list_box_apply_filter (box, row);
+  gtk_list_box_update_row_style (box, row);
   if (gtk_widget_get_visible (GTK_WIDGET (box)))
     {
       gtk_list_box_update_header (box, ROW_PRIV (row)->iter);
@@ -3229,17 +3235,40 @@ gtk_list_box_row_is_selected (GtkListBoxRow *row)
 }
 
 static void
-update_row_style (GtkListBoxRow *row)
+gtk_list_box_update_row_style (GtkListBox    *box,
+                               GtkListBoxRow *row)
 {
   GtkStyleContext *context;
+  gboolean can_select;
+
+  if (box && BOX_PRIV (box)->selection_mode != GTK_SELECTION_NONE)
+    can_select = TRUE;
+  else
+    can_select = FALSE;
 
   context = gtk_widget_get_style_context (GTK_WIDGET (row));
-  if (ROW_PRIV (row)->activatable)
+  if (ROW_PRIV (row)->activatable ||
+      (ROW_PRIV (row)->selectable && can_select))
     gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
   else
     gtk_style_context_remove_class (context, GTK_STYLE_CLASS_BUTTON);
 }
 
+static void
+gtk_list_box_update_row_styles (GtkListBox *box)
+{
+  GSequenceIter *iter;
+  GtkListBoxRow *row;
+
+  for (iter = g_sequence_get_begin_iter (BOX_PRIV (box)->children);
+       !g_sequence_iter_is_end (iter);
+       iter = g_sequence_iter_next (iter))
+    {
+      row = g_sequence_get (iter);
+      gtk_list_box_update_row_style (box, row);
+    }
+}
+
 /**
  * gtk_list_box_row_set_activatable:
  * @row: a #GTkListBoxrow
@@ -3261,7 +3290,7 @@ gtk_list_box_row_set_activatable (GtkListBoxRow *row,
     {
       ROW_PRIV (row)->activatable = activatable;
 
-      update_row_style (row);
+      gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row);
       g_object_notify (G_OBJECT (row), "activatable");
     }
 }
@@ -3309,7 +3338,7 @@ gtk_list_box_row_set_selectable (GtkListBoxRow *row,
  
       ROW_PRIV (row)->selectable = selectable;
 
-      update_row_style (row);
+      gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row);
       g_object_notify (G_OBJECT (row), "selectable");
     }
 }


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