summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/mobile.c3
-rw-r--r--src/ui/root.c82
-rw-r--r--src/ui/util.c4
3 files changed, 70 insertions, 19 deletions
diff --git a/src/ui/mobile.c b/src/ui/mobile.c
index e34cad3a..cf955423 100644
--- a/src/ui/mobile.c
+++ b/src/ui/mobile.c
@@ -50,7 +50,8 @@ const iToolbarActionSpec toolbarActions_Mobile[max_ToolbarAction] = {
50 { upload_Icon, "${menu.page.upload}", "document.upload" }, 50 { upload_Icon, "${menu.page.upload}", "document.upload" },
51 { edit_Icon, "${menu.page.upload.edit}", "document.upload copy:1" }, 51 { edit_Icon, "${menu.page.upload.edit}", "document.upload copy:1" },
52 { magnifyingGlass_Icon, "${menu.find}", "focus.set id:find.input" }, 52 { magnifyingGlass_Icon, "${menu.find}", "focus.set id:find.input" },
53 { gear_Icon, "${menu.settings}", "preferences" }, 53 { gear_Icon, "${menu.settings}", "preferences" },
54 { leftHalf_Icon, "${menu.sidebar.left}", "sidebar.toggle" },
54}; 55};
55 56
56iBool isUsingPanelLayout_Mobile(void) { 57iBool isUsingPanelLayout_Mobile(void) {
diff --git a/src/ui/root.c b/src/ui/root.c
index 0a366996..a3c2e0ae 100644
--- a/src/ui/root.c
+++ b/src/ui/root.c
@@ -596,11 +596,17 @@ static void updateNavBarIdentity_(iWidget *navBar) {
596} 596}
597 597
598static void updateNavDirButtons_(iWidget *navBar) { 598static void updateNavDirButtons_(iWidget *navBar) {
599 const iHistory *history = history_DocumentWidget(document_App()); 599 iBeginCollect();
600 iBool atOldest = atOldest_History(history); 600 const iHistory *history = history_DocumentWidget(document_App());
601 iBool atNewest = atNewest_History(history); 601 const iBool atOldest = atOldest_History(history);
602 setFlags_Widget(findChild_Widget(navBar, "navbar.back"), disabled_WidgetFlag, atOldest); 602 const iBool atNewest = atNewest_History(history);
603 setFlags_Widget(findChild_Widget(navBar, "navbar.forward"), disabled_WidgetFlag, atNewest); 603 /* Reset button state. */
604 for (size_t i = 0; i < maxNavbarActions_Prefs; i++) {
605 const char *id = format_CStr("navbar.action%d", i + 1);
606 setFlags_Widget(findChild_Widget(navBar, id), disabled_WidgetFlag, iFalse);
607 }
608 setFlags_Widget(as_Widget(findMenuItem_Widget(navBar, "navigate.back")), disabled_WidgetFlag, atOldest);
609 setFlags_Widget(as_Widget(findMenuItem_Widget(navBar, "navigate.forward")), disabled_WidgetFlag, atNewest);
604 iWidget *toolBar = findWidget_App("toolbar"); 610 iWidget *toolBar = findWidget_App("toolbar");
605 if (toolBar) { 611 if (toolBar) {
606 /* Reset the state. */ 612 /* Reset the state. */
@@ -618,6 +624,7 @@ static void updateNavDirButtons_(iWidget *navBar) {
618 setOutline_LabelWidget(fwd, atNewest); 624 setOutline_LabelWidget(fwd, atNewest);
619 refresh_Widget(toolBar); 625 refresh_Widget(toolBar);
620 } 626 }
627 iEndCollect();
621} 628}
622 629
623static const char *loadAnimationCStr_(void) { 630static const char *loadAnimationCStr_(void) {
@@ -777,7 +784,7 @@ static void updateNavBarSize_(iWidget *navBar) {
777 /* Button sizing. */ 784 /* Button sizing. */
778 if (isNarrow ^ ((flags_Widget(navBar) & tight_WidgetFlag) != 0)) { 785 if (isNarrow ^ ((flags_Widget(navBar) & tight_WidgetFlag) != 0)) {
779 setFlags_Widget(navBar, tight_WidgetFlag, isNarrow); 786 setFlags_Widget(navBar, tight_WidgetFlag, isNarrow);
780 showCollapsed_Widget(findChild_Widget(navBar, "navbar.sidebar"), !isNarrow); 787 showCollapsed_Widget(findChild_Widget(navBar, "navbar.action3"), !isNarrow);
781 iObjectList *lists[] = { 788 iObjectList *lists[] = {
782 children_Widget(navBar), 789 children_Widget(navBar),
783 children_Widget(findChild_Widget(navBar, "url")), 790 children_Widget(findChild_Widget(navBar, "url")),
@@ -798,8 +805,8 @@ static void updateNavBarSize_(iWidget *navBar) {
798 updateUrlInputContentPadding_(navBar); 805 updateUrlInputContentPadding_(navBar);
799 } 806 }
800 if (isPhone) { 807 if (isPhone) {
801 static const char *buttons[] = { "navbar.back", "navbar.forward", "navbar.sidebar", 808 static const char *buttons[] = { "navbar.action1", "navbar.action2", "navbar.action3",
802 "navbar.ident", "navbar.home", "navbar.menu" }; 809 "navbar.action4", "navbar.ident", "navbar.menu" };
803 iWidget *toolBar = findWidget_Root("toolbar"); 810 iWidget *toolBar = findWidget_Root("toolbar");
804 setVisualOffset_Widget(toolBar, 0, 0, 0); 811 setVisualOffset_Widget(toolBar, 0, 0, 0);
805 setFlags_Widget(toolBar, hidden_WidgetFlag, isLandscape_App()); 812 setFlags_Widget(toolBar, hidden_WidgetFlag, isLandscape_App());
@@ -824,6 +831,22 @@ static void updateNavBarSize_(iWidget *navBar) {
824 postCommand_Widget(navBar, "layout.changed id:navbar"); 831 postCommand_Widget(navBar, "layout.changed id:navbar");
825} 832}
826 833
834static void updateNavBarActions_(iWidget *navBar) {
835 const iPrefs *prefs = prefs_App();
836 for (size_t i = 0; i < iElemCount(prefs->navbarActions); i++) {
837 iBeginCollect();
838 const int action = prefs->navbarActions[i];
839 iLabelWidget *button =
840 findChild_Widget(navBar, format_CStr("navbar.action%d", i + 1));
841 if (button) {
842 setFlags_Widget(as_Widget(button), disabled_WidgetFlag, iFalse);
843 updateTextCStr_LabelWidget(button, toolbarActions_Mobile[action].icon);
844 setCommand_LabelWidget(button, collectNewCStr_String(toolbarActions_Mobile[action].command));
845 }
846 iEndCollect();
847 }
848}
849
827static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { 850static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) {
828 if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "metrics.changed")) { 851 if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "metrics.changed")) {
829 updateNavBarSize_(navBar); 852 updateNavBarSize_(navBar);
@@ -836,6 +859,33 @@ static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) {
836 } 859 }
837 return iFalse; 860 return iFalse;
838 } 861 }
862 else if (equal_Command(cmd, "navbar.actions.changed")) {
863 updateNavBarActions_(navBar);
864 return iTrue;
865 }
866 else if (equal_Command(cmd, "contextclick")) {
867 const iRangecc id = range_Command(cmd, "id");
868 if (id.start && startsWith_CStr(id.start, "navbar.action")) {
869 const int buttonIndex = id.end[-1] - '1';
870 iArray items;
871 init_Array(&items, sizeof(iMenuItem));
872 for (size_t i = 0; i < max_ToolbarAction; i++) {
873 pushBack_Array(
874 &items,
875 &(iMenuItem){
876 format_CStr(
877 "%s %s", toolbarActions_Mobile[i].icon, toolbarActions_Mobile[i].label),
878 0,
879 0,
880 format_CStr("navbar.action.set arg:%d button:%d", i, buttonIndex) });
881 }
882 openMenu_Widget(
883 makeMenu_Widget(get_Root()->widget, constData_Array(&items), size_Array(&items)),
884 coord_Command(cmd));
885 deinit_Array(&items);
886 }
887 return iFalse;
888 }
839 else if (equal_Command(cmd, "navigate.focus")) { 889 else if (equal_Command(cmd, "navigate.focus")) {
840 /* The upload dialog has its own path field. */ 890 /* The upload dialog has its own path field. */
841 if (findWidget_App("upload")) { 891 if (findWidget_App("upload")) {
@@ -1068,9 +1118,7 @@ static iBool handleSearchBarCommands_(iWidget *searchBar, const char *cmd) {
1068static void updateToolBarActions_(iWidget *toolBar) { 1118static void updateToolBarActions_(iWidget *toolBar) {
1069 const iPrefs *prefs = prefs_App(); 1119 const iPrefs *prefs = prefs_App();
1070 for (int i = 0; i < 2; i++) { 1120 for (int i = 0; i < 2; i++) {
1071 int action = prefs->toolbarActions[i] 1121 const int action = prefs->toolbarActions[i];
1072 ? prefs->toolbarActions[i]
1073 : (i == 0 ? back_ToolbarAction : forward_ToolbarAction);
1074 iLabelWidget *button = 1122 iLabelWidget *button =
1075 findChild_Widget(toolBar, i == 0 ? "toolbar.action1" : "toolbar.action2"); 1123 findChild_Widget(toolBar, i == 0 ? "toolbar.action1" : "toolbar.action2");
1076 if (button) { 1124 if (button) {
@@ -1260,14 +1308,14 @@ void createUserInterface_Root(iRoot *d) {
1260 addUnsplitButton_(navBar); 1308 addUnsplitButton_(navBar);
1261#endif 1309#endif
1262 iWidget *navBack; 1310 iWidget *navBack;
1263 setId_Widget(navBack = addChildFlags_Widget(navBar, iClob(newIcon_LabelWidget(backArrow_Icon, 0, 0, "navigate.back")), collapse_WidgetFlag), "navbar.back"); 1311 setId_Widget(navBack = addChildFlags_Widget(navBar, iClob(newIcon_LabelWidget(backArrow_Icon, 0, 0, "navigate.back")), collapse_WidgetFlag), "navbar.action1");
1264 setId_Widget(addChildFlags_Widget(navBar, iClob(newIcon_LabelWidget(forwardArrow_Icon, 0, 0, "navigate.forward")), collapse_WidgetFlag), "navbar.forward"); 1312 setId_Widget(addChildFlags_Widget(navBar, iClob(newIcon_LabelWidget(forwardArrow_Icon, 0, 0, "navigate.forward")), collapse_WidgetFlag), "navbar.action2");
1265 /* Button for toggling the left sidebar. */ 1313 /* Button for toggling the left sidebar. */
1266 setId_Widget(addChildFlags_Widget( 1314 setId_Widget(addChildFlags_Widget(
1267 navBar, 1315 navBar,
1268 iClob(newIcon_LabelWidget(leftHalf_Icon, 0, 0, "sidebar.toggle")), 1316 iClob(newIcon_LabelWidget(leftHalf_Icon, 0, 0, "sidebar.toggle")),
1269 collapse_WidgetFlag), 1317 collapse_WidgetFlag),
1270 "navbar.sidebar"); 1318 "navbar.action3");
1271 addChildFlags_Widget(navBar, iClob(new_Widget()), expand_WidgetFlag); 1319 addChildFlags_Widget(navBar, iClob(new_Widget()), expand_WidgetFlag);
1272 iInputWidget *url; 1320 iInputWidget *url;
1273 /* URL input field. */ { 1321 /* URL input field. */ {
@@ -1421,9 +1469,9 @@ void createUserInterface_Root(iRoot *d) {
1421 addChildFlags_Widget(navBar, iClob(new_Widget()), expand_WidgetFlag); 1469 addChildFlags_Widget(navBar, iClob(new_Widget()), expand_WidgetFlag);
1422 setId_Widget(addChildFlags_Widget(navBar, 1470 setId_Widget(addChildFlags_Widget(navBar,
1423 iClob(newIcon_LabelWidget( 1471 iClob(newIcon_LabelWidget(
1424 home_Icon, SDLK_h, KMOD_PRIMARY | KMOD_SHIFT, "navigate.home")), 1472 home_Icon, 0, 0, "navigate.home")),
1425 collapse_WidgetFlag), 1473 collapse_WidgetFlag),
1426 "navbar.home"); 1474 "navbar.action4");
1427#if defined (iPlatformMobile) 1475#if defined (iPlatformMobile)
1428 const iBool isPhone = (deviceType_App() == phone_AppDeviceType); 1476 const iBool isPhone = (deviceType_App() == phone_AppDeviceType);
1429#endif 1477#endif
@@ -1583,6 +1631,7 @@ void createUserInterface_Root(iRoot *d) {
1583 setId_Widget(menu, "toolbar.menu"); /* view menu */ 1631 setId_Widget(menu, "toolbar.menu"); /* view menu */
1584 } 1632 }
1585#endif 1633#endif
1634 updateNavBarActions_(navBar);
1586 updatePadding_Root(d); 1635 updatePadding_Root(d);
1587 /* Global context menus. */ { 1636 /* Global context menus. */ {
1588 iWidget *tabsMenu = makeMenu_Widget( 1637 iWidget *tabsMenu = makeMenu_Widget(
@@ -1651,6 +1700,7 @@ void createUserInterface_Root(iRoot *d) {
1651 setId_Widget(splitMenu, "splitmenu"); 1700 setId_Widget(splitMenu, "splitmenu");
1652 } 1701 }
1653 /* Global keyboard shortcuts. */ { 1702 /* Global keyboard shortcuts. */ {
1703 addAction_Widget(root, SDLK_h, KMOD_PRIMARY | KMOD_SHIFT, "navigate.home");
1654 addAction_Widget(root, 'l', KMOD_PRIMARY, "navigate.focus"); 1704 addAction_Widget(root, 'l', KMOD_PRIMARY, "navigate.focus");
1655 addAction_Widget(root, 'f', KMOD_PRIMARY, "focus.set id:find.input"); 1705 addAction_Widget(root, 'f', KMOD_PRIMARY, "focus.set id:find.input");
1656 addAction_Widget(root, '1', KMOD_PRIMARY, "sidebar.mode arg:0 toggle:1"); 1706 addAction_Widget(root, '1', KMOD_PRIMARY, "sidebar.mode arg:0 toggle:1");
diff --git a/src/ui/util.c b/src/ui/util.c
index 0adaebb6..41e645de 100644
--- a/src/ui/util.c
+++ b/src/ui/util.c
@@ -2404,10 +2404,10 @@ iWidget *makePreferences_Widget(void) {
2404 format_CStr("returnkey.set arg:%d", acceptWithPrimaryMod_ReturnKeyBehavior) }, 2404 format_CStr("returnkey.set arg:%d", acceptWithPrimaryMod_ReturnKeyBehavior) },
2405 { NULL } 2405 { NULL }
2406 }; 2406 };
2407 iMenuItem toolbarActionItems[2][max_ToolbarAction + 1]; 2407 iMenuItem toolbarActionItems[2][max_ToolbarAction];
2408 iZap(toolbarActionItems); 2408 iZap(toolbarActionItems);
2409 for (int j = 0; j < 2; j++) { 2409 for (int j = 0; j < 2; j++) {
2410 for (int i = 0; i < max_ToolbarAction; i++) { 2410 for (int i = 0; i < sidebar_ToolbarAction; i++) {
2411 toolbarActionItems[j][i].label = toolbarActions_Mobile[i].label; 2411 toolbarActionItems[j][i].label = toolbarActions_Mobile[i].label;
2412 toolbarActionItems[j][i].command = 2412 toolbarActionItems[j][i].command =
2413 format_CStr("toolbar.action.set arg:%d button:%d", i, j); 2413 format_CStr("toolbar.action.set arg:%d button:%d", i, j);