summaryrefslogtreecommitdiff
path: root/src/ui/sidebarwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/sidebarwidget.c')
-rw-r--r--src/ui/sidebarwidget.c91
1 files changed, 56 insertions, 35 deletions
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 27646b22..c0a22e99 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -523,15 +523,17 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
523 addChild_Widget(div, iClob(makePadding_Widget(gap_UI))); 523 addChild_Widget(div, iClob(makePadding_Widget(gap_UI)));
524 addChild_Widget(div, iClob(new_LabelWidget("${menu.identity.import}", "ident.import"))); 524 addChild_Widget(div, iClob(new_LabelWidget("${menu.identity.import}", "ident.import")));
525 addChildFlags_Widget(div, iClob(new_Widget()), expand_WidgetFlag); /* pad */ 525 addChildFlags_Widget(div, iClob(new_Widget()), expand_WidgetFlag); /* pad */
526 iLabelWidget *linkLabel;
526 setBackgroundColor_Widget( 527 setBackgroundColor_Widget(
527 addChildFlags_Widget( 528 addChildFlags_Widget(
528 div, 529 div,
529 iClob(new_LabelWidget(format_CStr(cstr_Lang("ident.gotohelp"), 530 iClob(linkLabel = new_LabelWidget(format_CStr(cstr_Lang("ident.gotohelp"),
530 uiTextStrong_ColorEscape, 531 uiTextStrong_ColorEscape,
531 restore_ColorEscape), 532 restore_ColorEscape),
532 "!open newtab:1 gotoheading:1.6 url:about:help")), 533 "!open newtab:1 gotoheading:1.6 url:about:help")),
533 frameless_WidgetFlag | fixedHeight_WidgetFlag | wrapText_WidgetFlag), 534 frameless_WidgetFlag | fixedHeight_WidgetFlag),
534 uiBackgroundSidebar_ColorId); 535 uiBackgroundSidebar_ColorId);
536 setWrap_LabelWidget(linkLabel, iTrue);
535 addChild_Widget(d->blank, iClob(div)); 537 addChild_Widget(d->blank, iClob(div));
536 } 538 }
537// arrange_Widget(d->blank); 539// arrange_Widget(d->blank);
@@ -625,13 +627,14 @@ static void updateMetrics_SidebarWidget_(iSidebarWidget *d) {
625void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) { 627void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
626 iWidget *w = as_Widget(d); 628 iWidget *w = as_Widget(d);
627 init_Widget(w); 629 init_Widget(w);
628 setId_Widget(w, side == left_SideBarSide ? "sidebar" : "sidebar2"); 630 setId_Widget(w, side == left_SidebarSide ? "sidebar" : "sidebar2");
629 initCopy_String(&d->cmdPrefix, id_Widget(w)); 631 initCopy_String(&d->cmdPrefix, id_Widget(w));
630 appendChar_String(&d->cmdPrefix, '.'); 632 appendChar_String(&d->cmdPrefix, '.');
631 setBackgroundColor_Widget(w, none_ColorId); 633 setBackgroundColor_Widget(w, none_ColorId);
632 setFlags_Widget(w, 634 setFlags_Widget(w,
633 collapse_WidgetFlag | hidden_WidgetFlag | arrangeHorizontal_WidgetFlag | 635 collapse_WidgetFlag | hidden_WidgetFlag | arrangeHorizontal_WidgetFlag |
634 resizeWidthOfChildren_WidgetFlag, 636 resizeWidthOfChildren_WidgetFlag | noFadeBackground_WidgetFlag |
637 noShadowBorder_WidgetFlag,
635 iTrue); 638 iTrue);
636 iZap(d->modeScroll); 639 iZap(d->modeScroll);
637 d->side = side; 640 d->side = side;
@@ -659,7 +662,7 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
659 d->actions = NULL; 662 d->actions = NULL;
660 /* On a phone, the right sidebar is used exclusively for Identities. */ 663 /* On a phone, the right sidebar is used exclusively for Identities. */
661 const iBool isPhone = deviceType_App() == phone_AppDeviceType; 664 const iBool isPhone = deviceType_App() == phone_AppDeviceType;
662 if (!isPhone || d->side == left_SideBarSide) { 665 if (!isPhone || d->side == left_SidebarSide) {
663 iWidget *buttons = new_Widget(); 666 iWidget *buttons = new_Widget();
664 setId_Widget(buttons, "buttons"); 667 setId_Widget(buttons, "buttons");
665 for (int i = 0; i < max_SidebarMode; i++) { 668 for (int i = 0; i < max_SidebarMode; i++) {
@@ -678,8 +681,8 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
678 iClob(buttons), 681 iClob(buttons),
679 arrangeHorizontal_WidgetFlag | 682 arrangeHorizontal_WidgetFlag |
680 resizeWidthOfChildren_WidgetFlag | 683 resizeWidthOfChildren_WidgetFlag |
681 arrangeHeight_WidgetFlag | resizeToParentWidth_WidgetFlag | 684 arrangeHeight_WidgetFlag | resizeToParentWidth_WidgetFlag); // |
682 drawBackgroundToHorizontalSafeArea_WidgetFlag); 685// drawBackgroundToHorizontalSafeArea_WidgetFlag);
683 setBackgroundColor_Widget(buttons, uiBackgroundSidebar_ColorId); 686 setBackgroundColor_Widget(buttons, uiBackgroundSidebar_ColorId);
684 } 687 }
685 else { 688 else {
@@ -700,13 +703,13 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
700 setPadding_Widget(as_Widget(d->list), 0, gap_UI, 0, gap_UI); 703 setPadding_Widget(as_Widget(d->list), 0, gap_UI, 0, gap_UI);
701 addChildFlags_Widget(listAndActions, 704 addChildFlags_Widget(listAndActions,
702 iClob(d->list), 705 iClob(d->list),
703 expand_WidgetFlag | drawBackgroundToHorizontalSafeArea_WidgetFlag); 706 expand_WidgetFlag); // | drawBackgroundToHorizontalSafeArea_WidgetFlag);
704 setId_Widget(addChildPosFlags_Widget(listAndActions, 707 setId_Widget(addChildPosFlags_Widget(listAndActions,
705 iClob(d->actions = new_Widget()), 708 iClob(d->actions = new_Widget()),
706 isPhone ? front_WidgetAddPos : back_WidgetAddPos, 709 isPhone ? front_WidgetAddPos : back_WidgetAddPos,
707 arrangeHorizontal_WidgetFlag | arrangeHeight_WidgetFlag | 710 arrangeHorizontal_WidgetFlag | arrangeHeight_WidgetFlag |
708 resizeWidthOfChildren_WidgetFlag | 711 resizeWidthOfChildren_WidgetFlag), // |
709 drawBackgroundToHorizontalSafeArea_WidgetFlag), 712// drawBackgroundToHorizontalSafeArea_WidgetFlag),
710 "actions"); 713 "actions");
711 setBackgroundColor_Widget(d->actions, uiBackgroundSidebar_ColorId); 714 setBackgroundColor_Widget(d->actions, uiBackgroundSidebar_ColorId);
712 d->contextItem = NULL; 715 d->contextItem = NULL;
@@ -715,24 +718,24 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
715 addChildFlags_Widget(content, iClob(d->blank), resizeChildren_WidgetFlag); 718 addChildFlags_Widget(content, iClob(d->blank), resizeChildren_WidgetFlag);
716 addChildFlags_Widget(vdiv, iClob(content), expand_WidgetFlag); 719 addChildFlags_Widget(vdiv, iClob(content), expand_WidgetFlag);
717 setMode_SidebarWidget(d, 720 setMode_SidebarWidget(d,
718 deviceType_App() == phone_AppDeviceType && d->side == right_SideBarSide ? 721 deviceType_App() == phone_AppDeviceType && d->side == right_SidebarSide ?
719 identities_SidebarMode : bookmarks_SidebarMode); 722 identities_SidebarMode : bookmarks_SidebarMode);
720 d->resizer = 723 d->resizer =
721 addChildFlags_Widget(w, 724 addChildFlags_Widget(w,
722 iClob(new_Widget()), 725 iClob(new_Widget()),
723 hover_WidgetFlag | commandOnClick_WidgetFlag | fixedWidth_WidgetFlag | 726 hover_WidgetFlag | commandOnClick_WidgetFlag | fixedWidth_WidgetFlag |
724 resizeToParentHeight_WidgetFlag | 727 resizeToParentHeight_WidgetFlag |
725 (side == left_SideBarSide ? moveToParentRightEdge_WidgetFlag 728 (side == left_SidebarSide ? moveToParentRightEdge_WidgetFlag
726 : moveToParentLeftEdge_WidgetFlag)); 729 : moveToParentLeftEdge_WidgetFlag));
727 if (deviceType_App() == phone_AppDeviceType) { 730 if (deviceType_App() == phone_AppDeviceType) {
728 setFlags_Widget(d->resizer, hidden_WidgetFlag | disabled_WidgetFlag, iTrue); 731 setFlags_Widget(d->resizer, hidden_WidgetFlag | disabled_WidgetFlag, iTrue);
729 } 732 }
730 setId_Widget(d->resizer, side == left_SideBarSide ? "sidebar.grab" : "sidebar2.grab"); 733 setId_Widget(d->resizer, side == left_SidebarSide ? "sidebar.grab" : "sidebar2.grab");
731 setBackgroundColor_Widget(d->resizer, none_ColorId); 734 setBackgroundColor_Widget(d->resizer, none_ColorId);
732 d->menu = NULL; 735 d->menu = NULL;
733 addAction_Widget(w, SDLK_r, KMOD_PRIMARY | KMOD_SHIFT, "feeds.refresh"); 736 addAction_Widget(w, SDLK_r, KMOD_PRIMARY | KMOD_SHIFT, "feeds.refresh");
734 updateMetrics_SidebarWidget_(d); 737 updateMetrics_SidebarWidget_(d);
735 if (side == left_SideBarSide) { 738 if (side == left_SidebarSide) {
736 postCommand_App("~sidebar.update"); /* unread count */ 739 postCommand_App("~sidebar.update"); /* unread count */
737 } 740 }
738} 741}
@@ -773,6 +776,7 @@ static void itemClicked_SidebarWidget_(iSidebarWidget *d, iSidebarItem *item, si
773 const iGmHeading *head = constAt_Array(headings_GmDocument(doc), item->id); 776 const iGmHeading *head = constAt_Array(headings_GmDocument(doc), item->id);
774 postCommandf_App("document.goto loc:%p", head->text.start); 777 postCommandf_App("document.goto loc:%p", head->text.start);
775 dismissPortraitPhoneSidebars_Root(as_Widget(d)->root); 778 dismissPortraitPhoneSidebars_Root(as_Widget(d)->root);
779 setOpenedFromSidebar_DocumentWidget(document_App(), iTrue);
776 break; 780 break;
777 } 781 }
778 case feeds_SidebarMode: { 782 case feeds_SidebarMode: {
@@ -783,7 +787,7 @@ static void itemClicked_SidebarWidget_(iSidebarWidget *d, iSidebarItem *item, si
783 case bookmarks_SidebarMode: 787 case bookmarks_SidebarMode:
784 case history_SidebarMode: { 788 case history_SidebarMode: {
785 if (!isEmpty_String(&item->url)) { 789 if (!isEmpty_String(&item->url)) {
786 postCommandf_Root(get_Root(), "open newtab:%d url:%s", 790 postCommandf_Root(get_Root(), "open fromsidebar:1 newtab:%d url:%s",
787 openTabMode_Sym(modState_Keys()), 791 openTabMode_Sym(modState_Keys()),
788 cstr_String(&item->url)); 792 cstr_String(&item->url));
789 } 793 }
@@ -799,7 +803,7 @@ static void itemClicked_SidebarWidget_(iSidebarWidget *d, iSidebarItem *item, si
799 updateContextMenu_SidebarWidget_(d); 803 updateContextMenu_SidebarWidget_(d);
800 arrange_Widget(d->menu); 804 arrange_Widget(d->menu);
801 openMenu_Widget(d->menu, 805 openMenu_Widget(d->menu,
802 d->side == left_SideBarSide 806 d->side == left_SidebarSide
803 ? topRight_Rect(itemRect_ListWidget(d->list, itemIndex)) 807 ? topRight_Rect(itemRect_ListWidget(d->list, itemIndex))
804 : addX_I2(topLeft_Rect(itemRect_ListWidget(d->list, itemIndex)), 808 : addX_I2(topLeft_Rect(itemRect_ListWidget(d->list, itemIndex)),
805 -width_Widget(d->menu))); 809 -width_Widget(d->menu)));
@@ -857,7 +861,7 @@ void setWidth_SidebarWidget(iSidebarWidget *d, float widthAsGaps) {
857 if (!isFixedWidth) { 861 if (!isFixedWidth) {
858 /* Even less space if the other sidebar is visible, too. */ 862 /* Even less space if the other sidebar is visible, too. */
859 const int otherWidth = 863 const int otherWidth =
860 width_Widget(findWidget_App(d->side == left_SideBarSide ? "sidebar2" : "sidebar")); 864 width_Widget(findWidget_App(d->side == left_SidebarSide ? "sidebar2" : "sidebar"));
861 width = iClamp(width, 30 * gap_UI, size_Root(w->root).x - 50 * gap_UI - otherWidth); 865 width = iClamp(width, 30 * gap_UI, size_Root(w->root).x - 50 * gap_UI - otherWidth);
862 } 866 }
863 d->widthAsGaps = (float) width / (float) gap_UI; 867 d->widthAsGaps = (float) width / (float) gap_UI;
@@ -938,33 +942,39 @@ static iBool handleSidebarCommand_SidebarWidget_(iSidebarWidget *d, const char *
938 } 942 }
939 const iBool isAnimated = prefs_App()->uiAnimations && 943 const iBool isAnimated = prefs_App()->uiAnimations &&
940 argLabel_Command(cmd, "noanim") == 0 && 944 argLabel_Command(cmd, "noanim") == 0 &&
941 (deviceType_App() != phone_AppDeviceType); 945 (d->side == left_SidebarSide || deviceType_App() != phone_AppDeviceType);
942 int visX = 0; 946 int visX = 0;
943 if (isVisible_Widget(w)) { 947 if (isVisible_Widget(w)) {
944 visX = left_Rect(bounds_Widget(w)) - left_Rect(w->root->widget->rect); 948 visX = left_Rect(bounds_Widget(w)) - left_Rect(w->root->widget->rect);
945 } 949 }
946 setFlags_Widget(w, hidden_WidgetFlag, isVisible_Widget(w)); 950 setFlags_Widget(w, hidden_WidgetFlag, isVisible_Widget(w));
951 /* Safe area inset for mobile. */
952 const int safePad = (d->side == left_SidebarSide ? left_Rect(safeRect_Root(w->root)) : 0);
947 if (isVisible_Widget(w)) { 953 if (isVisible_Widget(w)) {
948 setFlags_Widget(w, keepOnTop_WidgetFlag, iFalse); 954 setFlags_Widget(w, keepOnTop_WidgetFlag, iFalse);
949 w->rect.size.x = d->widthAsGaps * gap_UI; 955 w->rect.size.x = d->widthAsGaps * gap_UI;
950 invalidate_ListWidget(d->list); 956 invalidate_ListWidget(d->list);
951 if (isAnimated) { 957 if (isAnimated) {
952 setFlags_Widget(w, horizontalOffset_WidgetFlag, iTrue); 958 setFlags_Widget(w, horizontalOffset_WidgetFlag, iTrue);
953 setVisualOffset_Widget(w, (d->side == left_SideBarSide ? -1 : 1) * w->rect.size.x, 0, 0); 959 setVisualOffset_Widget(
960 w, (d->side == left_SidebarSide ? -1 : 1) * (w->rect.size.x + safePad), 0, 0);
954 setVisualOffset_Widget(w, 0, 300, easeOut_AnimFlag | softer_AnimFlag); 961 setVisualOffset_Widget(w, 0, 300, easeOut_AnimFlag | softer_AnimFlag);
955 } 962 }
956 } 963 }
957 else if (isAnimated) { 964 else if (isAnimated) {
958 setFlags_Widget(w, horizontalOffset_WidgetFlag, iTrue); 965 setFlags_Widget(w, horizontalOffset_WidgetFlag, iTrue);
959 if (d->side == right_SideBarSide) { 966 if (d->side == right_SidebarSide) {
960 setVisualOffset_Widget(w, visX, 0, 0); 967 setVisualOffset_Widget(w, visX, 0, 0);
961 setVisualOffset_Widget(w, visX + w->rect.size.x, 300, easeOut_AnimFlag | softer_AnimFlag); 968 setVisualOffset_Widget(
969 w, visX + w->rect.size.x + safePad, 300, easeOut_AnimFlag | softer_AnimFlag);
962 } 970 }
963 else { 971 else {
964 setFlags_Widget(w, keepOnTop_WidgetFlag, iTrue); 972 setFlags_Widget(w, keepOnTop_WidgetFlag, iTrue);
965 setVisualOffset_Widget(w, -w->rect.size.x, 300, easeOut_AnimFlag | softer_AnimFlag); 973 setVisualOffset_Widget(
974 w, -w->rect.size.x - safePad, 300, easeOut_AnimFlag | softer_AnimFlag);
966 } 975 }
967 } 976 }
977 updateToolbarColors_Root(w->root);
968 arrange_Widget(w->parent); 978 arrange_Widget(w->parent);
969 /* BUG: Rearranging because the arrange above didn't fully resolve the height. */ 979 /* BUG: Rearranging because the arrange above didn't fully resolve the height. */
970 arrange_Widget(w); 980 arrange_Widget(w);
@@ -984,11 +994,21 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
984 /* Handle commands. */ 994 /* Handle commands. */
985 if (isResize_UserEvent(ev)) { 995 if (isResize_UserEvent(ev)) {
986 checkModeButtonLayout_SidebarWidget_(d); 996 checkModeButtonLayout_SidebarWidget_(d);
987 if (deviceType_App() == phone_AppDeviceType && d->side == left_SideBarSide) { 997 if (deviceType_App() == phone_AppDeviceType && d->side == left_SidebarSide) {
998 setFlags_Widget(w, rightEdgeDraggable_WidgetFlag, isPortrait_App());
988 /* In landscape, visibility of the toolbar is controlled separately. */ 999 /* In landscape, visibility of the toolbar is controlled separately. */
989 if (isVisible_Widget(w)) { 1000 if (isVisible_Widget(w)) {
990 postCommand_Widget(w, "sidebar.toggle"); 1001 postCommand_Widget(w, "sidebar.toggle");
991 } 1002 }
1003 setFlags_Widget(findChild_Widget(w, "buttons"),
1004 drawBackgroundToHorizontalSafeArea_WidgetFlag,
1005 isLandscape_App());
1006 setFlags_Widget(findChild_Widget(w, "actions"),
1007 drawBackgroundToHorizontalSafeArea_WidgetFlag,
1008 isLandscape_App());
1009 setFlags_Widget(as_Widget(d->list),
1010 drawBackgroundToHorizontalSafeArea_WidgetFlag,
1011 isLandscape_App());
992 return iFalse; 1012 return iFalse;
993 } 1013 }
994 } 1014 }
@@ -1029,6 +1049,11 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
1029 postCommandf_App("sidebar.mode arg:%d toggle:1", identities_SidebarMode); 1049 postCommandf_App("sidebar.mode arg:%d toggle:1", identities_SidebarMode);
1030 return iTrue; 1050 return iTrue;
1031 } 1051 }
1052 else if (isPortraitPhone_App() && isVisible_Widget(w) && d->side == left_SidebarSide &&
1053 equal_Command(cmd, "swipe.forward")) {
1054 postCommand_App("sidebar.toggle");
1055 return iTrue;
1056 }
1032 else if (startsWith_CStr(cmd, cstr_String(&d->cmdPrefix))) { 1057 else if (startsWith_CStr(cmd, cstr_String(&d->cmdPrefix))) {
1033 if (handleSidebarCommand_SidebarWidget_(d, cmd + size_String(&d->cmdPrefix))) { 1058 if (handleSidebarCommand_SidebarWidget_(d, cmd + size_String(&d->cmdPrefix))) {
1034 return iTrue; 1059 return iTrue;
@@ -1059,7 +1084,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
1059 const int resMid = d->resizer->rect.size.x / 2; 1084 const int resMid = d->resizer->rect.size.x / 2;
1060 setWidth_SidebarWidget( 1085 setWidth_SidebarWidget(
1061 d, 1086 d,
1062 ((d->side == left_SideBarSide 1087 ((d->side == left_SidebarSide
1063 ? inner.x 1088 ? inner.x
1064 : (right_Rect(rect_Root(w->root)) - coord_Command(cmd).x)) + 1089 : (right_Rect(rect_Root(w->root)) - coord_Command(cmd).x)) +
1065 resMid) / (float) gap_UI); 1090 resMid) / (float) gap_UI);
@@ -1528,15 +1553,17 @@ static void draw_SidebarWidget_(const iSidebarWidget *d) {
1528 const iRect bounds = bounds_Widget(w); 1553 const iRect bounds = bounds_Widget(w);
1529 iPaint p; 1554 iPaint p;
1530 init_Paint(&p); 1555 init_Paint(&p);
1531 if (flags_Widget(w) & visualOffset_WidgetFlag && 1556 if (deviceType_App() != phone_AppDeviceType) {
1532 flags_Widget(w) & horizontalOffset_WidgetFlag && isVisible_Widget(w)) { 1557 if (flags_Widget(w) & visualOffset_WidgetFlag &&
1533 fillRect_Paint(&p, boundsWithoutVisualOffset_Widget(w), tmBackground_ColorId); 1558 flags_Widget(w) & horizontalOffset_WidgetFlag && isVisible_Widget(w)) {
1559 fillRect_Paint(&p, boundsWithoutVisualOffset_Widget(w), tmBackground_ColorId);
1560 }
1534 } 1561 }
1535 draw_Widget(w); 1562 draw_Widget(w);
1536 if (isVisible_Widget(w)) { 1563 if (isVisible_Widget(w)) {
1537 drawVLine_Paint( 1564 drawVLine_Paint(
1538 &p, 1565 &p,
1539 addX_I2(d->side == left_SideBarSide ? topRight_Rect(bounds) : topLeft_Rect(bounds), -1), 1566 addX_I2(d->side == left_SidebarSide ? topRight_Rect(bounds) : topLeft_Rect(bounds), -1),
1540 height_Rect(bounds), 1567 height_Rect(bounds),
1541 uiSeparator_ColorId); 1568 uiSeparator_ColorId);
1542 } 1569 }
@@ -1782,13 +1809,7 @@ static void draw_SidebarItem_(const iSidebarItem *d, iPaint *p, iRect itemRect,
1782 : uiTextFramelessHover_ColorId) 1809 : uiTextFramelessHover_ColorId)
1783 : uiTextDim_ColorId; 1810 : uiTextDim_ColorId;
1784 if (!d->listItem.isSelected && !isUsedOnDomain) { 1811 if (!d->listItem.isSelected && !isUsedOnDomain) {
1785 /* Draw an outline of the icon. */ 1812 drawOutline_Text(font, cPos, metaFg, none_ColorId, range_String(&icon));
1786 for (int off = 0; off < 4; ++off) {
1787 drawRange_Text(font,
1788 add_I2(cPos, init_I2(off % 2 == 0 ? -1 : 1, off / 2 == 0 ? -1 : 1)),
1789 metaFg,
1790 range_String(&icon));
1791 }
1792 } 1813 }
1793 drawRange_Text(font, 1814 drawRange_Text(font,
1794 cPos, 1815 cPos,