summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/sidebarwidget.c164
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
93static 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
101static const char *tightModeLabels_[max_SidebarMode] = {
102 book_Icon,
103 star_Icon,
104 clock_Icon,
105 person_Icon,
106 page_Icon,
107};
108
93struct Impl_SidebarWidget { 109struct 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
649static 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
657static const char *tightModeLabels_[max_SidebarMode] = {
658 book_Icon,
659 star_Icon,
660 clock_Icon,
661 person_Icon,
662 page_Icon,
663};
664
665const char *icon_SidebarMode(enum iSidebarMode mode) { 705const 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);