From 18ea990e7a5512245d3f313bb603cb3c97456dba Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 4 Apr 2026 17:43:32 +0300 Subject: [PATCH] Replaced panel animation with FadeWrap for media preview menus. --- .../view/history_view_reaction_preview.cpp | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_reaction_preview.cpp b/Telegram/SourceFiles/history/view/history_view_reaction_preview.cpp index 310d47c38e..32d1af5279 100644 --- a/Telegram/SourceFiles/history/view/history_view_reaction_preview.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reaction_preview.cpp @@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/dropdown_menu.h" #include "ui/widgets/labels.h" #include "ui/widgets/shadow.h" +#include "ui/wrap/fade_wrap.h" #include "ui/painter.h" #include "ui/rect.h" #include "ui/text/text_utilities.h" @@ -56,7 +57,7 @@ void SetupOverlayHideOnEscape( struct PreviewOverlayState { base::unique_qptr mediaPreview; base::unique_qptr clickable; - base::unique_qptr menu; + base::unique_qptr> menuWrap; base::unique_qptr background; base::unique_qptr label; Fn extraHide; @@ -64,7 +65,7 @@ struct PreviewOverlayState { void clear() { shutdownGuard.destroy(); - menu.reset(); + menuWrap.reset(); background.reset(); label.reset(); mediaPreview.reset(); @@ -131,18 +132,23 @@ void SetupPreviewMenu( const auto mainwidget = controller->widget()->bodyWidget(); if (fillMenu) { state->mediaPreview->setHideEmoji(true); - state->menu = base::make_unique_q( + auto menu = object_ptr( mainwidget, st::dropdownMenuWithIcons); - state->menu->setAutoHiding(false); - state->menu->setHiddenCallback( + menu->setAutoHiding(false); + menu->setHiddenCallback( crl::guard(state->clickable.get(), overlay.hideAll)); - fillMenu(state->menu.get()); + fillMenu(menu.data()); + state->menuWrap = base::make_unique_q>( + mainwidget, + std::move(menu)); + state->menuWrap->setDuration(st::defaultToggle.duration); + state->menuWrap->hide(anim::type::instant); } - const auto menuRaw = state->menu.get(); + const auto wrapRaw = state->menuWrap.get(); state->extraHide = [=] { - if (menuRaw) { - menuRaw->hideAnimated(); + if (wrapRaw) { + wrapRaw->hide(anim::type::normal); } }; @@ -150,7 +156,9 @@ void SetupPreviewMenu( mainwidget->sizeValue() | rpl::on_next([=](QSize size) { mediaPreviewRaw->setGeometry(Rect(size)); - if (menuRaw) { + if (wrapRaw) { + const auto menuRaw = wrapRaw->entity(); + menuRaw->showFast(); const auto gap = st::defaultMenu.itemPadding.top(); const auto menuH = menuRaw->height(); const auto shift = -(gap + menuH) / 2; @@ -158,9 +166,9 @@ void SetupPreviewMenu( const auto menuX = (size.width() - menuRaw->width()) / 2; const auto menuY = mediaPreviewRaw->contentBottom() + gap; - menuRaw->move(menuX, menuY); - menuRaw->showAnimated(Ui::PanelAnimation::Origin::TopLeft); - menuRaw->raise(); + wrapRaw->move(menuX, menuY); + wrapRaw->show(anim::type::normal); + wrapRaw->raise(); } }, mediaPreviewRaw->lifetime()); } @@ -309,7 +317,7 @@ void ShowWidgetPreview( struct State { base::unique_qptr preview; base::unique_qptr clickable; - base::unique_qptr menu; + base::unique_qptr> menuWrap; }; const auto state = std::make_shared(); const auto mainwidget = controller->widget()->bodyWidget(); @@ -326,28 +334,33 @@ void ShowWidgetPreview( const auto hideAll = [=] { state->clickable->setAttribute(Qt::WA_TransparentForMouseEvents); - if (state->menu) { - state->menu->hideAnimated(); + if (state->menuWrap) { + state->menuWrap->hide(anim::type::normal); } base::call_delayed( st::defaultToggle.duration, [s = state] { s->preview.reset(); - s->menu.reset(); + s->menuWrap.reset(); s->clickable.reset(); }); }; SetupOverlayHideOnEscape(state->clickable.get(), hideAll); - state->menu = base::make_unique_q( + auto menu = object_ptr( mainwidget, st::dropdownMenuWithIcons); - state->menu->setAutoHiding(false); - state->menu->setHiddenCallback( + menu->setAutoHiding(false); + menu->setHiddenCallback( crl::guard(state->clickable.get(), hideAll)); - fillMenu(state->menu.get()); + fillMenu(menu.data()); + state->menuWrap = base::make_unique_q>( + mainwidget, + std::move(menu)); + state->menuWrap->setDuration(st::defaultToggle.duration); + state->menuWrap->hide(anim::type::instant); - const auto menuRaw = state->menu.get(); + const auto wrapRaw = state->menuWrap.get(); state->clickable->show(); previewRaw->show(); @@ -363,17 +376,19 @@ void ShowWidgetPreview( state->clickable->setGeometry(Rect(size)); state->clickable->raise(); + const auto menuRaw = wrapRaw->entity(); + menuRaw->showFast(); const auto gap = st::defaultMenu.itemPadding.top(); const auto totalH = fullH + gap + menuRaw->height(); const auto previewY = (size.height() - totalH) / 2; previewRaw->move((size.width() - fullW) / 2, previewY); previewRaw->raise(); - menuRaw->move( + wrapRaw->move( (size.width() - menuRaw->width()) / 2, previewY + fullH + gap); - menuRaw->showAnimated(Ui::PanelAnimation::Origin::TopLeft); - menuRaw->raise(); + wrapRaw->show(anim::type::normal); + wrapRaw->raise(); }, previewRaw->lifetime()); }