[gtk/bin-removal: 29/44] listboxrow: Derive from GtkWidget



commit a0a5b1fb69b85e548a7f924385b23ba74561b466
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun May 3 00:09:18 2020 -0400

    listboxrow: Derive from GtkWidget
    
    We want to remove GtkBin and GtkContainer as they don't
    provide much useful functionality anymore.
    
    See #2681

 gtk/a11y/gtklistboxrowaccessible.c |  4 +-
 gtk/gtklistbox.c                   | 91 +++++++++++++++++++++++++++++++++++---
 gtk/gtklistbox.h                   | 11 ++++-
 gtk/gtkshortcutswindow.c           |  2 +-
 gtk/gtkstacksidebar.c              |  4 +-
 gtk/ui/gtkplacesviewrow.ui         |  4 +-
 gtk/ui/gtksidebarrow.ui            |  4 +-
 7 files changed, 102 insertions(+), 18 deletions(-)
---
diff --git a/gtk/a11y/gtklistboxrowaccessible.c b/gtk/a11y/gtklistboxrowaccessible.c
index 27f962347e..6a37efb1a5 100644
--- a/gtk/a11y/gtklistboxrowaccessible.c
+++ b/gtk/a11y/gtklistboxrowaccessible.c
@@ -22,7 +22,7 @@
 #include "gtk/gtklistbox.h"
 
 
-G_DEFINE_TYPE (GtkListBoxRowAccessible, gtk_list_box_row_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE)
+G_DEFINE_TYPE (GtkListBoxRowAccessible, gtk_list_box_row_accessible, GTK_TYPE_WIDGET_ACCESSIBLE)
 
 static void
 gtk_list_box_row_accessible_init (GtkListBoxRowAccessible *accessible)
