diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/sidebarwidget.c | 164 |
1 files changed, 114 insertions, 50 deletions
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 401c5d25..48802ddf 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c | |||
@@ -90,6 +90,22 @@ iDefineObjectConstruction(SidebarItem) | |||
90 | 90 | ||
91 | /*----------------------------------------------------------------------------------------------*/ | 91 | /*----------------------------------------------------------------------------------------------*/ |
92 | 92 | ||
93 | static const char *normalModeLabels_[max_SidebarMode] = { | ||
94 | book_Icon " ${sidebar.bookmarks}", | ||
95 | star_Icon " ${sidebar.feeds}", | ||
96 | clock_Icon " ${sidebar.history}", | ||
97 | person_Icon " ${sidebar.identities}", | ||
98 | page_Icon " ${sidebar.outline}", | ||
99 | }; | ||
100 | |||
101 | static const char *tightModeLabels_[max_SidebarMode] = { | ||
102 | book_Icon, | ||
103 | star_Icon, | ||
104 | clock_Icon, | ||
105 | person_Icon, | ||
106 | page_Icon, | ||
107 | }; | ||
108 | |||
93 | struct Impl_SidebarWidget { | 109 | struct Impl_SidebarWidget { |
94 | iWidget widget; | 110 | iWidget widget; |
95 | enum iSidebarSide side; | 111 | enum iSidebarSide side; |
@@ -197,10 +213,14 @@ static iLabelWidget *addActionButton_SidebarWidget_(iSidebarWidget *d, const cha | |||
197 | //(deviceType_App() != desktop_AppDeviceType ? | 213 | //(deviceType_App() != desktop_AppDeviceType ? |
198 | // extraPadding_WidgetFlag : 0) | | 214 | // extraPadding_WidgetFlag : 0) | |
199 | flags); | 215 | flags); |
200 | setFont_LabelWidget(btn, /*deviceType_App() == phone_AppDeviceType && d->side == right_SidebarSide | 216 | setFont_LabelWidget(btn, deviceType_App() == desktop_AppDeviceType ? /*deviceType_App() == phone_AppDeviceType && d->side == right_SidebarSide |
201 | ? uiLabelBig_FontId : */ | 217 | ? uiLabelBig_FontId : */ |
202 | d->buttonFont); | 218 | d->buttonFont : uiLabelBig_FontId); |
203 | checkIcon_LabelWidget(btn); | 219 | checkIcon_LabelWidget(btn); |
220 | if (deviceType_App() != desktop_AppDeviceType) { | ||
221 | setFlags_Widget(as_Widget(btn), frameless_WidgetFlag, iTrue); | ||
222 | setBackgroundColor_Widget(as_Widget(btn), uiBackground_ColorId); | ||
223 | } | ||
204 | return btn; | 224 | return btn; |
205 | } | 225 | } |
206 | 226 | ||
@@ -306,36 +326,57 @@ static void updateItemsWithFlags_SidebarWidget_(iSidebarWidget *d, iBool keepAct | |||
306 | } | 326 | } |
307 | } | 327 | } |
308 | /* Actions. */ | 328 | /* Actions. */ |
309 | if (!keepActions) { | 329 | if (!isMobile) { |
310 | addActionButton_SidebarWidget_(d, | 330 | if (!keepActions) { |
311 | check_Icon " ${sidebar.action.feeds.markallread}", | 331 | addActionButton_SidebarWidget_(d, |
312 | "feeds.markallread", | 332 | check_Icon " ${sidebar.action.feeds.markallread}", |
313 | expand_WidgetFlag | tight_WidgetFlag); | 333 | "feeds.markallread", |
314 | updateSize_LabelWidget(addChildFlags_Widget(d->actions, | 334 | expand_WidgetFlag | tight_WidgetFlag); |
315 | iClob(new_LabelWidget("${sidebar.action.show}", NULL)), | 335 | updateSize_LabelWidget(addChildFlags_Widget(d->actions, |
316 | frameless_WidgetFlag | tight_WidgetFlag)); | 336 | iClob(new_LabelWidget("${sidebar.action.show}", NULL)), |
317 | const iMenuItem items[] = { | 337 | frameless_WidgetFlag | tight_WidgetFlag)); |
318 | { page_Icon " ${sidebar.action.feeds.showall}", SDLK_u, KMOD_SHIFT, "feeds.mode arg:0" }, | 338 | const iMenuItem items[] = { |
319 | { circle_Icon " ${sidebar.action.feeds.showunread}", SDLK_u, 0, "feeds.mode arg:1" }, | 339 | { page_Icon " ${sidebar.action.feeds.showall}", SDLK_u, KMOD_SHIFT, "feeds.mode arg:0" }, |
320 | }; | 340 | { circle_Icon " ${sidebar.action.feeds.showunread}", SDLK_u, 0, "feeds.mode arg:1" }, |
321 | iWidget *dropButton = addChild_Widget( | 341 | }; |
322 | d->actions, | 342 | iWidget *dropButton = addChild_Widget( |
323 | iClob(makeMenuButton_LabelWidget(items[d->feedsMode].label, items, 2))); | 343 | d->actions, |
324 | setId_Widget(dropButton, "feeds.modebutton"); | 344 | iClob(makeMenuButton_LabelWidget(items[d->feedsMode].label, items, 2))); |
325 | checkIcon_LabelWidget((iLabelWidget *) dropButton); | 345 | setId_Widget(dropButton, "feeds.modebutton"); |
326 | setFixedSize_Widget( | 346 | checkIcon_LabelWidget((iLabelWidget *) dropButton); |
327 | dropButton, | 347 | setFixedSize_Widget( |
328 | init_I2(iMaxi(20 * gap_UI, | 348 | dropButton, |
329 | measure_Text(default_FontId, | 349 | init_I2(iMaxi(20 * gap_UI, |
330 | translateCStr_Lang( | 350 | measure_Text(default_FontId, |
331 | items[findWidestLabel_MenuItem(items, 2)].label)) | 351 | translateCStr_Lang( |
332 | .advance.x + | 352 | items[findWidestLabel_MenuItem(items, 2)].label)) |
333 | 13 * gap_UI), | 353 | .advance.x + |
334 | -1)); | 354 | 13 * gap_UI), |
355 | -1)); | ||
356 | } | ||
357 | else { | ||
358 | updateDropdownSelection_LabelWidget(findChild_Widget(d->actions, "feeds.modebutton"), | ||
359 | format_CStr(" arg:%d", d->feedsMode)); | ||
360 | } | ||
335 | } | 361 | } |
336 | else { | 362 | else { |
337 | updateDropdownSelection_LabelWidget(findChild_Widget(d->actions, "feeds.modebutton"), | 363 | if (!keepActions) { |
338 | format_CStr(" arg:%d", d->feedsMode)); | 364 | iLabelWidget *readAll = addActionButton_SidebarWidget_(d, |
365 | check_Icon, | ||
366 | "feeds.markallread confirm:1", | ||
367 | 0); | ||
368 | setTextColor_LabelWidget(readAll, uiTextCaution_ColorId); | ||
369 | addActionButton_SidebarWidget_(d, | ||
370 | page_Icon, | ||
371 | "feeds.mode arg:0", | ||
372 | 0); | ||
373 | addActionButton_SidebarWidget_(d, | ||
374 | circle_Icon, | ||
375 | "feeds.mode arg:1", | ||
376 | 0); | ||
377 | } | ||
378 | setOutline_LabelWidget(child_Widget(d->actions, 1), d->feedsMode != all_FeedsMode); | ||
379 | setOutline_LabelWidget(child_Widget(d->actions, 2), d->feedsMode != unread_FeedsMode); | ||
339 | } | 380 | } |
340 | d->menu = makeMenu_Widget( | 381 | d->menu = makeMenu_Widget( |
341 | as_Widget(d), | 382 | as_Widget(d), |
@@ -500,6 +541,12 @@ static void updateItemsWithFlags_SidebarWidget_(iSidebarWidget *d, iBool keepAct | |||
500 | (iMenuItem[]){ | 541 | (iMenuItem[]){ |
501 | { delete_Icon " " uiTextCaution_ColorEscape "${history.clear}", 0, 0, "history.clear confirm:1" }, | 542 | { delete_Icon " " uiTextCaution_ColorEscape "${history.clear}", 0, 0, "history.clear confirm:1" }, |
502 | }, 1); | 543 | }, 1); |
544 | if (isMobile) { | ||
545 | addChildFlags_Widget(d->actions, iClob(new_Widget()), expand_WidgetFlag); | ||
546 | iLabelWidget *btn = addActionButton_SidebarWidget_(d, "${sidebar.action.history.clear}", | ||
547 | "history.clear confirm:1", 0); | ||
548 | setFont_LabelWidget(btn, uiLabelBigBold_FontId); | ||
549 | } | ||
503 | break; | 550 | break; |
504 | } | 551 | } |
505 | case identities_SidebarMode: { | 552 | case identities_SidebarMode: { |
@@ -616,6 +663,15 @@ iBool setMode_SidebarWidget(iSidebarWidget *d, enum iSidebarMode mode) { | |||
616 | updateItemHeight_SidebarWidget_(d); | 663 | updateItemHeight_SidebarWidget_(d); |
617 | /* Restore previous scroll position. */ | 664 | /* Restore previous scroll position. */ |
618 | setScrollPos_ListWidget(list_SidebarWidget_(d), d->modeScroll[mode]); | 665 | setScrollPos_ListWidget(list_SidebarWidget_(d), d->modeScroll[mode]); |
666 | /* Title of the mobile sliding sheet. */ | ||
667 | iLabelWidget *sheetTitle = findChild_Widget(&d->widget, "sidebar.title"); | ||
668 | if (sheetTitle) { | ||
669 | iString title; | ||
670 | initCStr_String(&title, normalModeLabels_[d->mode]); | ||
671 | removeIconPrefix_String(&title); | ||
672 | setText_LabelWidget(sheetTitle, &title); | ||
673 | deinit_String(&title); | ||
674 | } | ||
619 | return iTrue; | 675 | return iTrue; |
620 | } | 676 | } |
621 | 677 | ||
@@ -646,22 +702,6 @@ const iIntSet *closedFolders_SidebarWidget(const iSidebarWidget *d) { | |||
646 | return d ? d->closedFolders : collect_IntSet(new_IntSet()); | 702 | return d ? d->closedFolders : collect_IntSet(new_IntSet()); |
647 | } | 703 | } |
648 | 704 | ||
649 | static const char *normalModeLabels_[max_SidebarMode] = { | ||
650 | book_Icon " ${sidebar.bookmarks}", | ||
651 | star_Icon " ${sidebar.feeds}", | ||
652 | clock_Icon " ${sidebar.history}", | ||
653 | person_Icon " ${sidebar.identities}", | ||
654 | page_Icon " ${sidebar.outline}", | ||
655 | }; | ||
656 | |||
657 | static const char *tightModeLabels_[max_SidebarMode] = { | ||
658 | book_Icon, | ||
659 | star_Icon, | ||
660 | clock_Icon, | ||
661 | person_Icon, | ||
662 | page_Icon, | ||
663 | }; | ||
664 | |||
665 | const char *icon_SidebarMode(enum iSidebarMode mode) { | 705 | const char *icon_SidebarMode(enum iSidebarMode mode) { |
666 | return tightModeLabels_[mode]; | 706 | return tightModeLabels_[mode]; |
667 | } | 707 | } |
@@ -726,13 +766,21 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) { | |||
726 | /* On a phone, the right sidebar is not used. */ | 766 | /* On a phone, the right sidebar is not used. */ |
727 | const iBool isPhone = (deviceType_App() == phone_AppDeviceType); | 767 | const iBool isPhone = (deviceType_App() == phone_AppDeviceType); |
728 | if (isPhone) { | 768 | if (isPhone) { |
729 | iLabelWidget *closeButton = | 769 | iLabelWidget *sheetTitle = |
730 | addChildFlags_Widget(vdiv, | 770 | addChildFlags_Widget(vdiv, |
731 | iClob(new_LabelWidget("${sidebar.close}", "sidebar.toggle")), | 771 | iClob(new_LabelWidget("", NULL)), |
732 | collapse_WidgetFlag | alignRight_WidgetFlag | | 772 | collapse_WidgetFlag | |
733 | extraPadding_WidgetFlag | frameless_WidgetFlag); | 773 | extraPadding_WidgetFlag | frameless_WidgetFlag); |
774 | setBackgroundColor_Widget(as_Widget(sheetTitle), uiBackground_ColorId); | ||
775 | iLabelWidget *closeButton = addChildFlags_Widget(as_Widget(sheetTitle), | ||
776 | iClob(new_LabelWidget(uiTextAction_ColorEscape "${sidebar.close}", "sidebar.toggle")), | ||
777 | extraPadding_WidgetFlag | frameless_WidgetFlag | | ||
778 | alignRight_WidgetFlag | moveToParentRightEdge_WidgetFlag); | ||
779 | as_Widget(sheetTitle)->flags2 |= slidingSheetDraggable_WidgetFlag2; /* phone */ | ||
734 | as_Widget(closeButton)->flags2 |= slidingSheetDraggable_WidgetFlag2; /* phone */ | 780 | as_Widget(closeButton)->flags2 |= slidingSheetDraggable_WidgetFlag2; /* phone */ |
781 | setId_Widget(as_Widget(sheetTitle), "sidebar.title"); | ||
735 | setId_Widget(as_Widget(closeButton), "sidebar.close"); | 782 | setId_Widget(as_Widget(closeButton), "sidebar.close"); |
783 | setFont_LabelWidget(sheetTitle, uiLabelBig_FontId); | ||
736 | setFont_LabelWidget(closeButton, uiLabelBigBold_FontId); | 784 | setFont_LabelWidget(closeButton, uiLabelBigBold_FontId); |
737 | } | 785 | } |
738 | iWidget *buttons = new_Widget(); | 786 | iWidget *buttons = new_Widget(); |
@@ -781,7 +829,14 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) { | |||
781 | resizeWidthOfChildren_WidgetFlag), // | | 829 | resizeWidthOfChildren_WidgetFlag), // | |
782 | // drawBackgroundToHorizontalSafeArea_WidgetFlag), | 830 | // drawBackgroundToHorizontalSafeArea_WidgetFlag), |
783 | "actions"); | 831 | "actions"); |
784 | setBackgroundColor_Widget(d->actions, uiBackgroundSidebar_ColorId); | 832 | if (deviceType_App() != desktop_AppDeviceType) { |
833 | setFlags_Widget(findChild_Widget(w, "sidebar.title"), borderTop_WidgetFlag, iTrue); | ||
834 | setFlags_Widget(d->actions, drawBackgroundToBottom_WidgetFlag, iTrue); | ||
835 | setBackgroundColor_Widget(d->actions, uiBackground_ColorId); | ||
836 | } | ||
837 | else { | ||
838 | setBackgroundColor_Widget(d->actions, uiBackgroundSidebar_ColorId); | ||
839 | } | ||
785 | d->contextItem = NULL; | 840 | d->contextItem = NULL; |
786 | d->contextIndex = iInvalidPos; | 841 | d->contextIndex = iInvalidPos; |
787 | d->blank = new_Widget(); | 842 | d->blank = new_Widget(); |
@@ -1488,6 +1543,15 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
1488 | return iTrue; | 1543 | return iTrue; |
1489 | } | 1544 | } |
1490 | else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { | 1545 | else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { |
1546 | if (argLabel_Command(cmd, "confirm")) { | ||
1547 | /* This is used on mobile. */ | ||
1548 | iWidget *menu = makeMenu_Widget(w->root->widget, (iMenuItem[]){ | ||
1549 | check_Icon " " uiTextCaution_ColorEscape "${feeds.markallread}", 0, 0, | ||
1550 | "feeds.markallread" | ||
1551 | }, 1); | ||
1552 | openMenu_Widget(menu, topLeft_Rect(bounds_Widget(d->actions))); | ||
1553 | return iTrue; | ||
1554 | } | ||
1491 | iConstForEach(PtrArray, i, listEntries_Feeds()) { | 1555 | iConstForEach(PtrArray, i, listEntries_Feeds()) { |
1492 | const iFeedEntry *entry = i.ptr; | 1556 | const iFeedEntry *entry = i.ptr; |
1493 | const iString *url = url_FeedEntry(entry); | 1557 | const iString *url = url_FeedEntry(entry); |