[libhandy/wip/haecker-felix/flap-widget] Clipping



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]