[libhandy/wip/haecker-felix/flap-widget: 111/138] Implement allocate_flap() func. Includes other fixes.




commit 30e9f2a5cd3bda5eca77684f9f237f5cb09dabf1
Author: Felix Häcker <haeckerfelix gnome org>
Date:   Mon Jul 27 16:17:58 2020 +0200

    Implement allocate_flap() func. Includes other fixes.

 src/hdy-flap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 52 insertions(+), 8 deletions(-)
---
diff --git a/src/hdy-flap.c b/src/hdy-flap.c
index 9bdd27b9..7828d1bd 100644
--- a/src/hdy-flap.c
+++ b/src/hdy-flap.c
@@ -23,7 +23,7 @@ struct _HdyFlap
 {
   GtkBin parent_instance;
 
-  GtkWidget* flap;
+  GtkWidget *flap;
   HdyFlapMode flap_mode;
   GtkPackType flap_position;
   gboolean reveal_flap;
@@ -68,7 +68,6 @@ static GParamSpec *props[LAST_PROP];
 static void
 set_orientation (HdyFlap        *self,
                  GtkOrientation  orientation)
-
 {
   if (self->orientation == orientation)
     return;
@@ -177,15 +176,28 @@ adjust_for_overlay (HdyFlap *self,
   return (gint) round (value * progress);
 }
 
+static GtkPackType
+adjust_for_text_direction (HdyFlap     *self,
+                           GtkPackType  pack_type)
+{
+  if (gtk_widget_get_direction ((GtkWidget*) self) == GTK_TEXT_DIR_RTL) {
+    if (pack_type == GTK_PACK_START) {
+      return GTK_PACK_END;
+    } else {
+      return GTK_PACK_START;
+    }
+  }
+  return pack_type;
+}
+
 static gint
 get_flap_size (HdyFlap        *self,
                GtkAllocation  *widget_alloc,
                GtkOrientation  widget_orientation)
 {
-  GtkWidget* flap;
   GtkRequisition flap_min_size, flap_nat_size;
 
-  if (flap == NULL)
+  if (self->flap == NULL)
     return 0;
 
   flap = hdy_flap_get_flap (self);
@@ -208,22 +220,54 @@ get_content_size (HdyFlap        *self,
                   GtkOrientation  widget_orientation)
 {
   if (widget_orientation == GTK_ORIENTATION_HORIZONTAL) {
-    int offset = 0;
+    gint offset = 0;
     if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
-      offset = adjust_for_overlay(self, get_flap_size(self, widget_alloc, GTK_ORIENTATION_HORIZONTAL));
+      offset = adjust_for_overlay (self, get_flap_size (self, widget_alloc, GTK_ORIENTATION_HORIZONTAL));
     return widget_alloc->width - offset;
   } else {
     if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
       return widget_alloc->height;
-    return widget_alloc->height - adjust_for_overlay(self, get_flap_size(self, widget_alloc, 
GTK_ORIENTATION_HORIZONTAL));
+    return widget_alloc->height - adjust_for_overlay (self, get_flap_size (self, widget_alloc, 
GTK_ORIENTATION_HORIZONTAL));
   }
 }
 
 static void
 allocate_flap (HdyFlap       *self,
-               GtkAllocation *widget_allocation)
+               GtkAllocation *widget_alloc)
 {
+  gint flap_x = 0, flap_y = 0;
+
+  if (self->orientation == GTK_ORIENTATION_HORIZONTAL) {
+      if (self->flap_position == adjust_for_text_direction (self, GTK_PACK_START)) {
+          flap_x = widget_alloc->x - (gint) round (get_flap_size(self, widget_alloc, 
GTK_ORIENTATION_HORIZONTAL) * (1 - self->reveal_progress));
+          flap_y = widget_alloc->y;
+      }
+      if (self->flap_position == adjust_for_text_direction (self, GTK_PACK_END)) {
+          flap_x = widget_alloc->width - (gint) round(get_flap_size(self, widget_alloc, 
GTK_ORIENTATION_HORIZONTAL) * self->reveal_progress);
+          flap_y = widget_alloc->y;
+      }
+  }
+
+  if (self->orientation == GTK_ORIENTATION_VERTICAL) {
+      if (self->flap_position == GTK_PACK_START) {
+          flap_x = widget_alloc->x;
+          flap_y = widget_alloc->y - (gint) round (get_flap_size (self, widget_alloc, 
GTK_ORIENTATION_VERTICAL) * (1 - self->reveal_progress));
+      }
+      if (self->flap_position == GTK_PACK_END){
+          flap_x = widget_alloc->x;
+          flap_y = widget_alloc->height - (gint) round (get_flap_size (self, widget_alloc, 
GTK_ORIENTATION_VERTICAL) * self->reveal_progress);
+      }
+  }
 
+  gtk_widget_set_child_visible (self->flap, self->reveal_progress > 0);
+  if (self->reveal_progress > 0) {
+    GtkAllocation alloc;
+    alloc.x = flap_x;
+    alloc.y = flap_y;
+    alloc.width = get_flap_size (self, widget_alloc, GTK_ORIENTATION_HORIZONTAL);
+    alloc.height = get_flap_size (self, widget_alloc, GTK_ORIENTATION_VERTICAL);
+    gtk_widget_size_allocate (self->flap, &alloc);
+  }
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]