summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-02-22 21:35:10 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-02-22 21:35:10 +0200
commit90443011c98a6dc8340d2c84f1e538c7a98327f2 (patch)
tree94e1522758d7b83be08144ae4bac54853fd3a277
parent1174f2e9318a58602baccdfb3e2465645d263601 (diff)
Dialog buttons on the right
Follow typical GUI conventions by placing dialog buttons on the right edge. This leaves space for additional actions on the left.
-rw-r--r--src/ui/documentwidget.c46
-rw-r--r--src/ui/sidebarwidget.c29
-rw-r--r--src/ui/util.c143
-rw-r--r--src/ui/util.h2
-rw-r--r--src/ui/widget.c6
-rw-r--r--src/ui/widget.h1
6 files changed, 174 insertions, 53 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index 7e7ac79f..69461901 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -1645,10 +1645,8 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
1645 return iFalse; 1645 return iFalse;
1646 } 1646 }
1647 else if (equal_Command(cmd, "document.info") && d == document_App()) { 1647 else if (equal_Command(cmd, "document.info") && d == document_App()) {
1648 const char *unchecked = red_ColorEscape "\u2610"; 1648 const char *unchecked = red_ColorEscape "\u2610";
1649 const char *checked = green_ColorEscape "\u2611"; 1649 const char *checked = green_ColorEscape "\u2611";
1650 const char *actionLabels[] = { uiTextCaution_ColorEscape "Trust", "Copy Fingerprint", "Dismiss" };
1651 const char *actionCmds[] = { "server.trustcert", "server.copycert", "message.ok" };
1652 const iBool haveFingerprint = (d->certFlags & haveFingerprint_GmCertFlag) != 0; 1650 const iBool haveFingerprint = (d->certFlags & haveFingerprint_GmCertFlag) != 0;
1653 const iBool canTrust = 1651 const iBool canTrust =
1654 (d->certFlags == (available_GmCertFlag | haveFingerprint_GmCertFlag | 1652 (d->certFlags == (available_GmCertFlag | haveFingerprint_GmCertFlag |
@@ -1692,11 +1690,23 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
1692 uiText_ColorEscape, 1690 uiText_ColorEscape,
1693 d->certFlags & trusted_GmCertFlag ? "Trusted" : "Not trusted"); 1691 d->certFlags & trusted_GmCertFlag ? "Trusted" : "Not trusted");
1694 setFocus_Widget(NULL); 1692 setFocus_Widget(NULL);
1693 iArray *items = new_Array(sizeof(iMenuItem));
1694 if (canTrust) {
1695 pushBack_Array(
1696 items, &(iMenuItem){ uiTextCaution_ColorEscape "Trust", 0, 0, "server.trustcert" });
1697 }
1698 if (haveFingerprint) {
1699 pushBack_Array(items, &(iMenuItem){ "Copy Fingerprint", 0, 0, "server.copycert" });
1700 }
1701 if (!isEmpty_Array(items)) {
1702 pushBack_Array(items, &(iMenuItem){ "---", 0, 0, 0 });
1703 }
1704 pushBack_Array(items, &(iMenuItem){ "Dismiss", 0, 0, "message.ok" });
1695 iWidget *dlg = makeQuestion_Widget(uiHeading_ColorEscape "PAGE INFORMATION", 1705 iWidget *dlg = makeQuestion_Widget(uiHeading_ColorEscape "PAGE INFORMATION",
1696 cstr_String(msg), 1706 cstr_String(msg),
1697 actionLabels + (canTrust ? 0 : haveFingerprint ? 1 : 2), 1707 data_Array(items),
1698 actionCmds + (canTrust ? 0 : haveFingerprint ? 1 : 2), 1708 size_Array(items));
1699 canTrust ? 3 : haveFingerprint ? 2 : 1); 1709 delete_Array(items);
1700 /* Enforce a minimum size. */ 1710 /* Enforce a minimum size. */
1701 iWidget *sizer = new_Widget(); 1711 iWidget *sizer = new_Widget();
1702 setSize_Widget(sizer, init_I2(gap_UI * 90, 1)); 1712 setSize_Widget(sizer, init_I2(gap_UI * 90, 1));
@@ -2072,11 +2082,18 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
2072 makeQuestion_Widget( 2082 makeQuestion_Widget(
2073 uiHeading_ColorEscape "IMPORT BOOKMARKS", 2083 uiHeading_ColorEscape "IMPORT BOOKMARKS",
2074 format_CStr("Found %d new link%s on the page.", size_PtrArray(links), plural), 2084 format_CStr("Found %d new link%s on the page.", size_PtrArray(links), plural),
2075 (const char *[]){ "Cancel", 2085 (iMenuItem[]){ { "Cancel", 0, 0, NULL },
2076 format_CStr(uiTextAction_ColorEscape "Add %d Bookmark%s", 2086 { format_CStr(uiTextAction_ColorEscape "Add %d Bookmark%s",
2077 size_PtrArray(links), plural) }, 2087 size_PtrArray(links),
2078 (const char *[]){ "cancel", "bookmark.links" }, 2088 plural), 0, 0, "bookmark.links" } },
2079 2); 2089 2);
2090
2091 // (const char *[]){ "Cancel",
2092 // format_CStr(uiTextAction_ColorEscape "Add %d
2093 // Bookmark%s",
2094 // size_PtrArray(links), plural) },
2095 // (const char *[]){ "cancel", "bookmark.links" },
2096 // 2);
2080 } 2097 }
2081 else { 2098 else {
2082 iConstForEach(PtrArray, j, links) { 2099 iConstForEach(PtrArray, j, links) {
@@ -2669,9 +2686,10 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e
2669 "Open this link in the default browser?\n" uiTextAction_ColorEscape 2686 "Open this link in the default browser?\n" uiTextAction_ColorEscape
2670 "%s", 2687 "%s",
2671 cstr_String(url)), 2688 cstr_String(url)),
2672 (const char *[]){ "Cancel", uiTextCaution_ColorEscape "Open Link" }, 2689 (iMenuItem[]){
2673 (const char *[]){ 2690 { "Cancel", 0, 0, NULL },
2674 "cancel", format_CStr("!open default:1 url:%s", cstr_String(url)) }, 2691 { uiTextCaution_ColorEscape "Open Link",
2692 0, 0, format_CStr("!open default:1 url:%s", cstr_String(url)) } },
2675 2); 2693 2);
2676 } 2694 }
2677 } 2695 }
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 5441381a..24ace92a 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -937,11 +937,12 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
937 uiTextCaution_ColorEscape "UNSUBSCRIBE", 937 uiTextCaution_ColorEscape "UNSUBSCRIBE",
938 format_CStr("Really unsubscribe from feed\n\"%s\"?", 938 format_CStr("Really unsubscribe from feed\n\"%s\"?",
939 cstr_String(&feedBookmark->title)), 939 cstr_String(&feedBookmark->title)),
940 (const char *[]){ "Cancel", 940 (iMenuItem[]){
941 uiTextCaution_ColorEscape "Unsubscribe" }, 941 { "Cancel", 0, 0, NULL },
942 (const char *[]){ 942 { uiTextCaution_ColorEscape "Unsubscribe",
943 "cancel", 943 0,
944 format_CStr("!feed.entry.unsubscribe arg:1 ptr:%p", d) }, 944 0,
945 format_CStr("!feed.entry.unsubscribe arg:1 ptr:%p", d) } },
945 2); 946 2);
946 } 947 }
947 return iTrue; 948 return iTrue;
@@ -1026,9 +1027,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
1026 "%s\n" uiText_ColorEscape 1027 "%s\n" uiText_ColorEscape
1027 "including its certificate and private key files?", 1028 "including its certificate and private key files?",
1028 cstr_String(&item->label)), 1029 cstr_String(&item->label)),
1029 (const char *[]){ "Cancel", 1030 (iMenuItem[]){ { "Cancel", 0, 0, NULL },
1030 uiTextCaution_ColorEscape "Delete Identity and Files" }, 1031 { uiTextCaution_ColorEscape "Delete Identity and Files",
1031 (const char *[]){ "cancel", format_CStr("!ident.delete confirm:0 ptr:%p", d) }, 1032 0, 0, format_CStr("!ident.delete confirm:0 ptr:%p", d) } },
1032 2); 1033 2);
1033 return iTrue; 1034 return iTrue;
1034 } 1035 }
@@ -1063,12 +1064,12 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
1063 } 1064 }
1064 else if (equal_Command(cmd, "history.clear")) { 1065 else if (equal_Command(cmd, "history.clear")) {
1065 if (argLabel_Command(cmd, "confirm")) { 1066 if (argLabel_Command(cmd, "confirm")) {
1066 makeQuestion_Widget( 1067 makeQuestion_Widget(uiTextCaution_ColorEscape "CLEAR HISTORY",
1067 uiTextCaution_ColorEscape "CLEAR HISTORY", 1068 "Do you really want to erase the history of all visited pages?",
1068 "Do you really want to erase the history of all visited pages?", 1069 (iMenuItem[]){ { "Cancel", 0, 0, NULL },
1069 (const char *[]){ "Cancel", uiTextCaution_ColorEscape "Clear History" }, 1070 { uiTextCaution_ColorEscape "Clear History",
1070 (const char *[]){ "cancel", "history.clear confirm:0" }, 1071 0, 0, "history.clear confirm:0" } },
1071 2); 1072 2);
1072 } 1073 }
1073 else { 1074 else {
1074 clear_Visited(visited_App()); 1075 clear_Visited(visited_App());
diff --git a/src/ui/util.c b/src/ui/util.c
index 7da68fa5..c2ac41fa 100644
--- a/src/ui/util.c
+++ b/src/ui/util.c
@@ -823,7 +823,8 @@ iWidget *makeSheet_Widget(const char *id) {
823 setFrameColor_Widget(sheet, uiSeparator_ColorId); 823 setFrameColor_Widget(sheet, uiSeparator_ColorId);
824 setBackgroundColor_Widget(sheet, uiBackground_ColorId); 824 setBackgroundColor_Widget(sheet, uiBackground_ColorId);
825 setFlags_Widget(sheet, 825 setFlags_Widget(sheet,
826 focusRoot_WidgetFlag | mouseModal_WidgetFlag | keepOnTop_WidgetFlag | 826 parentCannotResize_WidgetFlag |
827 focusRoot_WidgetFlag | mouseModal_WidgetFlag | keepOnTop_WidgetFlag |
827 arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag | 828 arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag |
828 centerHorizontal_WidgetFlag | overflowScrollable_WidgetFlag, 829 centerHorizontal_WidgetFlag | overflowScrollable_WidgetFlag,
829 iTrue); 830 iTrue);
@@ -831,7 +832,7 @@ iWidget *makeSheet_Widget(const char *id) {
831} 832}
832 833
833void centerSheet_Widget(iWidget *sheet) { 834void centerSheet_Widget(iWidget *sheet) {
834 arrange_Widget(sheet->parent); 835 arrange_Widget(sheet);
835 postRefresh_App(); 836 postRefresh_App();
836} 837}
837 838
@@ -919,11 +920,62 @@ iBool valueInputHandler_(iWidget *dlg, const char *cmd) {
919 return iFalse; 920 return iFalse;
920} 921}
921 922
923static iWidget *makeDialogButtons_(const iMenuItem *actions, size_t numActions) {
924 iWidget *div = new_Widget();
925 setFlags_Widget(div,
926 arrangeHorizontal_WidgetFlag | arrangeHeight_WidgetFlag |
927 resizeToParentWidth_WidgetFlag |
928 resizeWidthOfChildren_WidgetFlag,
929 iTrue);
930 /* If there is no separator, align everything to the right. */
931 iBool haveSep = iFalse;
932 for (size_t i = 0; i < numActions; i++) {
933 if (!iCmpStr(actions[i].label, "---")) {
934 haveSep = iTrue;
935 break;
936 }
937 }
938 if (!haveSep) {
939 addChildFlags_Widget(div, iClob(new_Widget()), expand_WidgetFlag);
940 }
941 for (size_t i = 0; i < numActions; i++) {
942 const char *label = actions[i].label;
943 const char *cmd = actions[i].command;
944 int key = actions[i].key;
945 int kmods = actions[i].kmods;
946 const iBool isDefault = (i == numActions - 1);
947 if (!iCmpStr(label, "---")) {
948 /* Separator.*/
949 addChildFlags_Widget(div, iClob(new_Widget()), expand_WidgetFlag);
950 continue;
951 }
952 if (!iCmpStr(label, "Cancel") && !cmd) {
953 cmd = "cancel";
954 key = SDLK_ESCAPE;
955 kmods = 0;
956 }
957 if (isDefault) {
958 if (!key) {
959 key = SDLK_RETURN;
960 kmods = 0;
961 }
962 if (label == NULL) {
963 label = uiTextAction_ColorEscape " OK ";
964 }
965 }
966 iLabelWidget *button =
967 addChild_Widget(div, iClob(newKeyMods_LabelWidget(actions[i].label, key, kmods, cmd)));
968 if (isDefault) {
969 setFont_LabelWidget(button, uiLabelBold_FontId);
970 }
971 }
972 return div;
973}
974
922iWidget *makeValueInput_Widget(iWidget *parent, const iString *initialValue, const char *title, 975iWidget *makeValueInput_Widget(iWidget *parent, const iString *initialValue, const char *title,
923 const char *prompt, const char *acceptLabel, const char *command) { 976 const char *prompt, const char *acceptLabel, const char *command) {
924 if (parent) { 977 if (parent) {
925 setFocus_Widget(NULL); 978 setFocus_Widget(NULL);
926// processEvents_App(postedEventsOnly_AppEventMode);
927 } 979 }
928 iWidget *dlg = makeSheet_Widget(command); 980 iWidget *dlg = makeSheet_Widget(command);
929 setCommandHandler_Widget(dlg, valueInputHandler_); 981 setCommandHandler_Widget(dlg, valueInputHandler_);
@@ -943,18 +995,24 @@ iWidget *makeValueInput_Widget(iWidget *parent, const iString *initialValue, con
943 setId_Widget(as_Widget(input), "input"); 995 setId_Widget(as_Widget(input), "input");
944 updateValueInputWidth_(dlg); 996 updateValueInputWidth_(dlg);
945 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI))); 997 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI)));
946 iWidget *div = new_Widget(); { 998// iWidget *div = new_Widget(); {
947 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 999// setFlags_Widget(div, arrangeHorizontal_WidgetFlag | resizeWidthOfChildren_WidgetFlag |
948 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel"))); 1000// arrangeHeight_WidgetFlag | resizeToParentWidth_WidgetFlag, iTrue);
949 iLabelWidget *accept = addChild_Widget( 1001// addChildFlags_Widget(div, iClob(new_Widget()), expand_WidgetFlag);
950 div, 1002// addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel")));
951 iClob(newKeyMods_LabelWidget(acceptLabel ? acceptLabel : uiTextAction_ColorEscape "OK", 1003// iLabelWidget *accept = addChild_Widget(
952 SDLK_RETURN, 1004// div,
953 0, 1005// iClob(newKeyMods_LabelWidget(acceptLabel ? acceptLabel : uiTextAction_ColorEscape "OK",
954 "valueinput.accept"))); 1006// SDLK_RETURN,
955 setFont_LabelWidget(accept, uiLabelBold_FontId); 1007// 0,
956 } 1008// "valueinput.accept")));
957 addChild_Widget(dlg, iClob(div)); 1009// setFont_LabelWidget(accept, uiLabelBold_FontId);
1010// }
1011 addChild_Widget(
1012 dlg,
1013 iClob(makeDialogButtons_(
1014 (iMenuItem[]){ { "Cancel", 0, 0, NULL }, { acceptLabel, 0, 0, "valueinput.accept" } },
1015 2)));
958 centerSheet_Widget(dlg); 1016 centerSheet_Widget(dlg);
959 if (parent) { 1017 if (parent) {
960 setFocus_Widget(as_Widget(input)); 1018 setFocus_Widget(as_Widget(input));
@@ -980,24 +1038,25 @@ static iBool messageHandler_(iWidget *msg, const char *cmd) {
980} 1038}
981 1039
982iWidget *makeMessage_Widget(const char *title, const char *msg) { 1040iWidget *makeMessage_Widget(const char *title, const char *msg) {
983 iWidget *dlg = makeQuestion_Widget( 1041 iWidget *dlg =
984 title, msg, (const char *[]){ "Continue" }, (const char *[]){ "message.ok" }, 1); 1042 makeQuestion_Widget(title, msg, (iMenuItem[]){ { "Continue", 0, 0, "message.ok" } }, 1);
985 addAction_Widget(dlg, SDLK_ESCAPE, 0, "message.ok"); 1043 addAction_Widget(dlg, SDLK_ESCAPE, 0, "message.ok");
986 addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok"); 1044 addAction_Widget(dlg, SDLK_SPACE, 0, "message.ok");
987 return dlg; 1045 return dlg;
988} 1046}
989 1047
990iWidget *makeQuestion_Widget(const char *title, const char *msg, const char *labels[], 1048iWidget *makeQuestion_Widget(const char *title, const char *msg,
991 const char *commands[], size_t count) { 1049 const iMenuItem *items, size_t numItems) {
992 processEvents_App(postedEventsOnly_AppEventMode); 1050 processEvents_App(postedEventsOnly_AppEventMode);
993 iWidget *dlg = makeSheet_Widget(""); 1051 iWidget *dlg = makeSheet_Widget("");
994 setCommandHandler_Widget(dlg, messageHandler_); 1052 setCommandHandler_Widget(dlg, messageHandler_);
995 addChildFlags_Widget(dlg, iClob(new_LabelWidget(title, NULL)), frameless_WidgetFlag); 1053 addChildFlags_Widget(dlg, iClob(new_LabelWidget(title, NULL)), frameless_WidgetFlag);
996 addChildFlags_Widget(dlg, iClob(new_LabelWidget(msg, NULL)), frameless_WidgetFlag); 1054 addChildFlags_Widget(dlg, iClob(new_LabelWidget(msg, NULL)), frameless_WidgetFlag);
997 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI))); 1055 addChild_Widget(dlg, iClob(makePadding_Widget(gap_UI)));
1056#if 0
998 iWidget *div = new_Widget(); { 1057 iWidget *div = new_Widget(); {
999 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 1058 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeHeight_WidgetFlag, iTrue);
1000 for (size_t i = 0; i < count; ++i) { 1059 for (size_t i = 0; i < numItems; ++i) {
1001 /* The last one is the default option. */ 1060 /* The last one is the default option. */
1002 const int key = (i == count - 1 ? SDLK_RETURN : 0); 1061 const int key = (i == count - 1 ? SDLK_RETURN : 0);
1003 iLabelWidget *btn = 1062 iLabelWidget *btn =
@@ -1008,7 +1067,11 @@ iWidget *makeQuestion_Widget(const char *title, const char *msg, const char *lab
1008 } 1067 }
1009 } 1068 }
1010 addChild_Widget(dlg, iClob(div)); 1069 addChild_Widget(dlg, iClob(div));
1070#endif
1071 iWidget *buttons = addChild_Widget(dlg, iClob(makeDialogButtons_(items, numItems)));
1011 addChild_Widget(get_Window()->root, iClob(dlg)); 1072 addChild_Widget(get_Window()->root, iClob(dlg));
1073 arrange_Widget(dlg); /* BUG: This extra arrange shouldn't be needed but the dialog won't
1074 be arranged correctly unless it's here. */
1012 centerSheet_Widget(dlg); 1075 centerSheet_Widget(dlg);
1013 return dlg; 1076 return dlg;
1014} 1077}
@@ -1268,6 +1331,7 @@ iWidget *makePreferences_Widget(void) {
1268 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.gopher")); 1331 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.gopher"));
1269 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.http")); 1332 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.http"));
1270 } 1333 }
1334#if 0
1271 iWidget *div = new_Widget(); { 1335 iWidget *div = new_Widget(); {
1272 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 1336 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);
1273 setFont_LabelWidget( 1337 setFont_LabelWidget(
@@ -1276,6 +1340,10 @@ iWidget *makePreferences_Widget(void) {
1276 uiLabelBold_FontId); 1340 uiLabelBold_FontId);
1277 } 1341 }
1278 addChild_Widget(dlg, iClob(div)); 1342 addChild_Widget(dlg, iClob(div));
1343#endif
1344 addChild_Widget(dlg,
1345 iClob(makeDialogButtons_(
1346 (iMenuItem[]){ { "Dismiss", SDLK_ESCAPE, 0, "prefs.dismiss" } }, 1)));
1279 addChild_Widget(get_Window()->root, iClob(dlg)); 1347 addChild_Widget(get_Window()->root, iClob(dlg));
1280 centerSheet_Widget(dlg); 1348 centerSheet_Widget(dlg);
1281 return dlg; 1349 return dlg;
@@ -1307,6 +1375,7 @@ iWidget *makeBookmarkEditor_Widget(void) {
1307 for (int i = 0; i < 3; ++i) { 1375 for (int i = 0; i < 3; ++i) {
1308 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x; 1376 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x;
1309 } 1377 }
1378#if 0
1310 iWidget *div = new_Widget(); { 1379 iWidget *div = new_Widget(); {
1311 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 1380 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);
1312 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel"))); 1381 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel")));
@@ -1317,6 +1386,15 @@ iWidget *makeBookmarkEditor_Widget(void) {
1317 setFont_LabelWidget(accept, uiLabelBold_FontId); 1386 setFont_LabelWidget(accept, uiLabelBold_FontId);
1318 } 1387 }
1319 addChild_Widget(dlg, iClob(div)); 1388 addChild_Widget(dlg, iClob(div));
1389#endif
1390 addChild_Widget(
1391 dlg,
1392 iClob(makeDialogButtons_((iMenuItem[]){ { "Cancel", 0, 0, NULL },
1393 { uiTextCaution_ColorEscape "Save Bookmark",
1394 SDLK_RETURN,
1395 KMOD_PRIMARY,
1396 "bmed.accept" } },
1397 2)));
1320 addChild_Widget(get_Window()->root, iClob(dlg)); 1398 addChild_Widget(get_Window()->root, iClob(dlg));
1321 centerSheet_Widget(dlg); 1399 centerSheet_Widget(dlg);
1322 return dlg; 1400 return dlg;
@@ -1440,6 +1518,7 @@ iWidget *makeFeedSettings_Widget(uint32_t bookmarkId) {
1440 addRadioButton_(types, "feedcfg.type.headings", "New Headings", "feedcfg.type arg:1"); 1518 addRadioButton_(types, "feedcfg.type.headings", "New Headings", "feedcfg.type arg:1");
1441 } 1519 }
1442 addChildFlags_Widget(values, iClob(types), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 1520 addChildFlags_Widget(values, iClob(types), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
1521#if 0
1443 iWidget *div = new_Widget(); { 1522 iWidget *div = new_Widget(); {
1444 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 1523 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);
1445 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel"))); 1524 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel")));
@@ -1454,6 +1533,18 @@ iWidget *makeFeedSettings_Widget(uint32_t bookmarkId) {
1454 setFont_LabelWidget(findChild_Widget(div, "feedcfg.save"), uiLabelBold_FontId); 1533 setFont_LabelWidget(findChild_Widget(div, "feedcfg.save"), uiLabelBold_FontId);
1455 } 1534 }
1456 addChild_Widget(dlg, iClob(div)); 1535 addChild_Widget(dlg, iClob(div));
1536#endif
1537 iWidget *buttons =
1538 addChild_Widget(dlg,
1539 iClob(makeDialogButtons_(
1540 (iMenuItem[]){ { "Cancel", 0, 0, NULL },
1541 { bookmarkId ? uiTextCaution_ColorEscape "Save Settings"
1542 : uiTextCaution_ColorEscape "Subscribe",
1543 SDLK_RETURN,
1544 KMOD_PRIMARY,
1545 format_CStr("feedcfg.accept bmid:%d", bookmarkId) } },
1546 2)));
1547 setId_Widget(child_Widget(buttons, childCount_Widget(buttons) - 1), "feedcfg.save");
1457 arrange_Widget(dlg); 1548 arrange_Widget(dlg);
1458 as_Widget(input)->rect.size.x = 100 * gap_UI - headings->rect.size.x; 1549 as_Widget(input)->rect.size.x = 100 * gap_UI - headings->rect.size.x;
1459 addChild_Widget(get_Window()->root, iClob(dlg)); 1550 addChild_Widget(get_Window()->root, iClob(dlg));
@@ -1525,6 +1616,7 @@ iWidget *makeIdentityCreation_Widget(void) {
1525 for (size_t i = 0; i < iElemCount(inputs); ++i) { 1616 for (size_t i = 0; i < iElemCount(inputs); ++i) {
1526 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x; 1617 as_Widget(inputs[i])->rect.size.x = 100 * gap_UI - headings->rect.size.x;
1527 } 1618 }
1619#if 0
1528 iWidget *div = new_Widget(); { 1620 iWidget *div = new_Widget(); {
1529 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 1621 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);
1530 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel"))); 1622 addChild_Widget(div, iClob(newKeyMods_LabelWidget("Cancel", SDLK_ESCAPE, 0, "cancel")));
@@ -1535,6 +1627,15 @@ iWidget *makeIdentityCreation_Widget(void) {
1535 setFont_LabelWidget(accept, uiLabelBold_FontId); 1627 setFont_LabelWidget(accept, uiLabelBold_FontId);
1536 } 1628 }
1537 addChild_Widget(dlg, iClob(div)); 1629 addChild_Widget(dlg, iClob(div));
1630#endif
1631 addChild_Widget(
1632 dlg,
1633 iClob(makeDialogButtons_((iMenuItem[]){ { "Cancel", 0, 0, NULL },
1634 { uiTextAction_ColorEscape "Create Identity",
1635 SDLK_RETURN,
1636 KMOD_PRIMARY,
1637 "ident.accept" } },
1638 2)));
1538 addChild_Widget(get_Window()->root, iClob(dlg)); 1639 addChild_Widget(get_Window()->root, iClob(dlg));
1539 centerSheet_Widget(dlg); 1640 centerSheet_Widget(dlg);
1540 return dlg; 1641 return dlg;
diff --git a/src/ui/util.h b/src/ui/util.h
index 829a9c74..96e08e95 100644
--- a/src/ui/util.h
+++ b/src/ui/util.h
@@ -199,7 +199,7 @@ iWidget * makeValueInput_Widget (iWidget *parent, const iString *initialValu
199void updateValueInput_Widget (iWidget *, const char *title, const char *prompt); 199void updateValueInput_Widget (iWidget *, const char *title, const char *prompt);
200iWidget * makeMessage_Widget (const char *title, const char *msg); 200iWidget * makeMessage_Widget (const char *title, const char *msg);
201iWidget * makeQuestion_Widget (const char *title, const char *msg, 201iWidget * makeQuestion_Widget (const char *title, const char *msg,
202 const char *labels[], const char *commands[], size_t count); 202 const iMenuItem *items, size_t numItems);
203 203
204iWidget * makePreferences_Widget (void); 204iWidget * makePreferences_Widget (void);
205iWidget * makeBookmarkEditor_Widget (void); 205iWidget * makeBookmarkEditor_Widget (void);
diff --git a/src/ui/widget.c b/src/ui/widget.c
index c0e2feda..bab35d8d 100644
--- a/src/ui/widget.c
+++ b/src/ui/widget.c
@@ -369,8 +369,8 @@ void arrange_Widget(iWidget *d) {
369 avail = divi_I2(max_I2(zero_I2(), avail), expCount); 369 avail = divi_I2(max_I2(zero_I2(), avail), expCount);
370 iForEach(ObjectList, j, d->children) { 370 iForEach(ObjectList, j, d->children) {
371 iWidget *child = as_Widget(j.object); 371 iWidget *child = as_Widget(j.object);
372 if (isCollapsed_Widget_(child)) continue; 372 if (isCollapsed_Widget_(child) ||
373 if (child->flags & fixedPosition_WidgetFlag) { 373 child->flags & (parentCannotResize_WidgetFlag | fixedPosition_WidgetFlag)) {
374 continue; 374 continue;
375 } 375 }
376 if (child->flags & expand_WidgetFlag) { 376 if (child->flags & expand_WidgetFlag) {
@@ -405,7 +405,7 @@ void arrange_Widget(iWidget *d) {
405 } 405 }
406 iForEach(ObjectList, i, d->children) { 406 iForEach(ObjectList, i, d->children) {
407 iWidget *child = as_Widget(i.object); 407 iWidget *child = as_Widget(i.object);
408 if (!isCollapsed_Widget_(child)) { 408 if (!isCollapsed_Widget_(child) && ~child->flags & parentCannotResize_WidgetFlag) {
409 if (dirs.x) setWidth_Widget_(child, childSize.x); 409 if (dirs.x) setWidth_Widget_(child, childSize.x);
410 if (dirs.y) setHeight_Widget_(child, childSize.y); 410 if (dirs.y) setHeight_Widget_(child, childSize.y);
411 } 411 }
diff --git a/src/ui/widget.h b/src/ui/widget.h
index 02ee091f..0de0890b 100644
--- a/src/ui/widget.h
+++ b/src/ui/widget.h
@@ -98,6 +98,7 @@ enum iWidgetFlag {
98#define drawBackgroundToHorizontalSafeArea_WidgetFlag iBit64(43) 98#define drawBackgroundToHorizontalSafeArea_WidgetFlag iBit64(43)
99#define drawBackgroundToVerticalSafeArea_WidgetFlag iBit64(44) 99#define drawBackgroundToVerticalSafeArea_WidgetFlag iBit64(44)
100#define visualOffset_WidgetFlag iBit64(45) 100#define visualOffset_WidgetFlag iBit64(45)
101#define parentCannotResize_WidgetFlag iBit64(46)
101 102
102enum iWidgetAddPos { 103enum iWidgetAddPos {
103 back_WidgetAddPos, 104 back_WidgetAddPos,