diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-03-21 14:29:51 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-03-21 14:29:51 +0200 |
commit | 2f9e203058df442921fc0151ddc5fe9b68b87935 (patch) | |
tree | 5441025fcf4e974e82128f65376650bec7a941bb /src/ui/widget.c | |
parent | b93ba1bfb860c2a4b5bf46c77f3f0d11b4eb1282 (diff) |
iOS: Save to Files; hide toolbar on scroll
There is no downloads directory on mobile. Instead, the downloaded file is temporarily cached and given to the iOS document picker to export.
Added an option to hide the bottom toolbar while scrolling down.
Diffstat (limited to 'src/ui/widget.c')
-rw-r--r-- | src/ui/widget.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/ui/widget.c b/src/ui/widget.c index 81853c2a..23891999 100644 --- a/src/ui/widget.c +++ b/src/ui/widget.c | |||
@@ -223,6 +223,9 @@ void setVisualOffset_Widget(iWidget *d, int value, uint32_t span, int animFlags) | |||
223 | setFlags_Widget(d, visualOffset_WidgetFlag, iTrue); | 223 | setFlags_Widget(d, visualOffset_WidgetFlag, iTrue); |
224 | if (span == 0) { | 224 | if (span == 0) { |
225 | init_Anim(&d->visualOffset, value); | 225 | init_Anim(&d->visualOffset, value); |
226 | if (value == 0) { | ||
227 | setFlags_Widget(d, visualOffset_WidgetFlag, iFalse); /* offset is being reset */ | ||
228 | } | ||
226 | } | 229 | } |
227 | else { | 230 | else { |
228 | setValue_Anim(&d->visualOffset, value, span); | 231 | setValue_Anim(&d->visualOffset, value, span); |
@@ -346,6 +349,9 @@ void arrange_Widget(iWidget *d) { | |||
346 | else if (d->flags & moveToParentRightEdge_WidgetFlag) { | 349 | else if (d->flags & moveToParentRightEdge_WidgetFlag) { |
347 | d->rect.pos.x = width_Rect(innerRect_Widget_(d->parent)) - width_Rect(d->rect); | 350 | d->rect.pos.x = width_Rect(innerRect_Widget_(d->parent)) - width_Rect(d->rect); |
348 | } | 351 | } |
352 | else if (d->flags & moveToParentBottomEdge_WidgetFlag) { | ||
353 | d->rect.pos.y = height_Rect(innerRect_Widget_(d->parent)) - height_Rect(d->rect); | ||
354 | } | ||
349 | else if (d->flags & centerHorizontal_WidgetFlag) { | 355 | else if (d->flags & centerHorizontal_WidgetFlag) { |
350 | centerHorizontal_Widget_(d); | 356 | centerHorizontal_Widget_(d); |
351 | } | 357 | } |
@@ -455,8 +461,12 @@ void arrange_Widget(iWidget *d) { | |||
455 | iForEach(ObjectList, i, d->children) { | 461 | iForEach(ObjectList, i, d->children) { |
456 | iWidget *child = as_Widget(i.object); | 462 | iWidget *child = as_Widget(i.object); |
457 | if (isArranged_Widget_(child) && ~child->flags & parentCannotResize_WidgetFlag) { | 463 | if (isArranged_Widget_(child) && ~child->flags & parentCannotResize_WidgetFlag) { |
458 | if (dirs.x) setWidth_Widget_(child, child->flags & unpadded_WidgetFlag ? unpaddedChildSize.x : childSize.x); | 464 | if (dirs.x) { |
459 | if (dirs.y) setHeight_Widget_(child, child->flags & unpadded_WidgetFlag ? unpaddedChildSize.y : childSize.y); | 465 | setWidth_Widget_(child, child->flags & unpadded_WidgetFlag ? unpaddedChildSize.x : childSize.x); |
466 | } | ||
467 | if (dirs.y && ~child->flags & parentCannotResizeHeight_WidgetFlag) { | ||
468 | setHeight_Widget_(child, child->flags & unpadded_WidgetFlag ? unpaddedChildSize.y : childSize.y); | ||
469 | } | ||
460 | } | 470 | } |
461 | } | 471 | } |
462 | } | 472 | } |
@@ -493,7 +503,8 @@ void arrange_Widget(iWidget *d) { | |||
493 | pos.y += child->rect.size.y; | 503 | pos.y += child->rect.size.y; |
494 | } | 504 | } |
495 | } | 505 | } |
496 | else if ((d->flags & resizeChildren_WidgetFlag) == resizeChildren_WidgetFlag) { | 506 | else if ((d->flags & resizeChildren_WidgetFlag) == resizeChildren_WidgetFlag && |
507 | ~child->flags & moveToParentBottomEdge_WidgetFlag) { | ||
497 | child->rect.pos = pos; | 508 | child->rect.pos = pos; |
498 | } | 509 | } |
499 | else if (d->flags & resizeWidthOfChildren_WidgetFlag) { | 510 | else if (d->flags & resizeWidthOfChildren_WidgetFlag) { |
@@ -522,7 +533,9 @@ void arrange_Widget(iWidget *d) { | |||
522 | iForEach(ObjectList, j, d->children) { | 533 | iForEach(ObjectList, j, d->children) { |
523 | iWidget *child = as_Widget(j.object); | 534 | iWidget *child = as_Widget(j.object); |
524 | if (child->flags & | 535 | if (child->flags & |
525 | (resizeToParentWidth_WidgetFlag | moveToParentLeftEdge_WidgetFlag | | 536 | (resizeToParentWidth_WidgetFlag | |
537 | moveToParentLeftEdge_WidgetFlag | | ||
538 | moveToParentBottomEdge_WidgetFlag | | ||
526 | moveToParentRightEdge_WidgetFlag)) { | 539 | moveToParentRightEdge_WidgetFlag)) { |
527 | arrange_Widget(child); | 540 | arrange_Widget(child); |
528 | } | 541 | } |
@@ -542,6 +555,10 @@ void arrange_Widget(iWidget *d) { | |||
542 | } | 555 | } |
543 | } | 556 | } |
544 | } | 557 | } |
558 | // if (d->flags & moveToParentBottomEdge_WidgetFlag) { | ||
559 | // /* TODO: Fix this: not DRY. See beginning of method. */ | ||
560 | // d->rect.pos.y = height_Rect(innerRect_Widget_(d->parent)) - height_Rect(d->rect); | ||
561 | // } | ||
545 | if (d->flags & centerHorizontal_WidgetFlag) { | 562 | if (d->flags & centerHorizontal_WidgetFlag) { |
546 | centerHorizontal_Widget_(d); | 563 | centerHorizontal_Widget_(d); |
547 | } | 564 | } |
@@ -574,6 +591,14 @@ iRect bounds_Widget(const iWidget *d) { | |||
574 | return bounds; | 591 | return bounds; |
575 | } | 592 | } |
576 | 593 | ||
594 | iRect boundsWithoutVisualOffset_Widget(const iWidget *d) { | ||
595 | iRect bounds = d->rect; | ||
596 | for (const iWidget *w = d->parent; w; w = w->parent) { | ||
597 | addv_I2(&bounds.pos, w->rect.pos); | ||
598 | } | ||
599 | return bounds; | ||
600 | } | ||
601 | |||
577 | iInt2 localCoord_Widget(const iWidget *d, iInt2 coord) { | 602 | iInt2 localCoord_Widget(const iWidget *d, iInt2 coord) { |
578 | for (const iWidget *w = d; w; w = w->parent) { | 603 | for (const iWidget *w = d; w; w = w->parent) { |
579 | subv_I2(&coord, w->rect.pos); | 604 | subv_I2(&coord, w->rect.pos); |