diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-02-22 21:35:10 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-02-22 21:35:10 +0200 |
commit | 90443011c98a6dc8340d2c84f1e538c7a98327f2 (patch) | |
tree | 94e1522758d7b83be08144ae4bac54853fd3a277 | |
parent | 1174f2e9318a58602baccdfb3e2465645d263601 (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.c | 46 | ||||
-rw-r--r-- | src/ui/sidebarwidget.c | 29 | ||||
-rw-r--r-- | src/ui/util.c | 143 | ||||
-rw-r--r-- | src/ui/util.h | 2 | ||||
-rw-r--r-- | src/ui/widget.c | 6 | ||||
-rw-r--r-- | src/ui/widget.h | 1 |
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 | ||
833 | void centerSheet_Widget(iWidget *sheet) { | 834 | void 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 | ||
923 | static 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 | |||
922 | iWidget *makeValueInput_Widget(iWidget *parent, const iString *initialValue, const char *title, | 975 | iWidget *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 | ||
982 | iWidget *makeMessage_Widget(const char *title, const char *msg) { | 1040 | iWidget *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 | ||
990 | iWidget *makeQuestion_Widget(const char *title, const char *msg, const char *labels[], | 1048 | iWidget *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 | |||
199 | void updateValueInput_Widget (iWidget *, const char *title, const char *prompt); | 199 | void updateValueInput_Widget (iWidget *, const char *title, const char *prompt); |
200 | iWidget * makeMessage_Widget (const char *title, const char *msg); | 200 | iWidget * makeMessage_Widget (const char *title, const char *msg); |
201 | iWidget * makeQuestion_Widget (const char *title, const char *msg, | 201 | iWidget * 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 | ||
204 | iWidget * makePreferences_Widget (void); | 204 | iWidget * makePreferences_Widget (void); |
205 | iWidget * makeBookmarkEditor_Widget (void); | 205 | iWidget * 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 | ||
102 | enum iWidgetAddPos { | 103 | enum iWidgetAddPos { |
103 | back_WidgetAddPos, | 104 | back_WidgetAddPos, |