From 9a186cd8ce0fbf3fb2a0c00298df21e855c0a512 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Jul 2020 09:41:51 +0400 Subject: [PATCH] Indicate other accounts unread messages. --- Telegram/Resources/icons/dialogs_menu.png | Bin 110 -> 128 bytes Telegram/Resources/icons/dialogs_menu@2x.png | Bin 148 -> 247 bytes Telegram/Resources/icons/dialogs_menu@3x.png | Bin 190 -> 350 bytes .../Resources/icons/dialogs_menu_unread.png | Bin 0 -> 146 bytes .../icons/dialogs_menu_unread@2x.png | Bin 0 -> 289 bytes .../icons/dialogs_menu_unread@3x.png | Bin 0 -> 386 bytes .../icons/dialogs_menu_unread_dot.png | Bin 0 -> 170 bytes .../icons/dialogs_menu_unread_dot@2x.png | Bin 0 -> 362 bytes .../icons/dialogs_menu_unread_dot@3x.png | Bin 0 -> 488 bytes Telegram/SourceFiles/dialogs/dialogs.style | 11 +++- .../SourceFiles/dialogs/dialogs_widget.cpp | 40 +++++++++---- Telegram/SourceFiles/dialogs/dialogs_widget.h | 1 + Telegram/SourceFiles/window/window.style | 8 +++ .../window/window_filters_menu.cpp | 15 +++++ .../SourceFiles/window/window_filters_menu.h | 1 + .../SourceFiles/window/window_main_menu.cpp | 55 +++++++++++------- .../SourceFiles/window/window_main_menu.h | 8 +++ 17 files changed, 107 insertions(+), 32 deletions(-) create mode 100644 Telegram/Resources/icons/dialogs_menu_unread.png create mode 100644 Telegram/Resources/icons/dialogs_menu_unread@2x.png create mode 100644 Telegram/Resources/icons/dialogs_menu_unread@3x.png create mode 100644 Telegram/Resources/icons/dialogs_menu_unread_dot.png create mode 100644 Telegram/Resources/icons/dialogs_menu_unread_dot@2x.png create mode 100644 Telegram/Resources/icons/dialogs_menu_unread_dot@3x.png diff --git a/Telegram/Resources/icons/dialogs_menu.png b/Telegram/Resources/icons/dialogs_menu.png index 9e3833ce66df193d19a01ef3667d3b1cfa951b41..bc7231d99183e790b0269cd081ca370762532105 100644 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzcTX3`kcif|Qw_No6nKslJ^H^t z<|CsOr|g-v<|b1vuxUscTeZLEP-tLaIujlF^_hp7W!YQl58@gNg|tA3fr;aTCBp`W YYYDvea(*=lKqDDEUHx3vIVCg!0IWeK00000 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=si%u$h(+()iwAib3^)!uu$TUy zdRVA3fRTAlfX)Gy^^mdK II;Vst0OZ3V1poj5 diff --git a/Telegram/Resources/icons/dialogs_menu@2x.png b/Telegram/Resources/icons/dialogs_menu@2x.png index a5beed83c6b38c4cc230047e65aca2bb49a8f790..e96e6885bf48ed3408b7726a23565901ede0ee9b 100644 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=`#fD7Ln`LHo$1JRL_y%du}%N~ zZ}Q$Bz~yPUv)iyjqU7wEdCfch?Ed&NvhZoJ3Ro-g;ikx^4ag-R(Zu_ z+eVfD;niq3z__%Y5lOKL=f1p8hFl5-4w*tCNQO;*@LElNF#{9(6g5XA<#;WVG5*Z{ Y;Vp0dk&H#6K%X#py85}Sb4q9e0G?+{j{pDw literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dE(Vi}jArY-_uPX8#Fc4sN-2LkR z{u;-ljNG$4tThTs74jyXJUDMZa~aPP5WM%^u=rZ}4YQN1;wBTa?j#*^IOT9kbs^7^ g7$G17h3SyRXzR=CZ>hq09B2)Lr>mdKI;Vst0Gx9(Pyhe` diff --git a/Telegram/Resources/icons/dialogs_menu@3x.png b/Telegram/Resources/icons/dialogs_menu@3x.png index 8fb50d158247cddeef663516ce38fef1a7c18c42..c5bcbf1d9e2b500dfa70b90f2802b210ecad1f3c 100644 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U{v*VaSW-L^Y*qQSF-_w>%kkp z?|a!!KPtT=qr&t|L-b0!6OV$o8y+(~QM2dQGzLS)B&H)Q9h?Hf3Th5M4Ks)r@a5d_ z{`Zb`*(+byEt6dK$M)~PgW9*Yy?yTgl%oq|oSEu@LYe$3_Wn7~EuZe&C)jP-gl<*w zm&2!J{<5FB$Snl4{fx}t36@oXeGAYWaYiP$ua3X?OB2YM#_skheQ{HiHAr+VvIo7A ad-PMI{*~SfY;pmH8-u5-pUXO@geCw+(RDch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1SGf4^HT*y85}Sb4q9e0A6!Ni2wiq diff --git a/Telegram/Resources/icons/dialogs_menu_unread.png b/Telegram/Resources/icons/dialogs_menu_unread.png new file mode 100644 index 0000000000000000000000000000000000000000..436ee7d52c1ce8e295fda6ffe8992bd8307e6bfb GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJNKY5Xkcif|R}Hxi81Og;T7LPr z{o_xWJ}4FP#t4=IQF^vd$@?2>_X}H6Z{1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/dialogs_menu_unread@2x.png b/Telegram/Resources/icons/dialogs_menu_unread@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9be9f4f30d23e3d91b62c62ed75106255b6a8617 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=FFaiwLn`LHoq3SA*+ArI-Kup5 z9dr&oO6(80Q=NI`%g#g7EEeVSc*I{=m35`J^3Kmk`aBE;9Z3ug&LYeVGK(Y_9ta#| zU})E1W3X^BWH_MM#mK-H2vTAso6xiI%Zt6&_q{)T+oxV+uS$6Fy!71L+e*6DGaPuR zd;P9`U-D0x|J=x?oWJ>Se?*Jj!mVbd_ukHD0NJpElL^V1yry{bpT;2bAE|K=VD$8KaSW-L^Y(UNRp#B_wEgHu3QLCwLZ zVFvL6wyFmz=LN5QY;kN`ZgT8(P31Y^>mze-m;Kypw`<;~x&z;X%@_avYnQkEc1ZX$ zo{qht4Yl{xcXZv4`^RI^_xSn$`q=B=Etr2;r=wf@?Pt&W`K1!ySENSj{r9m(xa-(O xLnI!=*~WeU*dM1khHeA^(dIfaEuh=pDE3*!Wf72lr}crh^T5I=C{!Ml!*)N5zTPVw!o4l}%c z<`rW{2S3B+TjlSiC6fP~x=_kw9BuymR_3)cS@Z3b895vnm;@RaSQHvIGcc&xubAF{ TgF~tqXgPzYtDnm{r-UW|CeA&Q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/dialogs_menu_unread_dot@2x.png b/Telegram/Resources/icons/dialogs_menu_unread_dot@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1182f2cee3bb28d62cc40c92c954977721912a4 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU^Mh}aSW-L^LCmeSF?eDt9tBf zMw^7br-65#GtEBS(sq}gS^fN|HJ8H!23JN7nFSgQ zjm#pf3Iz>|7+ClML>dk-dTnNO;t)&TGG)@!IsJ#v|DAPz_u+fD41F)}(>eW*d;fFe zsjsuN9XKAAd}N*f@#b;X4#POTeGfMGb596b#rI(I^!$*O7r6dylx|yis_eFz^zn}+ zZnqU059?klT`RYKX0F}=oAdSab6+Xn_-mH2_rKt;I^ml6-`DCruaT*HcU^1#pXcRX zt#KF4Ja9U&i%G!3A&`NIT?3CVuqgT>d*IBy=Esu@Wv;z@2@FF9Pgg&ebxsLQ0KBY? ASO5S3 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/dialogs_menu_unread_dot@3x.png b/Telegram/Resources/icons/dialogs_menu_unread_dot@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a33ddf96e3ed275cb694abc868971b3b606b4c4 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|jF%;uumf=j|=WtV0eG4i7W0 zpER^_yK_ddX#1T5(H+ZYaPKIc{AT%|Ne!*rq?BzIzHgR4qUJpFx`^-}56!D8XO>5w zH)1%$V8DEUhryUI<3szLVyQO8sX>=4`mT3g{}}h@P3Wr6wPm|wZRPsE&a+VKySt;F zZO7bouU|ba+PV8@w}sg`!voxE|7Km!`Ipf%{`j_XIZA%T0`I9tlMQ*E#nvsn9rPhZoH|DF>U!} z&d9?In-4#1So`t)d&X%W-FW2WUH2UPVerm(9gDpC{)0z0&rOub(p=j2xMFUF?0ehK zcb+f*=qK^)c)$$C1hxiAhBOBHGa9A@{bIWGCoa!t{-*7~7-aBt^>bP0l+XkKL^i=Y literal 0 HcmV?d00001 diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index c7b1f3da4..8ec8e0fff 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -101,7 +101,7 @@ dialogsMenuToggle: IconButton { icon: icon {{ "dialogs_menu", dialogsMenuIconFg }}; iconOver: icon {{ "dialogs_menu", dialogsMenuIconFgOver }}; - iconPosition: point(10px, 10px); + iconPosition: point(-1px, -1px); rippleAreaPosition: point(0px, 0px); rippleAreaSize: 40px; @@ -109,6 +109,15 @@ dialogsMenuToggle: IconButton { color: windowBgOver; } } +dialogsMenuToggleUnread: icon { + { "dialogs_menu_unread", dialogsMenuIconFg }, + { "dialogs_menu_unread_dot", dialogsUnreadBg }, +}; +dialogsMenuToggleUnreadMuted: icon { + { "dialogs_menu_unread", dialogsMenuIconFg }, + { "dialogs_menu_unread_dot", dialogsMenuIconFg }, +}; + dialogsLock: IconButton(dialogsMenuToggle) { icon: icon {{ "dialogs_lock", dialogsMenuIconFg }}; iconOver: icon {{ "dialogs_lock", dialogsMenuIconFgOver }}; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 57d3102c4..3e89c13f5 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "window/window_slide_animation.h" #include "window/window_connecting_widget.h" +#include "window/window_main_menu.h" #include "storage/storage_media_prepare.h" #include "storage/storage_account.h" #include "data/data_session.h" @@ -274,17 +275,9 @@ Widget::Widget( Core::App().lockByPasscode(); _lockUnlock->setIconOverride(nullptr); }); - rpl::single( - rpl::empty_value() - ) | rpl::then( - controller->filtersMenuChanged() - ) | rpl::start_with_next([=] { - const auto filtersHidden = !controller->filtersWidth(); - _mainMenuToggle->setVisible(filtersHidden); - _searchForNarrowFilters->setVisible(!filtersHidden); - updateControlsGeometry(); - }, lifetime()); - _mainMenuToggle->setClickedCallback([=] { showMainMenu(); }); + + setupMainMenuToggle(); + _searchForNarrowFilters->setClickedCallback([=] { Ui::showChatsList(&session()); }); _chooseByDragTimer.setSingleShot(true); @@ -426,6 +419,31 @@ void Widget::setupSupportMode() { ) | rpl::to_empty); } +void Widget::setupMainMenuToggle() { + _mainMenuToggle->setClickedCallback([=] { showMainMenu(); }); + + rpl::single( + rpl::empty_value() + ) | rpl::then( + controller()->filtersMenuChanged() + ) | rpl::start_with_next([=] { + const auto filtersHidden = !controller()->filtersWidth(); + _mainMenuToggle->setVisible(filtersHidden); + _searchForNarrowFilters->setVisible(!filtersHidden); + updateControlsGeometry(); + }, lifetime()); + + Window::OtherAccountsUnreadState( + ) | rpl::start_with_next([=](const Window::OthersUnreadState &state) { + const auto icon = !state.count + ? nullptr + : !state.allMuted + ? &st::dialogsMenuToggleUnread + : &st::dialogsMenuToggleUnreadMuted; + _mainMenuToggle->setIconOverride(icon, icon); + }, _mainMenuToggle->lifetime()); +} + void Widget::fullSearchRefreshOn(rpl::producer<> events) { std::move( events diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index d8bbc48ba..f50b5b9e2 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -139,6 +139,7 @@ private: void setupSupportMode(); void setupConnectingWidget(); + void setupMainMenuToggle(); bool searchForPeersRequired(const QString &query) const; void setSearchInChat(Key chat, UserData *from = nullptr); void showJumpToDate(); diff --git a/Telegram/SourceFiles/window/window.style b/Telegram/SourceFiles/window/window.style index 0b1d8fe0a..36ee49616 100644 --- a/Telegram/SourceFiles/window/window.style +++ b/Telegram/SourceFiles/window/window.style @@ -285,6 +285,14 @@ windowFiltersMainMenu: SideBarButton(windowFiltersButton) { iconPosition: point(-1px, -1px); minHeight: 54px; } +windowFiltersMainMenuUnread: icon { + { "dialogs_menu_unread", sideBarIconFg }, + { "dialogs_menu_unread_dot", sideBarBadgeBg }, +}; +windowFiltersMainMenuUnreadMuted: icon { + { "dialogs_menu_unread", sideBarIconFg }, + { "dialogs_menu_unread_dot", sideBarBadgeBgMuted }, +}; windowFilterSmallItem: PeerListItem(defaultPeerListItem) { height: 44px; photoPosition: point(15px, 5px); diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index e485d7101..a2a863965 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwindow.h" #include "window/window_session_controller.h" #include "window/window_controller.h" +#include "window/window_main_menu.h" #include "main/main_session.h" #include "data/data_session.h" #include "data/data_chat_filters.h" @@ -75,6 +76,8 @@ FiltersMenu::FiltersMenu( FiltersMenu::~FiltersMenu() = default; void FiltersMenu::setup() { + setupMainMenuIcon(); + _outer.setAttribute(Qt::WA_OpaquePaintEvent); _outer.show(); _outer.paintRequest( @@ -134,6 +137,18 @@ void FiltersMenu::setup() { }); } +void FiltersMenu::setupMainMenuIcon() { + OtherAccountsUnreadState( + ) | rpl::start_with_next([=](const OthersUnreadState &state) { + const auto icon = !state.count + ? nullptr + : !state.allMuted + ? &st::windowFiltersMainMenuUnread + : &st::windowFiltersMainMenuUnreadMuted; + _menu.setIconOverride(icon, icon); + }, _outer.lifetime()); +} + void FiltersMenu::scrollToButton(not_null widget) { const auto globalPosition = widget->mapToGlobal(QPoint(0, 0)); const auto localTop = _scroll.mapFromGlobal(globalPosition).y(); diff --git a/Telegram/SourceFiles/window/window_filters_menu.h b/Telegram/SourceFiles/window/window_filters_menu.h index 347aac0a9..113a3a25f 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.h +++ b/Telegram/SourceFiles/window/window_filters_menu.h @@ -46,6 +46,7 @@ private: FilterId id, const QString &title, Ui::FilterIcon icon); + void setupMainMenuIcon(); void showMenu(QPoint position, FilterId id); void showEditBox(FilterId id); void showRemoveBox(FilterId id); diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 1485e5512..28be35d9c 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -433,27 +433,13 @@ void MainMenu::ToggleAccountsButton::validateUnreadBadge() { } QString MainMenu::ToggleAccountsButton::computeUnreadBadge() const { - const auto active = &Core::App().activeAccount(); - auto allMuted = true; - for (const auto &[index, account] : Core::App().domain().accounts()) { - if (account.get() == active) { - continue; - } else if (const auto session = account->maybeSession()) { - if (!session->data().unreadBadgeMuted()) { - allMuted = false; - break; - } - } - } - if (allMuted) { - return QString(); - } - const auto count = Core::App().unreadBadge() - - active->session().data().unreadBadge(); - return (count > 99) + const auto state = OtherAccountsUnreadStateCurrent(); + return state.allMuted + ? QString() + : (state.count > 99) ? u"99+"_q - : (count > 0) - ? QString::number(count) + : (state.count > 0) + ? QString::number(state.count) : QString(); } @@ -1135,4 +1121,33 @@ void MainMenu::initResetScaleButton() { }, lifetime()); } +OthersUnreadState OtherAccountsUnreadStateCurrent() { + auto &app = Core::App(); + const auto active = &app.activeAccount(); + auto allMuted = true; + for (const auto &[index, account] : app.domain().accounts()) { + if (account.get() == active) { + continue; + } else if (const auto session = account->maybeSession()) { + if (!session->data().unreadBadgeMuted()) { + allMuted = false; + break; + } + } + } + return { + .count = (app.unreadBadge() - active->session().data().unreadBadge()), + .allMuted = allMuted, + }; +} + +rpl::producer OtherAccountsUnreadState() { + return rpl::single( + rpl::empty_value() + ) | rpl::then( + Core::App().unreadBadgeChanges() + ) | rpl::map(OtherAccountsUnreadStateCurrent); +} + + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_main_menu.h b/Telegram/SourceFiles/window/window_main_menu.h index 661364ab2..af8df5bbd 100644 --- a/Telegram/SourceFiles/window/window_main_menu.h +++ b/Telegram/SourceFiles/window/window_main_menu.h @@ -99,4 +99,12 @@ private: }; +struct OthersUnreadState { + int count = 0; + bool allMuted = false; +}; + +[[nodiscard]] OthersUnreadState OtherAccountsUnreadStateCurrent(); +[[nodiscard]] rpl::producer OtherAccountsUnreadState(); + } // namespace Window