[gtk+] gadget: Handle visibility
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gadget: Handle visibility
- Date: Tue, 29 Dec 2015 21:49:15 +0000 (UTC)
commit acbff854029cc5b308c92024990abeb81355c360
Author: Benjamin Otte <otte redhat com>
Date: Wed Dec 23 01:50:20 2015 +0100
gadget: Handle visibility
As GtkCssNode has the visibility concept, it makes sense to mirror it in
gadgets.
Do what visibility does in widgets: Hidden gadgets can't be drawn or
allocated and request a 0x0 size.
Note that just like widgets, gadget visibility must not be changed in
size request, allocate or draw handlers.
GtkWidget::child-visible has no equivalent yet, code will have to
emulate that manually.
gtk/gtkcssgadget.c | 52 +++++++++++++++++++++++++++++++++++++++++++++
gtk/gtkcssgadgetprivate.h | 4 +++
2 files changed, 56 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkcssgadget.c b/gtk/gtkcssgadget.c
index 7f8abb0..18d9370 100644
--- a/gtk/gtkcssgadget.c
+++ b/gtk/gtkcssgadget.c
@@ -337,6 +337,23 @@ gtk_css_gadget_get_owner (GtkCssGadget *gadget)
return priv->owner;
}
+void
+gtk_css_gadget_set_visible (GtkCssGadget *gadget,
+ gboolean visible)
+{
+ GtkCssGadgetPrivate *priv = gtk_css_gadget_get_instance_private (gadget);
+
+ gtk_css_node_set_visible (priv->node, visible);
+}
+
+gboolean
+gtk_css_gadget_get_visible (GtkCssGadget *gadget)
+{
+ GtkCssGadgetPrivate *priv = gtk_css_gadget_get_instance_private (gadget);
+
+ return gtk_css_node_get_visible (priv->node);
+}
+
/**
* gtk_css_gadget_add_class:
* @gadget: a #GtkCssGadget
@@ -456,6 +473,17 @@ gtk_css_gadget_get_preferred_size (GtkCssGadget *gadget,
if (natural == NULL)
natural = &unused_natural;
+ if (!gtk_css_gadget_get_visible (gadget))
+ {
+ *minimum = 0;
+ *natural = 0;
+ if (minimum_baseline)
+ *minimum_baseline = -1;
+ if (natural_baseline)
+ *natural_baseline = -1;
+ return;
+ }
+
style = gtk_css_gadget_get_style (gadget);
get_box_margin (style, &margin);
get_box_border (style, &border);
@@ -531,6 +559,9 @@ gtk_css_gadget_allocate (GtkCssGadget *gadget,
g_return_if_fail (out_clip != NULL);
+ if (!gtk_css_gadget_get_visible (gadget))
+ return;
+
priv->allocated_size = *allocation;
priv->allocated_baseline = baseline;
@@ -609,6 +640,9 @@ gtk_css_gadget_draw (GtkCssGadget *gadget,
int x, y, width, height;
int contents_x, contents_y, contents_width, contents_height;
+ if (!gtk_css_gadget_get_visible (gadget))
+ return;
+
x = priv->allocated_size.x;
y = priv->allocated_size.y;
if (priv->owner && !gtk_widget_get_has_window (priv->owner))
@@ -694,6 +728,15 @@ gtk_css_gadget_get_border_allocation (GtkCssGadget *gadget,
g_return_if_fail (GTK_IS_CSS_GADGET (gadget));
+ if (!gtk_css_gadget_get_visible (gadget))
+ {
+ if (allocation)
+ allocation->x = allocation->y = allocation->width = allocation->height = 0;
+ if (baseline)
+ *baseline = -1;
+ return;
+ }
+
get_box_margin (gtk_css_gadget_get_style (gadget), &margin);
if (allocation)
@@ -723,6 +766,15 @@ gtk_css_gadget_get_content_allocation (GtkCssGadget *gadget,
g_return_if_fail (GTK_IS_CSS_GADGET (gadget));
+ if (!gtk_css_gadget_get_visible (gadget))
+ {
+ if (allocation)
+ allocation->x = allocation->y = allocation->width = allocation->height = 0;
+ if (baseline)
+ *baseline = -1;
+ return;
+ }
+
style = gtk_css_gadget_get_style (gadget);
get_box_margin (style, &margin);
get_box_border (style, &border);
diff --git a/gtk/gtkcssgadgetprivate.h b/gtk/gtkcssgadgetprivate.h
index 551064f..b23f5e7 100644
--- a/gtk/gtkcssgadgetprivate.h
+++ b/gtk/gtkcssgadgetprivate.h
@@ -78,6 +78,10 @@ GtkCssNode * gtk_css_gadget_get_node (GtkCssGadget
GtkCssStyle * gtk_css_gadget_get_style (GtkCssGadget *gadget);
GtkWidget * gtk_css_gadget_get_owner (GtkCssGadget *gadget);
+void gtk_css_gadget_set_visible (GtkCssGadget *gadget,
+ gboolean visible);
+gboolean gtk_css_gadget_get_visible (GtkCssGadget *gadget);
+
void gtk_css_gadget_add_class (GtkCssGadget *gadget,
const char *name);
void gtk_css_gadget_remove_class (GtkCssGadget *gadget,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]