summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/gtk/gtk4-sections.txt2
-rw-r--r--gtk/gtkoverlay.c92
-rw-r--r--gtk/gtkoverlay.h13
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;
@@ -267,12 +271,55 @@ 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)
{
GObjectClass *object_class = G_OBJECT_CLASS (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);