diff --git a/Telegram/Resources/icons/dialogs_menu.png b/Telegram/Resources/icons/dialogs_menu.png index 9e3833ce6..bc7231d99 100644 Binary files a/Telegram/Resources/icons/dialogs_menu.png and b/Telegram/Resources/icons/dialogs_menu.png differ diff --git a/Telegram/Resources/icons/dialogs_menu@2x.png b/Telegram/Resources/icons/dialogs_menu@2x.png index a5beed83c..e96e6885b 100644 Binary files a/Telegram/Resources/icons/dialogs_menu@2x.png and b/Telegram/Resources/icons/dialogs_menu@2x.png differ diff --git a/Telegram/Resources/icons/dialogs_menu@3x.png b/Telegram/Resources/icons/dialogs_menu@3x.png index 8fb50d158..c5bcbf1d9 100644 Binary files a/Telegram/Resources/icons/dialogs_menu@3x.png and b/Telegram/Resources/icons/dialogs_menu@3x.png differ diff --git a/Telegram/Resources/icons/dialogs_menu_unread.png b/Telegram/Resources/icons/dialogs_menu_unread.png new file mode 100644 index 000000000..436ee7d52 Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread.png differ 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 000000000..9be9f4f30 Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread@2x.png differ diff --git a/Telegram/Resources/icons/dialogs_menu_unread@3x.png b/Telegram/Resources/icons/dialogs_menu_unread@3x.png new file mode 100644 index 000000000..2c58e2c98 Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread@3x.png differ diff --git a/Telegram/Resources/icons/dialogs_menu_unread_dot.png b/Telegram/Resources/icons/dialogs_menu_unread_dot.png new file mode 100644 index 000000000..171bc4802 Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread_dot.png differ 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 000000000..c1182f2ce Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread_dot@2x.png differ 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 000000000..9a33ddf96 Binary files /dev/null and b/Telegram/Resources/icons/dialogs_menu_unread_dot@3x.png differ 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