From 5cf5d4b4c44eda22cadb8bd9ab413fbfa487f0fe Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 7 Jan 2023 06:32:53 +0300 Subject: [PATCH] Improved opening main menu from top left corner. Fixed #17423. --- .../SourceFiles/dialogs/dialogs_widget.cpp | 35 ++++++++++++++----- Telegram/SourceFiles/dialogs/dialogs_widget.h | 6 +++- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 393e9c04d..2f1be2d1b 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -188,7 +188,12 @@ Widget::Widget( + st::defaultDialogRow.photoSize + st::defaultDialogRow.padding.left()) , _searchControls(this) -, _mainMenuToggle(_searchControls, st::dialogsMenuToggle) +, _mainMenu({ + .toggle = object_ptr( + _searchControls, + st::dialogsMenuToggle), + .under = object_ptr(_searchControls), +}) , _searchForNarrowFilters(_searchControls, st::dialogsSearchForNarrowFilters) , _filter(_searchControls, st::dialogsFilter, tr::lng_dlg_filter()) , _chooseFromUser( @@ -431,7 +436,7 @@ Widget::Widget( ) | rpl::filter((rpl::mappers::_1 == 0.) || (rpl::mappers::_1 == 1.) ) | rpl::start_with_next([=](float64 shown) { const auto color = (shown > 0.) ? &st::dialogsRippleBg : nullptr; - _mainMenuToggle->setRippleColorOverride(color); + _mainMenu.toggle->setRippleColorOverride(color); _searchForNarrowFilters->setRippleColorOverride(color); }, lifetime()); @@ -670,13 +675,18 @@ void Widget::setupSupportMode() { } void Widget::setupMainMenuToggle() { - _mainMenuToggle->setClickedCallback([=] { showMainMenu(); }); + _mainMenu.under->setClickedCallback([=] { + _mainMenu.toggle->clicked({}, Qt::LeftButton); + }); + _mainMenu.under->stackUnder(_mainMenu.toggle); + _mainMenu.toggle->setClickedCallback([=] { showMainMenu(); }); rpl::single(rpl::empty) | rpl::then( controller()->filtersMenuChanged() ) | rpl::start_with_next([=] { const auto filtersHidden = !controller()->filtersWidth(); - _mainMenuToggle->setVisible(filtersHidden); + _mainMenu.toggle->setVisible(filtersHidden); + _mainMenu.under->setVisible(filtersHidden); _searchForNarrowFilters->setVisible(!filtersHidden); updateControlsGeometry(); }, lifetime()); @@ -688,8 +698,8 @@ void Widget::setupMainMenuToggle() { : !state.allMuted ? &st::dialogsMenuToggleUnread : &st::dialogsMenuToggleUnreadMuted; - _mainMenuToggle->setIconOverride(icon, icon); - }, _mainMenuToggle->lifetime()); + _mainMenu.toggle->setIconOverride(icon, icon); + }, _mainMenu.toggle->lifetime()); } void Widget::setupShortcuts() { @@ -2374,7 +2384,7 @@ void Widget::updateControlsGeometry() { auto filterLeft = (controller()->filtersWidth() ? st::dialogsFilterSkip - : (st::dialogsFilterPadding.x() + _mainMenuToggle->width())) + : (st::dialogsFilterPadding.x() + _mainMenu.toggle->width())) + st::dialogsFilterPadding.x(); auto filterRight = (session().domain().local().hasLocalPasscode() ? (st::dialogsFilterPadding.x() + _lockUnlock->width()) @@ -2394,9 +2404,16 @@ void Widget::updateControlsGeometry() { _filter->setGeometryToLeft(filterLeft, filterTop, filterWidth, _filter->height()); auto mainMenuLeft = anim::interpolate( st::dialogsFilterPadding.x(), - (_narrowWidth - _mainMenuToggle->width()) / 2, + (_narrowWidth - _mainMenu.toggle->width()) / 2, narrowRatio); - _mainMenuToggle->moveToLeft(mainMenuLeft, st::dialogsFilterPadding.y()); + _mainMenu.toggle->moveToLeft(mainMenuLeft, st::dialogsFilterPadding.y()); + _mainMenu.under->setGeometry( + 0, + 0, + filterLeft, + _mainMenu.toggle->y() + + _mainMenu.toggle->height() + + st::dialogsFilterPadding.y()); const auto searchLeft = anim::interpolate( -_searchForNarrowFilters->width(), (_narrowWidth - _searchForNarrowFilters->width()) / 2, diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index b085c4f98..b33dce8fd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -33,6 +33,7 @@ class ContactStatus; } // namespace HistoryView namespace Ui { +class AbstractButton; class IconButton; class PopupMenu; class DropdownMenu; @@ -222,7 +223,10 @@ private: int _narrowWidth = 0; object_ptr _searchControls; object_ptr _subsectionTopBar = { nullptr } ; - object_ptr _mainMenuToggle; + struct { + object_ptr toggle; + object_ptr under; + } _mainMenu; object_ptr _searchForNarrowFilters; object_ptr _filter; object_ptr> _chooseFromUser;