@@ -50,7 +50,7 @@ gtk_list_box_row_accessible_ref_state_set (AtkObject *obj)
   if (widget != NULL)
     {
       parent = gtk_widget_get_parent (widget);
-      if (parent != NULL && 
+      if (parent != NULL &&
           GTK_IS_LIST_BOX (parent) &&
           gtk_list_box_get_selection_mode (GTK_LIST_BOX (parent)) != GTK_SELECTION_NONE)
         atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 28f7299023..fd9376ae35 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -21,6 +21,7 @@
 
 #include "gtkactionhelperprivate.h"
 #include "gtkadjustmentprivate.h"
+#include "gtkbinlayout.h"
 #include "gtkbuildable.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkgestureclick.h"
@@ -156,6 +157,7 @@ struct _GtkListBoxClass
 
 typedef struct
 {
+  GtkWidget *child;
   GSequenceIter *iter;
   GtkWidget *header;
   GtkActionHelper *action_helper;
@@ -197,6 +199,7 @@ enum {
   ROW_PROP_0,
   ROW_PROP_ACTIVATABLE,
   ROW_PROP_SELECTABLE,
+  ROW_PROP_CHILD,
 
   /* actionable properties */
   ROW_PROP_ACTION_NAME,
@@ -211,13 +214,16 @@ static GtkBuildableIface *parent_buildable_iface;
 
 static void     gtk_list_box_buildable_interface_init   (GtkBuildableIface *iface);
 
+static void     gtk_list_box_row_buildable_iface_init (GtkBuildableIface *iface);
 static void     gtk_list_box_row_actionable_iface_init  (GtkActionableInterface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (GtkListBox, gtk_list_box, GTK_TYPE_CONTAINER,
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
                                                 gtk_list_box_buildable_interface_init))
-G_DEFINE_TYPE_WITH_CODE (GtkListBoxRow, gtk_list_box_row, GTK_TYPE_BIN,
+G_DEFINE_TYPE_WITH_CODE (GtkListBoxRow, gtk_list_box_row, GTK_TYPE_WIDGET,
                          G_ADD_PRIVATE (GtkListBoxRow)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                                gtk_list_box_row_buildable_iface_init )
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIONABLE, gtk_list_box_row_actionable_iface_init))
 
 static void                 gtk_list_box_apply_filter_all             (GtkListBox          *box);
@@ -328,6 +334,29 @@ static guint signals[LAST_SIGNAL] = { 0 };
 static GParamSpec *row_properties[LAST_ROW_PROPERTY] = { NULL, };
 static guint row_signals[ROW__LAST_SIGNAL] = { 0 };
 
+
+static GtkBuildableIface *parent_row_buildable_iface;
+
+static void
+gtk_list_box_row_buildable_add_child (GtkBuildable *buildable,
+                                      GtkBuilder   *builder,
+                                      GObject      *child,
+                                      const gchar  *type)
+{
+  if (GTK_IS_WIDGET (child))
+    gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (buildable), GTK_WIDGET (child));
+  else
+    parent_row_buildable_iface->add_child (buildable, builder, child, type);
+}
+
+static void
+gtk_list_box_row_buildable_iface_init (GtkBuildableIface *iface)
+{
+  parent_row_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->add_child = gtk_list_box_row_buildable_add_child;
+}
+
 /**
  * gtk_list_box_new:
  *
@@ -2605,7 +2634,7 @@ gtk_list_box_insert (GtkListBox *box,
   else
     {
       row = GTK_LIST_BOX_ROW (gtk_list_box_row_new ());
-      gtk_container_add (GTK_CONTAINER (row), child);
+      gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), child);
     }
 
   if (box->sort_func != NULL)
@@ -2851,6 +2880,42 @@ gtk_list_box_row_new (void)
   return g_object_new (GTK_TYPE_LIST_BOX_ROW, NULL);
 }
 
+/**
+ * gtk_list_box_row_set_child:
+ * @row: a #GtkListBoxRow
+ * @child: (allow-none): the child widget
+ *
+ * Sets the child widget of @self.
+ */
+void
+gtk_list_box_row_set_child (GtkListBoxRow *row,
+                            GtkWidget     *child)
+{
+  GtkListBoxRowPrivate *priv = ROW_PRIV (row);
+
+  g_clear_pointer (&priv->child, gtk_widget_unparent);
+
+  priv->child = child;
+  if (child)
+    gtk_widget_set_parent (child, GTK_WIDGET (row));
+
+  g_object_notify_by_pspec (G_OBJECT (row), row_properties[ROW_PROP_CHILD]);
+}
+
+/**
+ * gtk_list_box_row_get_child:
+ * @row: a #GtkListBoxRow
+ *
+ * Gets the child widget of @row.
+ *
+ * Returns: (nullable) (transfer none): the child widget of @row
+ */
+GtkWidget *
+gtk_list_box_row_get_child (GtkListBoxRow *row)
+{
+  return ROW_PRIV (row)->child;
+}
+
 static void
 gtk_list_box_row_set_focus (GtkListBoxRow *row)
 {
@@ -2868,9 +2933,7 @@ gtk_list_box_row_focus (GtkWidget        *widget,
 {
   GtkListBoxRow *row = GTK_LIST_BOX_ROW (widget);
   gboolean had_focus = FALSE;
-  GtkWidget *child;
-
-  child = gtk_bin_get_child (GTK_BIN (widget));
+  GtkWidget *child = ROW_PRIV (row)->child;
 
   g_object_get (widget, "has-focus", &had_focus, NULL);
   if (had_focus)
@@ -3233,6 +3296,9 @@ gtk_list_box_row_get_property (GObject    *obj,
     case ROW_PROP_ACTION_TARGET:
       g_value_set_variant (value, gtk_action_helper_get_action_target_value (ROW_PRIV (row)->action_helper));
       break;
+    case ROW_PROP_CHILD:
+      g_value_set_object (value, gtk_list_box_row_get_child (row));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -3261,6 +3327,9 @@ gtk_list_box_row_set_property (GObject      *obj,
     case ROW_PROP_ACTION_TARGET:
       gtk_list_box_row_set_action_target_value (GTK_ACTIONABLE (row), g_value_get_variant (value));
       break;
+    case ROW_PROP_CHILD:
+      gtk_list_box_row_set_child (row, g_value_get_object (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -3307,6 +3376,7 @@ gtk_list_box_row_dispose (GObject *object)
   GtkListBoxRowPrivate *priv = ROW_PRIV (row);
 
   g_clear_object (&priv->action_helper);
+  g_clear_pointer (&priv->child, gtk_widget_unparent);
 
   G_OBJECT_CLASS (gtk_list_box_row_parent_class)->dispose (object);
 }
@@ -3333,8 +3403,6 @@ gtk_list_box_row_class_init (GtkListBoxRowClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ROW_ACCESSIBLE);
-
   object_class->get_property = gtk_list_box_row_get_property;
   object_class->set_property = gtk_list_box_row_set_property;
   object_class->finalize = gtk_list_box_row_finalize;
@@ -3391,11 +3459,20 @@ gtk_list_box_row_class_init (GtkListBoxRowClass *klass)
                           TRUE,
                           G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
+  row_properties[ROW_PROP_CHILD] =
+    g_param_spec_object ("child",
+                         P_("Child"),
+                         P_("The child widget"),
+                         GTK_TYPE_WIDGET,
+                         G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (object_class, LAST_ROW_PROPERTY, row_properties);
 
   g_object_class_override_property (object_class, ROW_PROP_ACTION_NAME, "action-name");
   g_object_class_override_property (object_class, ROW_PROP_ACTION_TARGET, "action-target");
 
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+  gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ROW_ACCESSIBLE);
   gtk_widget_class_set_css_name (widget_class, I_("row"));
 }
 
diff --git a/gtk/gtklistbox.h b/gtk/gtklistbox.h
index bcd1d1da96..5f59e4badb 100644
--- a/gtk/gtklistbox.h
+++ b/gtk/gtklistbox.h
@@ -48,7 +48,7 @@ typedef struct _GtkListBoxRowClass   GtkListBoxRowClass;
 
 struct _GtkListBoxRow
 {
-  GtkBin parent_instance;
+  GtkWidget parent_instance;
 };
 
 /**
@@ -58,7 +58,7 @@ struct _GtkListBoxRow
  */
 struct _GtkListBoxRowClass
 {
-  GtkBinClass parent_class;
+  GtkWidgetClass parent_class;
 
   /*< public >*/
 
@@ -129,6 +129,13 @@ GDK_AVAILABLE_IN_ALL
 GType      gtk_list_box_row_get_type      (void) G_GNUC_CONST;
 GDK_AVAILABLE_IN_ALL
 GtkWidget* gtk_list_box_row_new           (void);
+
+GDK_AVAILABLE_IN_ALL
+void       gtk_list_box_row_set_child     (GtkListBoxRow *row,
+                                           GtkWidget      *child);
+GDK_AVAILABLE_IN_ALL
+GtkWidget *gtk_list_box_row_get_child     (GtkListBoxRow *row);
+
 GDK_AVAILABLE_IN_ALL
 GtkWidget* gtk_list_box_row_get_header    (GtkListBoxRow *row);
 GDK_AVAILABLE_IN_ALL
diff --git a/gtk/gtkshortcutswindow.c b/gtk/gtkshortcutswindow.c
index aa235dd0ca..cc8e35aa1e 100644
--- a/gtk/gtkshortcutswindow.c
+++ b/gtk/gtkshortcutswindow.c
@@ -365,7 +365,7 @@ gtk_shortcuts_window_add_section (GtkShortcutsWindow  *self,
                         "xalign", 0.5f,
                         NULL);
   g_object_set_data (G_OBJECT (section), "gtk-shortcuts-title", label);
-  gtk_container_add (GTK_CONTAINER (row), GTK_WIDGET (label));
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), GTK_WIDGET (label));
   gtk_container_add (GTK_CONTAINER (priv->list_box), GTK_WIDGET (row));
 
   update_title_stack (self);
diff --git a/gtk/gtkstacksidebar.c b/gtk/gtkstacksidebar.c
index 8dfed9c749..b28ad7c17a 100644
--- a/gtk/gtkstacksidebar.c
+++ b/gtk/gtkstacksidebar.c
@@ -194,7 +194,7 @@ update_row (GtkStackSidebar *self,
                 "visible", &visible,
                 NULL);
 
-  item = gtk_bin_get_child (GTK_BIN (row));
+  item = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
   gtk_label_set_text (GTK_LABEL (item), title);
 
   gtk_widget_set_visible (row, visible && title != NULL);
@@ -231,7 +231,7 @@ add_child (guint            position,
   gtk_widget_set_halign (item, GTK_ALIGN_START);
   gtk_widget_set_valign (item, GTK_ALIGN_CENTER);
   row = gtk_list_box_row_new ();
-  gtk_container_add (GTK_CONTAINER (row), item);
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), item);
 
   page = g_list_model_get_item (G_LIST_MODEL (self->pages), position);
   update_row (self, page, row);
diff --git a/gtk/ui/gtkplacesviewrow.ui b/gtk/ui/gtkplacesviewrow.ui
index bd4ec79d89..915d20a189 100644
--- a/gtk/ui/gtkplacesviewrow.ui
+++ b/gtk/ui/gtkplacesviewrow.ui
@@ -3,7 +3,7 @@
   <requires lib="gtk+" version="3.16"/>
   <template class="GtkPlacesViewRow" parent="GtkListBoxRow">
     <property name="width-request">100</property>
-    <child>
+    <property name="child">
       <object class="GtkBox" id="box">
         <property name="margin-start">12</property>
         <property name="margin-end">12</property>
@@ -79,6 +79,6 @@
           </object>
         </child>
       </object>
-    </child>
+    </property>
   </template>
 </interface>
diff --git a/gtk/ui/gtksidebarrow.ui b/gtk/ui/gtksidebarrow.ui
index e2dc479476..38ecbf3be8 100644
--- a/gtk/ui/gtksidebarrow.ui
+++ b/gtk/ui/gtksidebarrow.ui
@@ -7,7 +7,7 @@
     <style>
       <class name="sidebar-row"/>
     </style>
-    <child>
+    <property name="child">
       <object class="GtkRevealer" id="revealer">
         <property name="reveal-child">1</property>
         <signal name="notify::child-revealed" handler="on_child_revealed"/>
@@ -67,6 +67,6 @@
           </object>
         </child>
       </object>
-    </child>
+    </property>
   </template>
 </interface>


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