[gtk/bin-removal: 23/40] overlay: Add a child property



commit 53f9737dcfc35e079ad56286be774c986fad8a9d
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun May 3 10:31:09 2020 -0400

    overlay: Add a child property

 docs/reference/gtk/gtk4-sections.txt |  2 +
 gtk/gtkoverlay.c                     | 92 ++++++++++++++++++++++++++++++++++++
 gtk/gtkoverlay.h                     | 13 +++--
 3 files changed, 104 insertions(+), 3 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 0f2bcbb77e..ee2e2b37b5 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -5482,6 +5482,8 @@ GtkLockButtonPrivate
 GtkOverlay
 
 gtk_overlay_new
+gtk_overlay_set_child
+gtk_overlay_get_child
 gtk_overlay_add_overlay
 gtk_overlay_get_measure_overlay
 gtk_overlay_set_measure_overlay
diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c
index 8298411f7a..45277bad44 100644
--- a/gtk/gtkoverlay.c
+++ b/gtk/gtkoverlay.c
@@ -73,6 +73,10 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
+enum {
+  PROP_CHILD = 1
+};
+
 static void gtk_overlay_buildable_init (GtkBuildableIface *iface);
 
 typedef struct _GtkOverlayClass GtkOverlayClass;
@@ -266,6 +270,46 @@ gtk_overlay_snapshot (GtkWidget   *widget,
     }
 }
 
+static void
+gtk_overlay_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+  GtkOverlay *overlay = GTK_OVERLAY (object);
+
+  switch (prop_id)
+    {
+    case PROP_CHILD:
+      g_value_set_object (value, gtk_overlay_get_child (overlay));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_overlay_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+  GtkOverlay *overlay = GTK_OVERLAY (object);
+
+  switch (prop_id)
+    {
+    case PROP_CHILD:
+      gtk_overlay_set_child (overlay, g_value_get_object (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
 static void
 gtk_overlay_class_init (GtkOverlayClass *klass)
 {
@@ -273,6 +317,9 @@ gtk_overlay_class_init (GtkOverlayClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
 
+  object_class->get_property = gtk_overlay_get_property;
+  object_class->set_property = gtk_overlay_set_property;
+
   widget_class->snapshot = gtk_overlay_snapshot;
 
   container_class->add = gtk_overlay_add;
@@ -281,6 +328,14 @@ gtk_overlay_class_init (GtkOverlayClass *klass)
 
   klass->get_child_position = gtk_overlay_get_child_position;
 
+  g_object_class_install_property (object_class,
+                                   PROP_CHILD,
+                                   g_param_spec_object ("child",
+                                                        P_("Child"),
+                                                        P_("The child widget"),
+                                                        GTK_TYPE_WIDGET,
+                                                        GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
+
   /**
    * GtkOverlay::get-child-position:
    * @overlay: the #GtkOverlay
@@ -502,3 +557,40 @@ gtk_overlay_get_clip_overlay (GtkOverlay *overlay,
 
   return gtk_overlay_layout_child_get_clip_overlay (child);
 }
+
+/**
+ * gtk_overlay_set_child:
+ * @overlay: a #GtkOverlay
+ * @child: (allow-none): the child widget
+ *
+ * Sets the child widget of @overlay.
+ */
+void
+gtk_overlay_set_child (GtkOverlay *overlay,
+                       GtkWidget  *child)
+{
+  g_return_if_fail (GTK_IS_OVERLAY (overlay));
+  g_return_if_fail (child == NULL || GTK_IS_WIDGET (child));
+
+  if (gtk_bin_get_child (GTK_BIN (overlay)))
+    gtk_container_remove (GTK_CONTAINER (overlay), gtk_bin_get_child (GTK_BIN (overlay)));
+  else
+    gtk_container_add (GTK_CONTAINER (overlay), child);
+  g_object_notify (G_OBJECT (overlay), "child");
+}
+
+/**
+ * gtk_overlay_get_child:
+ * @overlay: a #GtkOverlay
+ *
+ * Gets the child widget of @overlay.
+ *
+ * Returns: (nullable) (transfer none): the child widget of @overlay
+ */
+GtkWidget *
+gtk_overlay_get_child (GtkOverlay *overlay)
+{
+  g_return_val_if_fail (GTK_IS_OVERLAY (overlay), NULL);
+
+  return gtk_bin_get_child (GTK_BIN (overlay));
+}
diff --git a/gtk/gtkoverlay.h b/gtk/gtkoverlay.h
index c646490cec..65b0412b36 100644
--- a/gtk/gtkoverlay.h
+++ b/gtk/gtkoverlay.h
@@ -42,13 +42,20 @@ GtkWidget *gtk_overlay_new         (void);
 GDK_AVAILABLE_IN_ALL
 void       gtk_overlay_add_overlay (GtkOverlay *overlay,
                                     GtkWidget  *widget);
+
+GDK_AVAILABLE_IN_ALL
+void                  gtk_overlay_set_child (GtkOverlay *overlay,
+                                             GtkWidget  *child);
+GDK_AVAILABLE_IN_ALL
+GtkWidget *           gtk_overlay_get_child (GtkOverlay *overlay);
+
 GDK_AVAILABLE_IN_ALL
 gboolean   gtk_overlay_get_measure_overlay (GtkOverlay *overlay,
-                                           GtkWidget  *widget);
+                                            GtkWidget  *widget);
 GDK_AVAILABLE_IN_ALL
 void       gtk_overlay_set_measure_overlay (GtkOverlay *overlay,
-                                           GtkWidget  *widget,
-                                           gboolean    measure);
+                                            GtkWidget  *widget,
+                                            gboolean    measure);
 GDK_AVAILABLE_IN_ALL
 gboolean   gtk_overlay_get_clip_overlay    (GtkOverlay *overlay,
                                             GtkWidget  *widget);


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