From 3b16b823d5840096402ec0bddc3d35f6028b75f6 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sat, 20 Feb 2021 22:17:01 +0200 Subject: Revising sidebar placement for phones In portrait mode, phones have no room for sidebars so need to use a different widget arrangement. --- src/ui/sidebarwidget.c | 17 +++++++++++------ src/ui/util.c | 6 +++--- src/ui/widget.c | 9 ++++++--- src/ui/window.c | 26 +++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 456bcee7..da76c4d4 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c @@ -510,6 +510,9 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) { resizeToParentHeight_WidgetFlag | (side == left_SideBarSide ? moveToParentRightEdge_WidgetFlag : moveToParentLeftEdge_WidgetFlag)); + if (deviceType_App() == phone_AppDeviceType) { + setFlags_Widget(d->resizer, hidden_WidgetFlag | disabled_WidgetFlag, iTrue); + } setId_Widget(d->resizer, side == left_SideBarSide ? "sidebar.grab" : "sidebar2.grab"); d->resizer->rect.size.x = gap_UI; setBackgroundColor_Widget(d->resizer, none_ColorId); @@ -603,16 +606,18 @@ static void checkModeButtonLayout_SidebarWidget_(iSidebarWidget *d) { } void setWidth_SidebarWidget(iSidebarWidget *d, int width) { - iWidget * w = as_Widget(d); - /* Even less space if the other sidebar is visible, too. */ - const int otherWidth = - width_Widget(findWidget_App(d->side == left_SideBarSide ? "sidebar2" : "sidebar")); - width = iClamp(width, 30 * gap_UI, rootSize_Window(get_Window()).x - 50 * gap_UI - otherWidth); + iWidget *w = as_Widget(d); + if (deviceType_App() != phone_AppDeviceType) { /* phone doesn't allow resizing */ + /* Even less space if the other sidebar is visible, too. */ + const int otherWidth = + width_Widget(findWidget_App(d->side == left_SideBarSide ? "sidebar2" : "sidebar")); + width = iClamp(width, 30 * gap_UI, rootSize_Window(get_Window()).x - 50 * gap_UI - otherWidth); + } d->width = width; if (isVisible_Widget(w)) { w->rect.size.x = width; } - arrange_Widget(findWidget_App("doctabs")); + arrange_Widget(findWidget_App("stack")); checkModeButtonLayout_SidebarWidget_(d); if (!isRefreshPending_App()) { updateSize_DocumentWidget(document_App()); diff --git a/src/ui/util.c b/src/ui/util.c index 1ff1b7f7..db9e4507 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -358,13 +358,13 @@ iLabelWidget *makeHeading_Widget(const char *text) { iWidget *makeVDiv_Widget(void) { iWidget *div = new_Widget(); - setFlags_Widget(div, resizeChildren_WidgetFlag | arrangeVertical_WidgetFlag, iTrue); + setFlags_Widget(div, resizeChildren_WidgetFlag | arrangeVertical_WidgetFlag | unhittable_WidgetFlag, iTrue); return div; } iWidget *makeHDiv_Widget(void) { iWidget *div = new_Widget(); - setFlags_Widget(div, resizeChildren_WidgetFlag | arrangeHorizontal_WidgetFlag, iTrue); + setFlags_Widget(div, resizeChildren_WidgetFlag | arrangeHorizontal_WidgetFlag | unhittable_WidgetFlag, iTrue); return div; } @@ -382,7 +382,7 @@ static iBool isCommandIgnoredByMenus_(const char *cmd) { startsWith_CStr(cmd, "feeds.update.") || equal_Command(cmd, "document.request.updated") || equal_Command(cmd, "bookmarks.request.finished") || - equal_Command(cmd, "window.resized") || + (deviceType_App() == desktop_AppDeviceType && equal_Command(cmd, "window.resized")) || equal_Command(cmd, "window.reload.update") || equal_Command(cmd, "window.mouse.exited") || equal_Command(cmd, "window.mouse.entered") || diff --git a/src/ui/widget.c b/src/ui/widget.c index 0e020080..9320659c 100644 --- a/src/ui/widget.c +++ b/src/ui/widget.c @@ -763,7 +763,7 @@ size_t childIndex_Widget(const iWidget *d, const iAnyObject *child) { } iAny *hitChild_Widget(const iWidget *d, iInt2 coord) { - if (d->flags & (unhittable_WidgetFlag | hidden_WidgetFlag)) { + if (d->flags & hidden_WidgetFlag) { return NULL; } /* Check for on-top widgets first. */ @@ -773,14 +773,17 @@ iAny *hitChild_Widget(const iWidget *d, iInt2 coord) { if (found) return found; } } - iForEach(ObjectList, i, d->children) { + iReverseForEach(ObjectList, i, d->children) { const iWidget *child = constAs_Widget(i.object); if (~child->flags & keepOnTop_WidgetFlag) { iAny *found = hitChild_Widget(child, coord); if (found) return found; } } - if (contains_Widget(d, coord)) { + if (class_Widget(d) == &Class_Widget) { + return NULL; /* Plain widgets are not hittable. */ + } + if (~d->flags & unhittable_WidgetFlag && contains_Widget(d, coord)) { return iConstCast(iWidget *, d); } return NULL; diff --git a/src/ui/window.c b/src/ui/window.c index 559b41a6..c096c00b 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -125,6 +125,20 @@ static iBool handleRootCommands_(iWidget *root, const char *cmd) { SDL_PushEvent(&(SDL_Event){ .type = SDL_QUIT }); return iTrue; } + else if (deviceType_App() == phone_AppDeviceType && equal_Command(cmd, "window.resized")) { + /* Place the sidebar next to or under doctabs depending on orientation. */ + iSidebarWidget *sidebar = findChild_Widget(root, "sidebar"); + removeChild_Widget(parent_Widget(sidebar), sidebar); + if (isLandscape_App()) { + addChildPos_Widget(findChild_Widget(root, "tabs.content"), iClob(sidebar), front_WidgetAddPos); + setWidth_SidebarWidget(sidebar, 73 * gap_UI); + } + else { + addChildPos_Widget(findChild_Widget(root, "stack"), iClob(sidebar), back_WidgetAddPos); + setWidth_SidebarWidget(sidebar, width_Widget(root)); + } + return iFalse; + } else if (handleCommand_App(cmd)) { return iTrue; } @@ -353,7 +367,9 @@ static void updateNavBarIdentity_(iWidget *navBar) { const iGmIdentity *ident = identityForUrl_GmCerts(certs_App(), url_DocumentWidget(document_App())); iWidget *button = findChild_Widget(navBar, "navbar.ident"); + iWidget *tool = findWidget_App("toolbar.ident"); setFlags_Widget(button, selected_WidgetFlag, ident != NULL); + setFlags_Widget(tool, selected_WidgetFlag, ident != NULL); /* Update menu. */ iLabelWidget *idItem = child_Widget(findChild_Widget(button, "menu"), 0); setTextCStr_LabelWidget( @@ -761,9 +777,12 @@ static void setupUserInterface_Window(iWindow *d) { #endif } /* Tab bar. */ { - iWidget *tabBar = makeTabs_Widget(div); + iWidget *mainStack = new_Widget(); + setId_Widget(mainStack, "stack"); + addChildFlags_Widget(div, iClob(mainStack), resizeChildren_WidgetFlag | expand_WidgetFlag | + unhittable_WidgetFlag); + iWidget *tabBar = makeTabs_Widget(mainStack); setId_Widget(tabBar, "doctabs"); - setFlags_Widget(tabBar, expand_WidgetFlag, iTrue); setBackgroundColor_Widget(tabBar, uiBackground_ColorId); appendTabPage_Widget(tabBar, iClob(new_DocumentWidget()), "Document", 0, 0); iWidget *buttons = findChild_Widget(tabBar, "tabs.buttons"); @@ -822,7 +841,8 @@ static void setupUserInterface_Window(iWindow *d) { setBackgroundColor_Widget(toolBar, tmBannerBackground_ColorId); addChildFlags_Widget(toolBar, iClob(newLargeIcon_LabelWidget("\U0001f870", "navigate.back")), frameless_WidgetFlag); addChildFlags_Widget(toolBar, iClob(newLargeIcon_LabelWidget("\U0001f872", "navigate.forward")), frameless_WidgetFlag); - addChildFlags_Widget(toolBar, iClob(newLargeIcon_LabelWidget("\U0001f464", "sidebar.mode arg:3 show:1")), frameless_WidgetFlag); + setId_Widget(addChildFlags_Widget(toolBar, iClob(newLargeIcon_LabelWidget("\U0001f464", "sidebar.mode arg:3 toggle:1")), frameless_WidgetFlag), "toolbar.ident"); + addChildFlags_Widget(toolBar, iClob(newLargeIcon_LabelWidget("\U0001f588", "sidebar.mode arg:0 toggle:1")), frameless_WidgetFlag); iLabelWidget *menuButton = makeMenuButton_LabelWidget("\U0001d362", navMenuItems_, iElemCount(navMenuItems_)); setFont_LabelWidget(menuButton, uiLabelLarge_FontId); addChildFlags_Widget(toolBar, iClob(menuButton), frameless_WidgetFlag); -- cgit v1.2.3