summaryrefslogtreecommitdiff
path: root/src/ui/widget.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-06-25 16:26:53 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-06-25 16:26:53 +0300
commit5dbc85eaaa1bd0a0fc11dd76a75ece2efe763df5 (patch)
tree9721fb7aced603adb10b9bb3f3beb3f8d5fba973 /src/ui/widget.c
parent95c527db1484f7758a180c6de051d0182c3b2e81 (diff)
parentf99a9111170f2ff28383fd3172fdaf4b9a1ba069 (diff)
Merge branch 'work/v1.6' into work/serious-unicode
# Conflicts: # res/fonts/SmolEmoji-Regular.ttf
Diffstat (limited to 'src/ui/widget.c')
-rw-r--r--src/ui/widget.c110
1 files changed, 77 insertions, 33 deletions
diff --git a/src/ui/widget.c b/src/ui/widget.c
index 543b8bc9..992f115d 100644
--- a/src/ui/widget.c
+++ b/src/ui/widget.c
@@ -82,10 +82,10 @@ static void visualOffsetAnimation_Widget_(void *ptr) {
82 82
83void deinit_Widget(iWidget *d) { 83void deinit_Widget(iWidget *d) {
84 releaseChildren_Widget(d); 84 releaseChildren_Widget(d);
85//#if !defined (NDEBUG) 85#if 0 && !defined (NDEBUG)
86// printf("widget %p (%s) deleted (on top:%d)\n", d, cstr_String(&d->id), 86 printf("widget %p (%s) deleted (on top:%d)\n", d, cstr_String(&d->id),
87// d->flags & keepOnTop_WidgetFlag ? 1 : 0); 87 d->flags & keepOnTop_WidgetFlag ? 1 : 0);
88//#endif 88#endif
89 deinit_String(&d->id); 89 deinit_String(&d->id);
90 if (d->flags & keepOnTop_WidgetFlag) { 90 if (d->flags & keepOnTop_WidgetFlag) {
91 removeAll_PtrArray(onTop_Root(d->root), d); 91 removeAll_PtrArray(onTop_Root(d->root), d);
@@ -321,7 +321,6 @@ static iBool setWidth_Widget_(iWidget *d, int width) {
321 d->rect.size.x = width; 321 d->rect.size.x = width;
322 TRACE(d, "width has changed to %d", width); 322 TRACE(d, "width has changed to %d", width);
323 if (class_Widget(d)->sizeChanged) { 323 if (class_Widget(d)->sizeChanged) {
324 const int oldHeight = d->rect.size.y;
325 class_Widget(d)->sizeChanged(d); 324 class_Widget(d)->sizeChanged(d);
326 } 325 }
327 return iTrue; 326 return iTrue;
@@ -407,6 +406,11 @@ static void boundsOfChildren_Widget_(const iWidget *d, iRect *bounds_out) {
407 iRect childRect = child->rect; 406 iRect childRect = child->rect;
408 if (child->flags & ignoreForParentWidth_WidgetFlag) { 407 if (child->flags & ignoreForParentWidth_WidgetFlag) {
409 childRect.size.x = 0; 408 childRect.size.x = 0;
409 childRect.pos.x = bounds_out->pos.x;
410 }
411 if (child->flags & ignoreForParentHeight_WidgetFlag) {
412 childRect.size.y = 0;
413 childRect.pos.y = bounds_out->pos.y;
410 } 414 }
411 if (isEmpty_Rect(*bounds_out)) { 415 if (isEmpty_Rect(*bounds_out)) {
412 *bounds_out = childRect; 416 *bounds_out = childRect;
@@ -760,6 +764,27 @@ void arrange_Widget(iWidget *d) {
760 } 764 }
761} 765}
762 766
767iBool isBeingVisuallyOffsetByReference_Widget(const iWidget *d) {
768 return visualOffsetByReference_Widget(d) != 0;
769}
770
771int visualOffsetByReference_Widget(const iWidget *d) {
772 if (d->offsetRef && d->flags & refChildrenOffset_WidgetFlag) {
773 int offX = 0;
774 iConstForEach(ObjectList, i, children_Widget(d->offsetRef)) {
775 const iWidget *child = i.object;
776 if (child == d) continue;
777 if (child->flags & (visualOffset_WidgetFlag | dragged_WidgetFlag)) {
778// const float factor = width_Widget(d) / (float) size_Root(d->root).x;
779 const int invOff = width_Widget(d) - iRound(value_Anim(&child->visualOffset));
780 offX -= invOff / 4;
781 }
782 }
783 return offX;
784 }
785 return 0;
786}
787
763static void applyVisualOffset_Widget_(const iWidget *d, iInt2 *pos) { 788static void applyVisualOffset_Widget_(const iWidget *d, iInt2 *pos) {
764 if (d->flags & (visualOffset_WidgetFlag | dragged_WidgetFlag)) { 789 if (d->flags & (visualOffset_WidgetFlag | dragged_WidgetFlag)) {
765 const int off = iRound(value_Anim(&d->visualOffset)); 790 const int off = iRound(value_Anim(&d->visualOffset));
@@ -774,14 +799,7 @@ static void applyVisualOffset_Widget_(const iWidget *d, iInt2 *pos) {
774 pos->y -= value_Anim(d->animOffsetRef); 799 pos->y -= value_Anim(d->animOffsetRef);
775 } 800 }
776 if (d->flags & refChildrenOffset_WidgetFlag) { 801 if (d->flags & refChildrenOffset_WidgetFlag) {
777 iConstForEach(ObjectList, i, children_Widget(d->offsetRef)) { 802 pos->x += visualOffsetByReference_Widget(d);
778 const iWidget *child = i.object;
779 if (child == d) continue;
780 if (child->flags & (visualOffset_WidgetFlag | dragged_WidgetFlag)) {
781 const int invOff = size_Root(d->root).x - iRound(value_Anim(&child->visualOffset));
782 pos->x -= invOff / 4;
783 }
784 }
785 } 803 }
786} 804}
787 805
@@ -1057,10 +1075,38 @@ iBool processEvent_Widget(iWidget *d, const SDL_Event *ev) {
1057 isCommand_UserEvent(ev, "widget.overflow")) { 1075 isCommand_UserEvent(ev, "widget.overflow")) {
1058 scrollOverflow_Widget(d, 0); /* check bounds */ 1076 scrollOverflow_Widget(d, 0); /* check bounds */
1059 } 1077 }
1060 if (ev->user.code == command_UserEventCode && d->commandHandler && 1078 if (ev->user.code == command_UserEventCode) {
1061 d->commandHandler(d, ev->user.data1)) { 1079 const char *cmd = command_UserEvent(ev);
1062 iAssert(get_Root() == d->root); 1080 if (d->flags & (leftEdgeDraggable_WidgetFlag | rightEdgeDraggable_WidgetFlag) &&
1063 return iTrue; 1081 isVisible_Widget(d) && ~d->flags & disabled_WidgetFlag &&
1082 equal_Command(cmd, "edgeswipe.moved")) {
1083 /* Check the side. */
1084 const int side = argLabel_Command(cmd, "side");
1085 if ((side == 1 && d->flags & leftEdgeDraggable_WidgetFlag) ||
1086 (side == 2 && d->flags & rightEdgeDraggable_WidgetFlag)) {
1087 if (~d->flags & dragged_WidgetFlag) {
1088 setFlags_Widget(d, dragged_WidgetFlag, iTrue);
1089 }
1090 setVisualOffset_Widget(d, arg_Command(command_UserEvent(ev)) *
1091 width_Widget(d) / size_Root(d->root).x,
1092 10, 0);
1093 return iTrue;
1094 }
1095 }
1096 if (d->flags & dragged_WidgetFlag && equal_Command(cmd, "edgeswipe.ended")) {
1097 if (argLabel_Command(cmd, "abort")) {
1098 setVisualOffset_Widget(d, 0, 200, easeOut_AnimFlag);
1099 }
1100 else {
1101 postCommand_Widget(
1102 d, argLabel_Command(cmd, "side") == 1 ? "swipe.back" : "swipe.forward");
1103 }
1104 setFlags_Widget(d, dragged_WidgetFlag, iFalse);
1105 }
1106 if (d->commandHandler && d->commandHandler(d, ev->user.data1)) {
1107 iAssert(get_Root() == d->root);
1108 return iTrue;
1109 }
1064 } 1110 }
1065 break; 1111 break;
1066 } 1112 }
@@ -1091,6 +1137,17 @@ iBool processEvent_Widget(iWidget *d, const SDL_Event *ev) {
1091 return iFalse; 1137 return iFalse;
1092} 1138}
1093 1139
1140int backgroundFadeColor_Widget(void) {
1141 switch (colorTheme_App()) {
1142 case light_ColorTheme:
1143 return gray25_ColorId;
1144 case pureWhite_ColorTheme:
1145 return gray50_ColorId;
1146 default:
1147 return black_ColorId;
1148 }
1149}
1150
1094void drawBackground_Widget(const iWidget *d) { 1151void drawBackground_Widget(const iWidget *d) {
1095 if (d->flags & noBackground_WidgetFlag) { 1152 if (d->flags & noBackground_WidgetFlag) {
1096 return; 1153 return;
@@ -1107,14 +1164,13 @@ void drawBackground_Widget(const iWidget *d) {
1107 shadowBorder = iFalse; 1164 shadowBorder = iFalse;
1108 } 1165 }
1109 } 1166 }
1110 if (shadowBorder) { 1167 if (shadowBorder && ~d->flags & noShadowBorder_WidgetFlag) {
1111 iPaint p; 1168 iPaint p;
1112 init_Paint(&p); 1169 init_Paint(&p);
1113 drawSoftShadow_Paint(&p, bounds_Widget(d), 12 * gap_UI, black_ColorId, 30); 1170 drawSoftShadow_Paint(&p, bounds_Widget(d), 12 * gap_UI, black_ColorId, 30);
1114 } 1171 }
1115 const iBool isFaded = fadeBackground && 1172 const iBool isFaded = fadeBackground &&
1116 ~d->flags & noFadeBackground_WidgetFlag;/* && 1173 ~d->flags & noFadeBackground_WidgetFlag;
1117 ~d->flags & destroyPending_WidgetFlag;*/
1118 if (isFaded) { 1174 if (isFaded) {
1119 iPaint p; 1175 iPaint p;
1120 init_Paint(&p); 1176 init_Paint(&p);
@@ -1125,19 +1181,7 @@ void drawBackground_Widget(const iWidget *d) {
1125 p.alpha *= (area > 0 ? visibleArea / area : 0.0f); 1181 p.alpha *= (area > 0 ? visibleArea / area : 0.0f);
1126 } 1182 }
1127 SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_BLEND); 1183 SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_BLEND);
1128 int fadeColor; 1184 fillRect_Paint(&p, rect_Root(d->root), backgroundFadeColor_Widget());
1129 switch (colorTheme_App()) {
1130 default:
1131 fadeColor = black_ColorId;
1132 break;
1133 case light_ColorTheme:
1134 fadeColor = gray25_ColorId;
1135 break;
1136 case pureWhite_ColorTheme:
1137 fadeColor = gray50_ColorId;
1138 break;
1139 }
1140 fillRect_Paint(&p, rect_Root(d->root), fadeColor);
1141 SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_NONE); 1185 SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_NONE);
1142 } 1186 }
1143 if (d->bgColor >= 0 || d->frameColor >= 0) { 1187 if (d->bgColor >= 0 || d->frameColor >= 0) {