diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-06-25 16:26:53 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-06-25 16:26:53 +0300 |
commit | 5dbc85eaaa1bd0a0fc11dd76a75ece2efe763df5 (patch) | |
tree | 9721fb7aced603adb10b9bb3f3beb3f8d5fba973 /src/ui/widget.c | |
parent | 95c527db1484f7758a180c6de051d0182c3b2e81 (diff) | |
parent | f99a9111170f2ff28383fd3172fdaf4b9a1ba069 (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.c | 110 |
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 | ||
83 | void deinit_Widget(iWidget *d) { | 83 | void 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 | ||
767 | iBool isBeingVisuallyOffsetByReference_Widget(const iWidget *d) { | ||
768 | return visualOffsetByReference_Widget(d) != 0; | ||
769 | } | ||
770 | |||
771 | int 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 | |||
763 | static void applyVisualOffset_Widget_(const iWidget *d, iInt2 *pos) { | 788 | static 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 | ||
1140 | int 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 | |||
1094 | void drawBackground_Widget(const iWidget *d) { | 1151 | void 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) { |