diff options
-rw-r--r-- | docs/reference/gtk/gtk4-sections.txt | 2 | ||||
-rw-r--r-- | gtk/gtkoverlay.c | 92 | ||||
-rw-r--r-- | 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; @@ -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); |