[libhandy/wip/haecker-felix/flap-widget] Clipping
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libhandy/wip/haecker-felix/flap-widget] Clipping
- Date: Tue, 24 Nov 2020 07:37:29 +0000 (UTC)
commit 9da27e835b0450ae12519c7289c2aaf3872b453f
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Tue Nov 24 12:36:13 2020 +0500
Clipping
What a bad API, wow. But it works.
src/hdy-flap.c | 117 ++++++++++++++++++++++++++++++++++++++-------------------
src/hdy-flap.h | 1 +
2 files changed, 79 insertions(+), 39 deletions(-)
---
diff --git a/src/hdy-flap.c b/src/hdy-flap.c
index 817f7a19..de9252e6 100644
--- a/src/hdy-flap.c
+++ b/src/hdy-flap.c
@@ -38,6 +38,7 @@
* @HDY_FLAP_TRANSITION_TYPE_OVER: No transition
* @HDY_FLAP_TRANSITION_TYPE_UNDER: A cross-fade
* @HDY_FLAP_TRANSITION_TYPE_SLIDE: TBD
+ * @HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT: a
*
* These enumeration values describe the possible transitions between children
* in a #HdyFlap widget.
@@ -458,12 +459,30 @@ transition_is_content_above_flap (HdyFlap *self)
{
switch (self->transition_type) {
case HDY_FLAP_TRANSITION_TYPE_OVER:
+ case HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT:
return FALSE;
+ case HDY_FLAP_TRANSITION_TYPE_UNDER:
case HDY_FLAP_TRANSITION_TYPE_SLIDE:
+ return TRUE;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static gboolean
+transition_should_clip (HdyFlap *self)
+{
+ switch (self->transition_type) {
+ case HDY_FLAP_TRANSITION_TYPE_OVER:
case HDY_FLAP_TRANSITION_TYPE_UNDER:
return TRUE;
+ case HDY_FLAP_TRANSITION_TYPE_SLIDE:
+ case HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT:
+ return FALSE;
+
default:
g_assert_not_reached ();
}
@@ -474,10 +493,11 @@ transition_get_content_motion_factor (HdyFlap *self)
{
switch (self->transition_type) {
case HDY_FLAP_TRANSITION_TYPE_OVER:
+ case HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT:
return 0;
- case HDY_FLAP_TRANSITION_TYPE_SLIDE:
case HDY_FLAP_TRANSITION_TYPE_UNDER:
+ case HDY_FLAP_TRANSITION_TYPE_SLIDE:
return 1;
default:
@@ -490,6 +510,7 @@ transition_get_flap_motion_factor (HdyFlap *self)
{
switch (self->transition_type) {
case HDY_FLAP_TRANSITION_TYPE_OVER:
+ case HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT:
case HDY_FLAP_TRANSITION_TYPE_SLIDE:
return 1;
@@ -973,42 +994,11 @@ hdy_flap_draw (GtkWidget *widget,
HdyFlap *self = HDY_FLAP (widget);
gint width, height;
gint shadow_x = 0, shadow_y = 0;
- gdouble progress;
+ gdouble shadow_progress;
GtkPanDirection shadow_direction;
gboolean content_above_flap = transition_is_content_above_flap (self);
GtkAllocation *shadow_alloc;
-
- if (!content_above_flap) {
- if (self->content.widget)
- gtk_container_propagate_draw (GTK_CONTAINER (self),
- self->content.widget,
- cr);
-
- if (self->separator.widget)
- gtk_container_propagate_draw (GTK_CONTAINER (self),
- self->separator.widget,
- cr);
- }
-
- if (self->flap.widget)
- gtk_container_propagate_draw (GTK_CONTAINER (self),
- self->flap.widget,
- cr);
-
- if (content_above_flap) {
- if (self->separator.widget)
- gtk_container_propagate_draw (GTK_CONTAINER (self),
- self->separator.widget,
- cr);
-
- if (self->content.widget)
- gtk_container_propagate_draw (GTK_CONTAINER (self),
- self->content.widget,
- cr);
- }
-
- if (!self->flap.widget)
- return GDK_EVENT_PROPAGATE;
+ gboolean should_clip;
shadow_alloc = content_above_flap ? &self->content.allocation : &self->flap.allocation;
@@ -1035,26 +1025,75 @@ hdy_flap_draw (GtkWidget *widget,
switch (self->transition_type) {
case HDY_FLAP_TRANSITION_TYPE_OVER:
- progress = 1 - MIN (self->reveal_progress, self->fold_progress);
+ case HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT:
+ shadow_progress = 1 - MIN (self->reveal_progress, self->fold_progress);
break;
case HDY_FLAP_TRANSITION_TYPE_UNDER:
- progress = self->reveal_progress;
+ shadow_progress = self->reveal_progress;
break;
case HDY_FLAP_TRANSITION_TYPE_SLIDE:
- progress = 1;
+ shadow_progress = 1;
break;
default:
g_assert_not_reached ();
}
- if (progress < 1 && gtk_widget_get_mapped (self->flap.widget)) {
+ should_clip = transition_should_clip (self) &&
+ shadow_progress < 1 &&
+ self->reveal_progress > 0;
+
+ if (should_clip) {
+ cairo_save (cr);
+ cairo_rectangle (cr, shadow_x, shadow_y, width, height);
+ cairo_clip (cr);
+ }
+
+ if (!content_above_flap) {
+ if (self->content.widget)
+ gtk_container_propagate_draw (GTK_CONTAINER (self),
+ self->content.widget,
+ cr);
+
+ if (self->separator.widget)
+ gtk_container_propagate_draw (GTK_CONTAINER (self),
+ self->separator.widget,
+ cr);
+
+ if (should_clip)
+ cairo_restore (cr);
+ }
+
+ if (self->flap.widget)
+ gtk_container_propagate_draw (GTK_CONTAINER (self),
+ self->flap.widget,
+ cr);
+
+ if (content_above_flap) {
+ if (self->separator.widget)
+ gtk_container_propagate_draw (GTK_CONTAINER (self),
+ self->separator.widget,
+ cr);
+
+ if (should_clip)
+ cairo_restore (cr);
+
+ if (self->content.widget)
+ gtk_container_propagate_draw (GTK_CONTAINER (self),
+ self->content.widget,
+ cr);
+ }
+
+ if (!self->flap.widget)
+ return GDK_EVENT_PROPAGATE;
+
+ if (shadow_progress < 1 && gtk_widget_get_mapped (self->flap.widget)) {
cairo_save (cr);
cairo_translate (cr, shadow_x, shadow_y);
hdy_shadow_helper_draw_shadow (self->shadow_helper, cr, width, height,
- progress, shadow_direction);
+ shadow_progress, shadow_direction);
cairo_restore (cr);
}
diff --git a/src/hdy-flap.h b/src/hdy-flap.h
index 59e880d0..e5d1ff29 100644
--- a/src/hdy-flap.h
+++ b/src/hdy-flap.h
@@ -32,6 +32,7 @@ typedef enum {
HDY_FLAP_TRANSITION_TYPE_OVER,
HDY_FLAP_TRANSITION_TYPE_UNDER,
HDY_FLAP_TRANSITION_TYPE_SLIDE,
+ HDY_FLAP_TRANSITION_TYPE_OVER_TRANSPARENT,
} HdyFlapTransitionType;
HDY_AVAILABLE_IN_1_1
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]