Moved menu toggle from top to action button in profile top bar.

This commit is contained in:
23rd
2025-10-24 12:15:44 +03:00
parent 0b26dbbc9e
commit 3e69f65d1c
7 changed files with 55 additions and 85 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

+1
View File
@@ -1679,6 +1679,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_action_short_join" = "Join";
"lng_profile_action_short_report" = "Report";
"lng_profile_action_short_leave" = "Leave";
"lng_profile_action_short_more" = "More";
"lng_media_type_photos" = "Photos";
"lng_media_type_gifs" = "GIFs";
+3 -10
View File
@@ -394,16 +394,6 @@ infoTopBarBlackClose: IconButton(infoTopBarClose) {
iconOver: icon {{ "info/info_close", windowBoldFg }};
ripple: universalRippleAnimation;
}
infoTopBarBlackMenu: IconButton(infoTopBarMenu) {
icon: icon {{ "title_menu_dots", windowBoldFg }};
iconOver: icon {{ "title_menu_dots", windowBoldFg }};
ripple: universalRippleAnimation;
}
infoLayerTopBarBlackMenu: IconButton(infoLayerTopBarMenu) {
icon: icon {{ "title_menu_dots", windowBoldFg }};
iconOver: icon {{ "title_menu_dots", windowBoldFg }};
ripple: universalRippleAnimation;
}
infoTopBarBlackEdit: IconButton(infoTopBarEdit) {
icon: icon {{ "menu/edit", windowBoldFg }};
iconOver: icon {{ "menu/edit", windowBoldFg }};
@@ -451,6 +441,8 @@ infoProfileTopBarStep1: infoProfileTopBarStep2 - infoProfileTopBarActionButtonsH
infoProfileTopBarNoActionsHeightMax: infoProfileTopBarHeightMax - infoProfileTopBarActionButtonSize;
infoProfileTopBarActionMenuSkip: 10px;
infoProfileTopBarActionMessage: icon{{ "profile/message-22x22", windowBoldFg }};
infoProfileTopBarActionMute: icon{{ "profile/mute-22x22", windowBoldFg }};
infoProfileTopBarActionUnmute: icon{{ "profile/unmute-22x22", windowBoldFg }};
@@ -459,6 +451,7 @@ infoProfileTopBarActionGift: icon{{ "profile/gift-22x22", windowBoldFg }};
infoProfileTopBarActionJoin: icon{{ "profile/join-22x22", windowBoldFg }};
infoProfileTopBarActionReport: icon{{ "profile/report-22x22", windowBoldFg }};
infoProfileTopBarActionLeave: icon{{ "profile/leave-22x22", windowBoldFg }};
infoProfileTopBarActionMore: icon{{ "profile/profile_more", windowBoldFg }};
infoMinimalWidth: 324px;
infoDesiredWidth: 392px;
@@ -647,6 +647,26 @@ void TopBar::setupActions(not_null<Controller*> controller) {
_actions->add(leaveButton);
buttons.push_back(leaveButton);
}
if ([&]() -> bool {
if (controller->wrap() == Wrap::Side) {
return false;
}
const auto guard = gsl::finally([&] { _peerMenu = nullptr; });
showTopBarMenu(controller, true);
return _peerMenu;
}()) {
const auto navigation = controller->parentController();
const auto moreButton = Ui::CreateChild<TopBarActionButton>(
this,
tr::lng_profile_action_short_more(tr::now),
st::infoProfileTopBarActionMore);
moreButton->setClickedCallback([=] {
showTopBarMenu(controller, false);
});
_actionMore = moreButton;
_actions->add(moreButton);
buttons.push_back(moreButton);
}
_edgeColor.value() | rpl::map(mapped) | rpl::start_with_next([=](
TopBarActionButtonStyle st) {
for (const auto &button : buttons) {
@@ -864,8 +884,8 @@ void TopBar::updateLabelsPosition() {
if (_close) {
rightButtonsWidth += _close->width();
}
if (_topBarMenuToggle) {
rightButtonsWidth += _topBarMenuToggle->width();
if (_topBarButton) {
rightButtonsWidth += _topBarButton->width();
}
const auto reservedRight = anim::interpolate(
@@ -1178,67 +1198,18 @@ void TopBar::setupButtons(
}
if (wrap != Wrap::Side) {
if (source == Source::Profile) {
addTopBarMenuButton(controller, wrap, shouldUseColored);
} else if (source == Source::Stories) {
if (source == Source::Stories) {
addTopBarEditButton(controller, wrap, shouldUseColored);
}
}
}, lifetime());
}
void TopBar::addTopBarMenuButton(
not_null<Controller*> controller,
Wrap wrap,
bool shouldUseColored) {
{
const auto guard = gsl::finally([&] { _topBarMenu = nullptr; });
showTopBarMenu(controller, true);
if (!_topBarMenu) {
return;
}
}
_topBarMenuToggle = base::make_unique_q<Ui::IconButton>(
this,
((wrap == Wrap::Layer)
? (shouldUseColored
? st::infoLayerTopBarColoredMenu
: st::infoLayerTopBarBlackMenu)
: (shouldUseColored
? st::infoTopBarColoredMenu
: st::infoTopBarBlackMenu)));
_topBarMenuToggle->show();
_topBarMenuToggle->addClickHandler([=] {
showTopBarMenu(controller, false);
});
widthValue() | rpl::start_with_next([=] {
if (_close) {
_topBarMenuToggle->moveToRight(_close->width(), 0);
} else {
_topBarMenuToggle->moveToRight(0, 0);
}
}, _topBarMenuToggle->lifetime());
Shortcuts::Requests(
) | rpl::filter([=] {
return (controller->section().type() == Section::Type::Profile);
}) | rpl::start_with_next([=](not_null<Shortcuts::Request*> request) {
using Command = Shortcuts::Command;
request->check(Command::ShowChatMenu, 1) && request->handle([=] {
Window::ActivateWindow(controller->parentController());
showTopBarMenu(controller, false);
return true;
});
}, _topBarMenuToggle->lifetime());
}
void TopBar::addTopBarEditButton(
not_null<Controller*> controller,
Wrap wrap,
bool shouldUseColored) {
_topBarMenuToggle = base::make_unique_q<Ui::IconButton>(
_topBarButton = base::make_unique_q<Ui::IconButton>(
this,
((wrap == Wrap::Layer)
? (shouldUseColored
@@ -1247,51 +1218,54 @@ void TopBar::addTopBarEditButton(
: (shouldUseColored
? st::infoTopBarColoredEdit
: st::infoTopBarBlackEdit)));
_topBarMenuToggle->show();
_topBarMenuToggle->addClickHandler([=] {
_topBarButton->show();
_topBarButton->addClickHandler([=] {
controller->showSettings(::Settings::Information::Id());
});
widthValue() | rpl::start_with_next([=] {
if (_close) {
_topBarMenuToggle->moveToRight(_close->width(), 0);
_topBarButton->moveToRight(_close->width(), 0);
} else {
_topBarMenuToggle->moveToRight(0, 0);
_topBarButton->moveToRight(0, 0);
}
}, _topBarMenuToggle->lifetime());
}, _topBarButton->lifetime());
}
void TopBar::showTopBarMenu(
not_null<Controller*> controller,
bool check) {
if (_topBarMenu) {
_topBarMenu->hideMenu(true);
if (_peerMenu) {
_peerMenu->hideMenu(true);
return;
}
_topBarMenu = base::make_unique_q<Ui::PopupMenu>(
_peerMenu = base::make_unique_q<Ui::PopupMenu>(
QWidget::window(),
st::popupMenuExpandedSeparator);
_topBarMenu->setDestroyedCallback([this] {
InvokeQueued(this, [this] { _topBarMenu = nullptr; });
if (auto toggle = _topBarMenuToggle.get()) {
toggle->setForceRippled(false);
}
_peerMenu->setDestroyedCallback([this] {
InvokeQueued(this, [this] { _peerMenu = nullptr; });
// if (auto toggle = _topBarMenuToggle.get()) {
// toggle->setForceRippled(false);
// }
});
fillTopBarMenu(
controller,
Ui::Menu::CreateAddActionCallback(_topBarMenu));
if (_topBarMenu->empty()) {
_topBarMenu = nullptr;
Ui::Menu::CreateAddActionCallback(_peerMenu));
if (_peerMenu->empty()) {
_peerMenu = nullptr;
return;
} else if (check) {
return;
}
_topBarMenu->setForcedOrigin(Ui::PanelAnimation::Origin::TopRight);
_topBarMenuToggle->setForceRippled(true);
_topBarMenu->popup(_topBarMenuToggle->mapToGlobal(
st::infoLayerTopBarMenuPosition));
_peerMenu->setForcedOrigin(Ui::PanelAnimation::Origin::TopRight);
_peerMenu->popup(_actionMore
? _actionMore->mapToGlobal(
QPoint(
_actionMore->width(),
_actionMore->height() + st::infoProfileTopBarActionMenuSkip))
: QCursor::pos());
}
void TopBar::fillTopBarMenu(
@@ -226,8 +226,10 @@ private:
base::unique_qptr<Ui::IconButton> _close;
base::unique_qptr<Ui::FadeWrap<Ui::IconButton>> _back;
base::unique_qptr<Ui::IconButton> _topBarMenuToggle;
base::unique_qptr<Ui::PopupMenu> _topBarMenu;
base::unique_qptr<Ui::IconButton> _topBarButton;
base::unique_qptr<Ui::PopupMenu> _peerMenu;
Ui::RpWidget *_actionMore = nullptr;
base::unique_qptr<Ui::AbstractButton> _userpicButton;