[libhandy/wip/haecker-felix/flap-widget: 71/98] Implement allocate_flap() func. Includes other fixes.
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libhandy/wip/haecker-felix/flap-widget: 71/98] Implement allocate_flap() func. Includes other fixes.
- Date: Mon, 3 Aug 2020 16:27:55 +0000 (UTC)
commit c677cc9807129d9c87ece523c6f80da1455e789d
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]