From 409389a994f71c4f12a2fd85e350180ae855a511 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Jan 2025 10:38:14 +0400 Subject: [PATCH] Add gift menu with Share and Transfer. --- .../SourceFiles/boxes/gift_premium_box.cpp | 7 ++- Telegram/SourceFiles/boxes/star_gift_box.cpp | 49 ++++++++++++++++--- Telegram/SourceFiles/boxes/star_gift_box.h | 5 +- .../settings/settings_credits_graphics.cpp | 47 +++++++++++++++++- Telegram/SourceFiles/ui/effects/credits.style | 10 ++++ 5 files changed, 107 insertions(+), 11 deletions(-) diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.cpp b/Telegram/SourceFiles/boxes/gift_premium_box.cpp index 2b396aec4..3b9cc1ecb 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.cpp +++ b/Telegram/SourceFiles/boxes/gift_premium_box.cpp @@ -1206,7 +1206,7 @@ void AddStarGiftTable( const auto selfBareId = session->userPeerId().value; const auto giftToSelf = (peerId == session->userPeerId()) && (entry.in || entry.bareGiftOwnerId == selfBareId); - if (unique) { + if (unique && entry.bareGiftOwnerId) { const auto ownerId = PeerId(entry.bareGiftOwnerId); const auto transfer = entry.in && entry.bareMsgId @@ -1223,6 +1223,11 @@ void AddStarGiftTable( tr::lng_gift_unique_owner(), MakePeerTableValue(table, controller, ownerId, send, handler), st::giveawayGiftCodePeerMargin); + } else if (unique) { + AddTableRow( + table, + tr::lng_gift_unique_owner(), + rpl::single(TextWithEntities{ unique->ownerName })); } else if (peerId) { if (!giftToSelf) { const auto user = session->data().peer(peerId)->asUser(); diff --git a/Telegram/SourceFiles/boxes/star_gift_box.cpp b/Telegram/SourceFiles/boxes/star_gift_box.cpp index 2ba9fddc2..4bd18d4ba 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_box.cpp @@ -70,6 +70,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/fields/input_field.h" #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" +#include "ui/widgets/popup_menu.h" #include "ui/widgets/shadow.h" #include "window/themes/window_theme.h" #include "window/section_widget.h" @@ -82,6 +83,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_menu_icons.h" #include "styles/style_premium.h" #include "styles/style_settings.h" +#include "styles/style_widgets.h" #include @@ -2494,19 +2496,50 @@ void ShowStarGiftUpgradeBox(StarGiftUpgradeArgs &&args) { }).send(); } -void AddUniqueCloseButton(not_null box) { - const auto button = Ui::CreateChild( +void AddUniqueCloseButton( + not_null box, + Fn)> fillMenu) { + const auto close = Ui::CreateChild( box, st::uniqueCloseButton); - button->show(); - button->raise(); + const auto menu = fillMenu + ? Ui::CreateChild(box, st::uniqueMenuButton) + : nullptr; + close->show(); + close->raise(); + if (menu) { + menu->show(); + menu->raise(); + } box->widthValue() | rpl::start_with_next([=](int width) { - button->moveToRight(0, 0, width); - button->raise(); - }, button->lifetime()); - button->setClickedCallback([=] { + close->moveToRight(0, 0, width); + close->raise(); + if (menu) { + menu->moveToRight(close->width(), 0, width); + menu->raise(); + } + }, close->lifetime()); + close->setClickedCallback([=] { box->closeBox(); }); + if (menu) { + const auto state = menu->lifetime().make_state< + base::unique_qptr + >(); + menu->setClickedCallback([=] { + if (*state) { + *state = nullptr; + return; + } + *state = base::make_unique_q( + menu, + st::popupMenuWithIcons); + fillMenu(state->get()); + if (!(*state)->empty()) { + (*state)->popup(QCursor::pos()); + } + }); + } } void RequestStarsFormAndSubmit( diff --git a/Telegram/SourceFiles/boxes/star_gift_box.h b/Telegram/SourceFiles/boxes/star_gift_box.h index bacb3997d..5a06bfc35 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.h +++ b/Telegram/SourceFiles/boxes/star_gift_box.h @@ -27,6 +27,7 @@ class CustomEmoji; namespace Ui { +class PopupMenu; class GenericBox; class VerticalLayout; @@ -73,7 +74,9 @@ struct StarGiftUpgradeArgs { }; void ShowStarGiftUpgradeBox(StarGiftUpgradeArgs &&args); -void AddUniqueCloseButton(not_null box); +void AddUniqueCloseButton( + not_null box, + Fn)> fillMenu = nullptr); void RequestStarsFormAndSubmit( not_null window, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 98ada1547..fa9396c54 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -12,10 +12,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_earn.h" #include "api/api_premium.h" #include "apiwrap.h" +#include "base/random.h" #include "base/timer_rpl.h" #include "base/unixtime.h" #include "boxes/gift_premium_box.h" +#include "boxes/share_box.h" #include "boxes/star_gift_box.h" +#include "boxes/transfer_gift_box.h" #include "chat_helpers/stickers_gift_box_pack.h" #include "chat_helpers/stickers_lottie.h" #include "core/application.h" @@ -73,6 +76,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/buttons.h" #include "ui/widgets/discrete_sliders.h" #include "ui/widgets/fields/number_input.h" +#include "ui/widgets/popup_menu.h" #include "ui/widgets/label_with_custom_emoji.h" #include "ui/widgets/labels.h" #include "ui/widgets/tooltip.h" @@ -88,6 +92,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_giveaway.h" #include "styles/style_info.h" #include "styles/style_layers.h" +#include "styles/style_menu_icons.h" #include "styles/style_premium.h" #include "styles/style_settings.h" #include "styles/style_statistics.h" @@ -825,6 +830,44 @@ void ProcessReceivedSubscriptions( } } +void FillUniqueGiftMenu( + not_null controller, + not_null menu, + const Data::CreditsHistoryEntry &e) { + Expects(e.uniqueGift != nullptr); + + const auto unique = e.uniqueGift; + const auto show = controller->uiShow(); + const auto weak = base::make_weak(controller); + const auto local = u"nft/"_q + unique->slug; + const auto url = controller->session().createInternalLinkFull(local); + menu->addAction(tr::lng_context_copy_link(tr::now), [=] { + TextUtilities::SetClipboardText({ url }); + if (const auto strong = weak.get()) { + strong->showToast( + tr::lng_channel_public_link_copied(tr::now)); + } + }, &st::menuIconLink); + + menu->addAction(tr::lng_chat_link_share(tr::now), [=] { + if (const auto strong = weak.get()) { + FastShareLink(strong, url); + } + }, &st::menuIconShare); + + const auto messageId = MsgId(e.bareMsgId); + const auto transfer = e.in + && messageId + && (unique->starsForTransfer >= 0); + if (transfer) { + menu->addAction(tr::lng_gift_transfer_button(tr::now), [=] { + if (const auto strong = weak.get()) { + ShowTransferGiftBox(strong, unique, messageId); + } + }, &st::menuIconReplace); + } +} + void ReceiptCreditsBox( not_null box, not_null controller, @@ -892,7 +935,9 @@ void ReceiptCreditsBox( AddSkip(content, st::defaultVerticalListSkip * 2); - AddUniqueCloseButton(box); + AddUniqueCloseButton(box, [=](not_null menu) { + FillUniqueGiftMenu(controller, menu, e); + }); } else if (const auto callback = Ui::PaintPreviewCallback(session, e)) { const auto thumb = content->add(object_ptr>( content, diff --git a/Telegram/SourceFiles/ui/effects/credits.style b/Telegram/SourceFiles/ui/effects/credits.style index d8390fe12..2fde78ee2 100644 --- a/Telegram/SourceFiles/ui/effects/credits.style +++ b/Telegram/SourceFiles/ui/effects/credits.style @@ -196,6 +196,16 @@ uniqueCloseButton: IconButton(boxTitleClose) { color: shadowFg; } } +uniqueMenuButton: IconButton(uniqueCloseButton) { + width: 40px; + rippleAreaPosition: point(0px, 4px); + + icon: icon {{ "title_menu_dots", videoPlayIconFg }}; + iconOver: icon {{ "title_menu_dots", videoPlayIconFg }}; + ripple: RippleAnimation(defaultRippleAnimation) { + color: shadowFg; + } +} upgradeGiftBox: Box(giftBox) { buttonPadding: margins(22px, 3px, 22px, 22px); }