diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index da7c33cd4..04dab8e1e 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2833,6 +2833,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_animated_emoji_many#one" = "This message contains emoji from **{count} pack**."; "lng_context_animated_emoji_many#other" = "This message contains emoji from **{count} packs**."; "lng_context_animated_reaction" = "This reaction is from **{name} pack**."; +"lng_context_animated_tag" = "This tag is from **{name} pack**."; "lng_context_animated_reactions" = "Reactions contain emoji from **{name} pack**."; "lng_context_animated_reactions_many#one" = "Reactions contain emoji from **{count} pack**."; "lng_context_animated_reactions_many#other" = "Reactions contain emoji from **{count} packs**."; diff --git a/Telegram/SourceFiles/chat_helpers/chat_helpers.style b/Telegram/SourceFiles/chat_helpers/chat_helpers.style index 4d3cbf5df..21f1ad3c3 100644 --- a/Telegram/SourceFiles/chat_helpers/chat_helpers.style +++ b/Telegram/SourceFiles/chat_helpers/chat_helpers.style @@ -1320,7 +1320,7 @@ editTagAbout: FlatLabel(defaultFlatLabel) { } editTagField: InputField(defaultInputField) { textBg: transparent; - textMargins: margins(24px, 10px, 32px, 0px); + textMargins: margins(24px, 10px, 32px, 2px); placeholderFg: placeholderFg; placeholderFgActive: placeholderFgActive; @@ -1328,7 +1328,7 @@ editTagField: InputField(defaultInputField) { placeholderMargins: margins(2px, 0px, 2px, 0px); placeholderScale: 0.; - heightMin: 32px; + heightMin: 36px; } editTagLimit: FlatLabel(defaultFlatLabel) { textFg: windowSubTextFg; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 3cb7f0dc8..3047c27e2 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/dialogs_widget.h" #include "dialogs/dialogs_search_from_controllers.h" #include "dialogs/dialogs_search_tags.h" +#include "history/view/history_view_context_menu.h" #include "history/history.h" #include "history/history_item.h" #include "core/application.h" @@ -3010,6 +3011,16 @@ void InnerWidget::searchInChat( update(0, searchInChatOffset(), width(), height); }, _searchTags->lifetime()); + _searchTags->menuRequests( + ) | rpl::start_with_next([=](Data::ReactionId id) { + HistoryView::ShowTagInListMenu( + &_menu, + _lastMousePosition.value_or(QCursor::pos()), + this, + id, + _controller); + }, _searchTags->lifetime()); + _searchTags->heightValue() | rpl::skip( 1 ) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp index ce3bcb927..a3d1264ff 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp @@ -132,11 +132,14 @@ void SearchTags::fill( _tags.clear(); _tags.reserve(list.size()); const auto link = [&](Data::ReactionId id) { - return std::make_shared(crl::guard(this, [=]( + return std::make_shared(crl::guard(this, [=]( ClickContext context) { if (!premium) { MakePromoLink()->onClick(context); return; + } else if (context.button == Qt::RightButton) { + _menuRequests.fire_copy(id); + return; } const auto i = ranges::find(_tags, id, &Tag::id); if (i != end(_tags)) { @@ -315,6 +318,10 @@ void SearchTags::paintCustomFrame( _customCache); } +rpl::producer SearchTags::menuRequests() const { + return _menuRequests.events(); +} + void SearchTags::paint( Painter &p, QPoint position, diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_tags.h b/Telegram/SourceFiles/dialogs/dialogs_search_tags.h index 489e23cd4..c8f8c0d41 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_tags.h +++ b/Telegram/SourceFiles/dialogs/dialogs_search_tags.h @@ -40,6 +40,8 @@ public: [[nodiscard]] auto selectedChanges() const -> rpl::producer>; + [[nodiscard]] rpl::producer menuRequests() const; + void paint( Painter &p, QPoint position, @@ -73,6 +75,7 @@ private: Ui::Text::String _additionalText; rpl::event_stream<> _selectedChanges; rpl::event_stream<> _repaintRequests; + rpl::event_stream _menuRequests; mutable QImage _normalBg; mutable QImage _selectedBg; mutable QImage _promoBg; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp index c26384f48..cc4463594 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "dialogs/dialogs_search_from_controllers.h" // SearchFromBox #include "dialogs/dialogs_search_tags.h" #include "dialogs/ui/dialogs_layout.h" +#include "history/view/history_view_context_menu.h" #include "history/history.h" #include "history/history_item.h" #include "lang/lang_keys.h" @@ -26,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" #include "ui/widgets/multi_select.h" +#include "ui/widgets/popup_menu.h" #include "ui/widgets/shadow.h" #include "ui/widgets/scroll_area.h" #include "ui/painter.h" @@ -297,6 +299,8 @@ private: std::vector _searchTagsSelected; base::unique_qptr _select; std::unique_ptr _searchTags; + base::unique_qptr _menu; + std::optional _mouseGlobalPosition; const not_null _window; const not_null _history; @@ -461,6 +465,16 @@ void TopBar::refreshTags() { requestSearch(false); }, _searchTags->lifetime()); + _searchTags->menuRequests( + ) | rpl::start_with_next([=](Data::ReactionId id) { + ShowTagInListMenu( + &_menu, + _mouseGlobalPosition.value_or(QCursor::pos()), + this, + id, + _window); + }, _searchTags->lifetime()); + if (!_searchTagsSelected.empty()) { crl::on_main(this, [=] { requestSearch(false); @@ -497,6 +511,7 @@ void TopBar::refreshTags() { parent->events() | rpl::start_with_next([=](not_null e) { if (e->type() == QEvent::MouseMove) { const auto mouse = static_cast(e.get()); + _mouseGlobalPosition = mouse->globalPos(); const auto point = mouse->pos() - position; const auto handler = _searchTags->lookupHandler(point); ClickHandler::setActive(handler); diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 46f043664..9183ab81b 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -1074,7 +1074,7 @@ void EditTagBox( }, warning->lifetime()); warning->setAttribute(Qt::WA_TransparentForMouseEvents); - box->addButton(tr::lng_settings_save(), [=] { + const auto save = [=] { const auto text = field->getLastText(); if (text.size() > kTagNameLimit) { field->showError(); @@ -1085,7 +1085,12 @@ void EditTagBox( if (const auto strong = weak.data()) { strong->closeBox(); } - }); + }; + + field->submits( + ) | rpl::start_with_next(save, field->lifetime()); + + box->addButton(tr::lng_settings_save(), save); box->addButton(tr::lng_cancel(), [=] { box->closeBox(); }); @@ -1454,6 +1459,37 @@ void AddWhoReactedAction( } } +void AddEditTagAction( + not_null menu, + const Data::ReactionId &id, + not_null controller) { + const auto owner = &controller->session().data(); + const auto editLabel = owner->reactions().myTagTitle(id).isEmpty() + ? tr::lng_context_tag_add_name(tr::now) + : tr::lng_context_tag_edit_name(tr::now); + menu->addAction(editLabel, [=] { + controller->show(Box(EditTagBox, controller, id)); + }, &st::menuIconTagRename); +} + +void AddTagPackAction( + not_null menu, + const Data::ReactionId &id, + not_null controller) { + if (const auto custom = id.custom()) { + const auto owner = &controller->session().data(); + if (const auto set = owner->document(custom)->sticker()) { + if (set->set.id) { + AddEmojiPacksAction( + menu, + { set->set }, + EmojiPacksSource::Tag, + controller); + } + } + } +} + void ShowTagMenu( not_null*> menu, QPoint position, @@ -1476,12 +1512,7 @@ void ShowTagMenu( }); }, &st::menuIconTagFilter); - const auto editLabel = owner->reactions().myTagTitle(id).isEmpty() - ? tr::lng_context_tag_add_name(tr::now) - : tr::lng_context_tag_edit_name(tr::now); - (*menu)->addAction(editLabel, [=] { - controller->show(Box(EditTagBox, controller, id)); - }, &st::menuIconTagRename); + AddEditTagAction(menu->get(), id, controller); const auto removeTag = [=] { if (const auto item = owner->message(itemId)) { @@ -1503,17 +1534,24 @@ void ShowTagMenu( &st::menuIconTagRemoveAttention, &st::menuIconTagRemoveAttention)); - if (const auto custom = id.custom()) { - if (const auto set = owner->document(custom)->sticker()) { - if (set->set.id) { - AddEmojiPacksAction( - menu->get(), - { set->set }, - EmojiPacksSource::Reaction, - controller); - } - } - } + AddTagPackAction(menu->get(), id, controller); + + (*menu)->popup(position); +} + +void ShowTagInListMenu( + not_null*> menu, + QPoint position, + not_null context, + const Data::ReactionId &id, + not_null controller) { + *menu = base::make_unique_q( + context, + st::popupMenuExpandedSeparator); + + AddEditTagAction(menu->get(), id, controller); + AddTagPackAction(menu->get(), id, controller); + (*menu)->popup(position); } @@ -1676,6 +1714,12 @@ void AddEmojiPacksAction( lt_name, TextWithEntities{ name }, Ui::Text::RichLangValue); + case EmojiPacksSource::Tag: + return tr::lng_context_animated_tag( + tr::now, + lt_name, + TextWithEntities{ name }, + Ui::Text::RichLangValue); case EmojiPacksSource::Reaction: if (!name.text.isEmpty()) { return tr::lng_context_animated_reaction( diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.h b/Telegram/SourceFiles/history/view/history_view_context_menu.h index 4979a6789..65afd007b 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.h +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.h @@ -88,11 +88,18 @@ void ShowWhoReactedMenu( const Data::ReactionId &id, not_null controller, rpl::lifetime &lifetime); +void ShowTagInListMenu( + not_null*> menu, + QPoint position, + not_null context, + const Data::ReactionId &id, + not_null controller); enum class EmojiPacksSource { Message, Reaction, Reactions, + Tag, }; [[nodiscard]] std::vector CollectEmojiPacks( not_null item, diff --git a/Telegram/lib_ui b/Telegram/lib_ui index a2c2d92cd..7328e2786 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit a2c2d92cda2cffdafeb671d1f292a2002fb54217 +Subproject commit 7328e2786248c673e3599695a56989d9c1062303