diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index dd98ff312..14902a9ee 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -1428,9 +1428,13 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { const auto send = crl::guard(this, [=](Api::SendOptions options) { chosen(index, document, options); }); + + // In case we're adding items after FillSendMenu we have + // to pass nullptr for showForEffect and attach selector later. + // Otherwise added items widths won't be respected in menu geometry. SendMenu::FillSendMenu( _menu.get(), - _show, + nullptr, // showForEffect details, SendMenu::DefaultCallback(_show, send)); @@ -1464,6 +1468,12 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { .isAttention = true, }); } + + SendMenu::AttachSendMenuEffect( + _menu.get(), + _show, + details, + SendMenu::DefaultCallback(_show, send)); } if (_menu->empty()) { _menu = nullptr; diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index c04823295..72865ea01 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -402,9 +402,13 @@ base::unique_qptr GifsListWidget::fillContextMenu( // inline results don't have effects copyDetails.effectAllowed = false; } + + // In case we're adding items after FillSendMenu we have + // to pass nullptr for showForEffect and attach selector later. + // Otherwise added items widths won't be respected in menu geometry. SendMenu::FillSendMenu( menu, - _show, + nullptr, // showForMenu copyDetails, SendMenu::DefaultCallback(_show, send), icons); @@ -441,6 +445,13 @@ base::unique_qptr GifsListWidget::fillContextMenu( AddGifAction(std::move(callback), _show, document, icons); } } + + SendMenu::AttachSendMenuEffect( + menu, + _show, + copyDetails, + SendMenu::DefaultCallback(_show, send)); + return menu; } diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index c3af5e262..8eb165894 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -1780,9 +1780,13 @@ base::unique_qptr StickersListWidget::fillContextMenu( }); }); const auto icons = &st().icons; + + // In case we're adding items after FillSendMenu we have + // to pass nullptr for showForEffect and attach selector later. + // Otherwise added items widths won't be respected in menu geometry. SendMenu::FillSendMenu( menu, - _show, + nullptr, // showForEffect details, SendMenu::DefaultCallback(_show, send), icons); @@ -1816,6 +1820,13 @@ base::unique_qptr StickersListWidget::fillContextMenu( false); }, &icons->menuRecentRemove); } + + SendMenu::AttachSendMenuEffect( + menu, + _show, + details, + SendMenu::DefaultCallback(_show, send)); + return menu; } diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp index 3caba7536..6f1ae7916 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp @@ -346,11 +346,16 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { const auto send = crl::guard(this, [=](Api::SendOptions options) { selectInlineResult(selected, options, false); }); + const auto show = _controller->uiShow(); + + // In case we're adding items after FillSendMenu we have + // to pass nullptr for showForEffect and attach selector later. + // Otherwise added items widths won't be respected in menu geometry. SendMenu::FillSendMenu( _menu, - _controller->uiShow(), + nullptr, // showForEffect details, - SendMenu::DefaultCallback(_controller->uiShow(), send)); + SendMenu::DefaultCallback(show, send)); const auto item = _mosaic.itemAt(_selected); if (const auto previewDocument = item->getPreviewDocument()) { @@ -366,6 +371,12 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { previewDocument); } + SendMenu::AttachSendMenuEffect( + _menu, + show, + details, + SendMenu::DefaultCallback(show, send)); + if (!_menu->empty()) { _menu->popup(QCursor::pos()); } diff --git a/Telegram/SourceFiles/menu/menu_send.cpp b/Telegram/SourceFiles/menu/menu_send.cpp index 3cf7a94df..fdc0ec07c 100644 --- a/Telegram/SourceFiles/menu/menu_send.cpp +++ b/Telegram/SourceFiles/menu/menu_send.cpp @@ -609,6 +609,67 @@ Fn DefaultCallback( }; } +FillMenuResult AttachSendMenuEffect( + not_null menu, + std::shared_ptr show, + Details details, + Fn action, + std::optional desiredPositionOverride) { + Expects(show != nullptr); + + using namespace HistoryView::Reactions; + const auto effect = std::make_shared>(); + const auto position = desiredPositionOverride.value_or(QCursor::pos()); + const auto selector = (show && details.effectAllowed) + ? AttachSelectorToMenu( + menu, + position, + st::reactPanelEmojiPan, + show, + LookupPossibleEffects(&show->session()), + { tr::lng_effect_add_title(tr::now) }, + nullptr, // iconFactory + [=] { return (*effect) != nullptr; }) // paused + : base::make_unexpected(AttachSelectorResult::Skipped); + if (!selector) { + if (selector.error() == AttachSelectorResult::Failed) { + return FillMenuResult::Failed; + } + menu->prepareGeometryFor(position); + return FillMenuResult::Prepared; + } + + (*selector)->chosen( + ) | rpl::start_with_next([=](ChosenReaction chosen) { + const auto &reactions = show->session().data().reactions(); + const auto &effects = reactions.list(Data::Reactions::Type::Effects); + const auto i = ranges::find(effects, chosen.id, &Data::Reaction::id); + if (i != end(effects)) { + if (const auto strong = effect->data()) { + strong->hideAnimated(); + } + const auto weak = Ui::MakeWeak(menu); + const auto done = [=] { + delete effect->data(); + if (const auto strong = weak.data()) { + strong->hideMenu(true); + } + }; + *effect = Ui::CreateChild( + menu, + show, + details, + menu->mapFromGlobal(chosen.globalGeometry.center()), + *i, + action, + crl::guard(menu, done)); + (*effect)->show(); + } + }, menu->lifetime()); + + return FillMenuResult::Prepared; +} + FillMenuResult FillSendMenu( not_null menu, std::shared_ptr showForEffect, @@ -691,57 +752,14 @@ FillMenuResult FillSendMenu( &icons.menuPrice); } - using namespace HistoryView::Reactions; - const auto effect = std::make_shared>(); - const auto position = desiredPositionOverride.value_or(QCursor::pos()); - const auto selector = (showForEffect && details.effectAllowed) - ? AttachSelectorToMenu( + return showForEffect + ? AttachSendMenuEffect( menu, - position, - st::reactPanelEmojiPan, showForEffect, - LookupPossibleEffects(&showForEffect->session()), - { tr::lng_effect_add_title(tr::now) }, - nullptr, // iconFactory - [=] { return (*effect) != nullptr; }) // paused - : base::make_unexpected(AttachSelectorResult::Skipped); - if (!selector) { - if (selector.error() == AttachSelectorResult::Failed) { - return FillMenuResult::Failed; - } - menu->prepareGeometryFor(position); - return FillMenuResult::Prepared; - } - - (*selector)->chosen( - ) | rpl::start_with_next([=](ChosenReaction chosen) { - const auto &reactions = showForEffect->session().data().reactions(); - const auto &effects = reactions.list(Data::Reactions::Type::Effects); - const auto i = ranges::find(effects, chosen.id, &Data::Reaction::id); - if (i != end(effects)) { - if (const auto strong = effect->data()) { - strong->hideAnimated(); - } - const auto weak = Ui::MakeWeak(menu); - const auto done = [=] { - delete effect->data(); - if (const auto strong = weak.data()) { - strong->hideMenu(true); - } - }; - *effect = Ui::CreateChild( - menu, - showForEffect, - details, - menu->mapFromGlobal(chosen.globalGeometry.center()), - *i, - action, - crl::guard(menu, done)); - (*effect)->show(); - } - }, menu->lifetime()); - - return FillMenuResult::Prepared; + details, + action, + desiredPositionOverride) + : FillMenuResult::Prepared; } void SetupMenuAndShortcuts( diff --git a/Telegram/SourceFiles/menu/menu_send.h b/Telegram/SourceFiles/menu/menu_send.h index 5c3a99bae..a361dc116 100644 --- a/Telegram/SourceFiles/menu/menu_send.h +++ b/Telegram/SourceFiles/menu/menu_send.h @@ -90,6 +90,13 @@ FillMenuResult FillSendMenu( const style::ComposeIcons *iconsOverride = nullptr, std::optional desiredPositionOverride = std::nullopt); +FillMenuResult AttachSendMenuEffect( + not_null menu, + std::shared_ptr show, + Details details, + Fn action, + std::optional desiredPositionOverride = std::nullopt); + void SetupMenuAndShortcuts( not_null button, std::shared_ptr show,