diff options
Diffstat (limited to 'src/ui/root.c')
-rw-r--r-- | src/ui/root.c | 82 |
1 files changed, 66 insertions, 16 deletions
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 | ||
598 | static void updateNavDirButtons_(iWidget *navBar) { | 598 | static 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 | ||
623 | static const char *loadAnimationCStr_(void) { | 630 | static 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 | ||
834 | static 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 | |||
827 | static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { | 850 | static 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) { | |||
1068 | static void updateToolBarActions_(iWidget *toolBar) { | 1118 | static 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"); |