From 2d6008f6ca90bd5b765d3c212cd76764cc1120ba Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 25 Jul 2022 13:34:18 +0300 Subject: [PATCH] Fix custom emoji in edit caption / send files box. --- .../SourceFiles/boxes/edit_caption_box.cpp | 11 +++++++-- Telegram/SourceFiles/boxes/send_files_box.cpp | 11 +++++++-- .../chat_helpers/emoji_list_widget.cpp | 9 +++---- .../chat_helpers/emoji_list_widget.h | 3 ++- .../chat_helpers/field_autocomplete.cpp | 2 +- .../chat_helpers/gifs_list_widget.cpp | 11 ++++----- .../chat_helpers/gifs_list_widget.h | 5 +++- .../chat_helpers/stickers_list_footer.cpp | 4 ++-- .../chat_helpers/stickers_list_footer.h | 2 ++ .../chat_helpers/stickers_list_widget.cpp | 7 +++--- .../chat_helpers/stickers_list_widget.h | 1 + .../SourceFiles/chat_helpers/tabbed_panel.cpp | 10 ++------ .../chat_helpers/tabbed_selector.cpp | 24 ++++++++++++++----- .../chat_helpers/tabbed_selector.h | 15 ++++++++++-- .../controllers/stickers_panel_controller.cpp | 3 +++ .../window/window_session_controller.cpp | 3 ++- .../window/window_session_controller.h | 2 +- 17 files changed, 83 insertions(+), 40 deletions(-) diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 47dda849c..703448e47 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -25,6 +25,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_user.h" #include "data/data_premium_limits.h" +#include "data/stickers/data_custom_emoji.h" #include "editor/photo_editor_layer_widget.h" #include "history/history_drag_area.h" #include "history/history_item.h" @@ -473,13 +474,15 @@ void EditCaptionBox::setupDragArea() { void EditCaptionBox::setupEmojiPanel() { const auto container = getDelegate()->outerContainer(); + using Selector = ChatHelpers::TabbedSelector; _emojiPanel = base::make_unique_q( container, _controller, - object_ptr( + object_ptr( nullptr, _controller, - ChatHelpers::TabbedSelector::Mode::EmojiOnly)); + Window::GifPauseReason::Layer, + Selector::Mode::EmojiOnly)); _emojiPanel->setDesiredHeightValues( 1., st::emojiPanMinHeight / 2, @@ -489,6 +492,10 @@ void EditCaptionBox::setupEmojiPanel() { ) | rpl::start_with_next([=](EmojiPtr emoji) { Ui::InsertEmojiAtCursor(_field->textCursor(), emoji); }, lifetime()); + _emojiPanel->selector()->customEmojiChosen( + ) | rpl::start_with_next([=](Selector::FileChosen data) { + Data::InsertCustomEmoji(_field.get(), data.document); + }, lifetime()); const auto filterCallback = [=](not_null event) { emojiFilterForGeometry(event); diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index e21a94933..b612f5da2 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -48,6 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_document.h" #include "data/data_user.h" #include "data/data_premium_limits.h" +#include "data/stickers/data_custom_emoji.h" #include "media/clip/media_clip_reader.h" #include "api/api_common.h" #include "window/window_session_controller.h" @@ -715,13 +716,15 @@ void SendFilesBox::setupEmojiPanel() { Expects(_caption != nullptr); const auto container = getDelegate()->outerContainer(); + using Selector = ChatHelpers::TabbedSelector; _emojiPanel = base::make_unique_q( container, _controller, - object_ptr( + object_ptr( nullptr, _controller, - ChatHelpers::TabbedSelector::Mode::EmojiOnly)); + Window::GifPauseReason::Layer, + Selector::Mode::EmojiOnly)); _emojiPanel->setDesiredHeightValues( 1., st::emojiPanMinHeight / 2, @@ -731,6 +734,10 @@ void SendFilesBox::setupEmojiPanel() { ) | rpl::start_with_next([=](EmojiPtr emoji) { Ui::InsertEmojiAtCursor(_caption->textCursor(), emoji); }, lifetime()); + _emojiPanel->selector()->customEmojiChosen( + ) | rpl::start_with_next([=](Selector::FileChosen data) { + Data::InsertCustomEmoji(_caption.data(), data.document); + }, lifetime()); const auto filterCallback = [=](not_null event) { emojiFilterForGeometry(event); diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp index ccb7d719b..6b7bd48b1 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp @@ -364,8 +364,9 @@ void EmojiColorPicker::drawVariant(Painter &p, int variant) { EmojiListWidget::EmojiListWidget( QWidget *parent, - not_null controller) -: Inner(parent, controller) + not_null controller, + Window::GifPauseReason level) +: Inner(parent, controller, level) , _localSetsManager( std::make_unique(&controller->session())) , _collapsedBg(st::emojiPanExpand.height / 2, st::emojiPanHeaderFg) @@ -509,6 +510,7 @@ object_ptr EmojiListWidget::createFooter() { using FooterDescriptor = StickersListFooter::Descriptor; auto result = object_ptr(FooterDescriptor{ .controller = controller(), + .level = level(), .parent = this, }); _footer = result; @@ -703,8 +705,7 @@ void EmojiListWidget::paintEvent(QPaintEvent *e) { toColumn = _columnCount - toColumn; } - const auto paused = controller()->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs); + const auto paused = controller()->isGifPausedAtLeastFor(level()); const auto now = crl::now(); auto selectedButton = std::get_if(!v::is_null(_pressed) ? &_pressed diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h index fe8b722f7..598e14edc 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h @@ -58,7 +58,8 @@ class EmojiListWidget public: EmojiListWidget( QWidget *parent, - not_null controller); + not_null controller, + Window::GifPauseReason level); ~EmojiListWidget(); using Section = Ui::Emoji::Section; diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index 903d0b774..e7d0d970c 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -861,7 +861,7 @@ void FieldAutocomplete::Inner::paintEvent(QPaintEvent *e) { media->checkStickerSmall(); const auto paused = _controller->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs); + Window::GifPauseReason::TabbedPanel); const auto size = ChatHelpers::ComputeStickerSize( document, stickerBoundingBox()); diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index f0d301417..6e6b78fee 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -168,8 +168,9 @@ void GifsListWidget::Footer::processPanelHideFinished() { GifsListWidget::GifsListWidget( QWidget *parent, - not_null controller) -: Inner(parent, controller) + not_null controller, + Window::GifPauseReason level) +: Inner(parent, controller, level) , _api(&controller->session().mtp()) , _section(Section::Gifs) , _updateInlineItems([=] { updateInlineItems(); }) @@ -197,8 +198,7 @@ GifsListWidget::GifsListWidget( controller->gifPauseLevelChanged( ) | rpl::start_with_next([=] { - if (!controller->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs)) { + if (!controller->isGifPausedAtLeastFor(level)) { updateInlineItems(); } }, lifetime()); @@ -343,8 +343,7 @@ void GifsListWidget::paintInlineItems(Painter &p, QRect clip) { p.drawText(QRect(0, 0, width(), (height() / 3) * 2 + st::normalFont->height), text, style::al_center); return; } - const auto gifPaused = controller()->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs); + const auto gifPaused = controller()->isGifPausedAtLeastFor(level()); using namespace InlineBots::Layout; PaintContext context(crl::now(), false, gifPaused, false); diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h index 14bb998e0..b6c35650b 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h @@ -51,7 +51,10 @@ class GifsListWidget public: using InlineChosen = TabbedSelector::InlineChosen; - GifsListWidget(QWidget *parent, not_null controller); + GifsListWidget( + QWidget *parent, + not_null controller, + Window::GifPauseReason level); rpl::producer fileChosen() const; rpl::producer photoChosen() const; diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_footer.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_footer.cpp index 73d351683..79f9db7a6 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_footer.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_footer.cpp @@ -147,6 +147,7 @@ bool StickersListFooter::ScrollState::animationCallback(crl::time now) { StickersListFooter::StickersListFooter(Descriptor &&descriptor) : InnerFooter(descriptor.parent) , _controller(descriptor.controller) +, _level(descriptor.level) , _searchButtonVisible(descriptor.searchButtonVisible) , _settingsButtonVisible(descriptor.settingsButtonVisible) , _iconState([=] { update(); }) @@ -559,8 +560,7 @@ void StickersListFooter::paintEvent(QPaintEvent *e) { } const auto now = crl::now(); - const auto paused = _controller->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs); + const auto paused = _controller->isGifPausedAtLeastFor(_level); enumerateVisibleIcons([&](const IconInfo &info) { paintSetIcon(p, info, now, paused); }); diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_footer.h b/Telegram/SourceFiles/chat_helpers/stickers_list_footer.h index c7a28973a..f8a5bc761 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_footer.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_footer.h @@ -78,6 +78,7 @@ class StickersListFooter final : public TabbedSelector::InnerFooter { public: struct Descriptor { not_null controller; + Window::GifPauseReason level = {}; not_null parent; bool searchButtonVisible = false; bool settingsButtonVisible = false; @@ -210,6 +211,7 @@ private: void clipCallback(Media::Clip::Notification notification, uint64 setId); const not_null _controller; + const Window::GifPauseReason _level = {}; const bool _searchButtonVisible = false; const bool _settingsButtonVisible = false; diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 1ffce3fe8..a5b937d51 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -162,8 +162,9 @@ void StickersListWidget::Sticker::ensureMediaCreated() { StickersListWidget::StickersListWidget( QWidget *parent, not_null controller, + Window::GifPauseReason level, bool masks) -: Inner(parent, controller) +: Inner(parent, controller, level) , _api(&controller->session().mtp()) , _localSetsManager( std::make_unique(&controller->session())) @@ -252,6 +253,7 @@ object_ptr StickersListWidget::createFooter() { using FooterDescriptor = StickersListFooter::Descriptor; auto result = object_ptr(FooterDescriptor{ .controller = controller(), + .level = level(), .parent = this, .searchButtonVisible = !_isMasks, .settingsButtonVisible = true, @@ -818,8 +820,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) { : &_selected); const auto now = crl::now(); - const auto paused = controller()->isGifPausedAtLeastFor( - Window::GifPauseReason::SavedGifs); + const auto paused = controller()->isGifPausedAtLeastFor(level()); if (sets.empty() && _section == Section::Search) { paintEmptySearchResults(p); } diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h index 5b2d338a1..5b1277291 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h @@ -56,6 +56,7 @@ public: StickersListWidget( QWidget *parent, not_null controller, + Window::GifPauseReason level, bool masks = false); rpl::producer chosen() const; diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_panel.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_panel.cpp index cf3178580..82648c8f9 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_panel.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_panel.cpp @@ -64,16 +64,10 @@ TabbedPanel::TabbedPanel( _selector->setParent(this); _selector->setRoundRadius(st::roundRadiusSmall); _selector->setAfterShownCallback([=](SelectorTab tab) { - if (tab == SelectorTab::Gifs || tab == SelectorTab::Stickers) { - _controller->enableGifPauseReason( - Window::GifPauseReason::SavedGifs); - } + _controller->enableGifPauseReason(_selector->level()); }); _selector->setBeforeHidingCallback([=](SelectorTab tab) { - if (tab == SelectorTab::Gifs || tab == SelectorTab::Stickers) { - _controller->disableGifPauseReason( - Window::GifPauseReason::SavedGifs); - } + _controller->disableGifPauseReason(_selector->level()); }); _selector->showRequests( ) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp index f9fee0874..ae0b4ffc3 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp @@ -289,9 +289,11 @@ void TabbedSelector::Tab::saveScrollTop() { TabbedSelector::TabbedSelector( QWidget *parent, not_null controller, + Window::GifPauseReason level, Mode mode) : RpWidget(parent) , _controller(controller) +, _level(level) , _mode(mode) , _topShadow(full() ? object_ptr(this) : nullptr) , _bottomShadow(this) @@ -425,17 +427,25 @@ Main::Session &TabbedSelector::session() const { return _controller->session(); } +Window::GifPauseReason TabbedSelector::level() const { + return _level; +} + TabbedSelector::Tab TabbedSelector::createTab(SelectorTab type, int index) { auto createWidget = [&]() -> object_ptr { switch (type) { case SelectorTab::Emoji: - return object_ptr(this, _controller); + return object_ptr(this, _controller, _level); case SelectorTab::Stickers: - return object_ptr(this, _controller); + return object_ptr(this, _controller, _level); case SelectorTab::Gifs: - return object_ptr(this, _controller); + return object_ptr(this, _controller, _level); case SelectorTab::Masks: - return object_ptr(this, _controller, true); + return object_ptr( + this, + _controller, + _level, + true); } Unexpected("Type in TabbedSelector::createTab."); }; @@ -1133,9 +1143,11 @@ not_null TabbedSelector::currentTab() const { TabbedSelector::Inner::Inner( QWidget *parent, - not_null controller) + not_null controller, + Window::GifPauseReason level) : RpWidget(parent) -, _controller(controller) { +, _controller(controller) +, _level(level) { } Main::Session &TabbedSelector::Inner::session() const { diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.h b/Telegram/SourceFiles/chat_helpers/tabbed_selector.h index 2d181dfd8..5b7eedd01 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.h +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.h @@ -34,6 +34,7 @@ class BoxContent; namespace Window { class SessionController; +enum class GifPauseReason; } // namespace Window namespace SendMenu { @@ -78,10 +79,12 @@ public: TabbedSelector( QWidget *parent, not_null controller, + Window::GifPauseReason level, Mode mode = Mode::Full); ~TabbedSelector(); Main::Session &session() const; + Window::GifPauseReason level() const; rpl::producer emojiChosen() const; rpl::producer customEmojiChosen() const; @@ -222,6 +225,7 @@ private: not_null masks() const; const not_null _controller; + const Window::GifPauseReason _level = {}; Mode _mode = Mode::Full; int _roundRadius = 0; @@ -258,11 +262,17 @@ private: class TabbedSelector::Inner : public Ui::RpWidget { public: - Inner(QWidget *parent, not_null controller); + Inner( + QWidget *parent, + not_null controller, + Window::GifPauseReason level); [[nodiscard]] not_null controller() const { return _controller; } + [[nodiscard]] Window::GifPauseReason level() const { + return _level; + } [[nodiscard]] Main::Session &session() const; [[nodiscard]] int getVisibleTop() const { @@ -321,7 +331,8 @@ protected: void checkHideWithBox(QPointer box); private: - not_null _controller; + const not_null _controller; + const Window::GifPauseReason _level = {}; int _visibleTop = 0; int _visibleBottom = 0; diff --git a/Telegram/SourceFiles/editor/controllers/stickers_panel_controller.cpp b/Telegram/SourceFiles/editor/controllers/stickers_panel_controller.cpp index 9436e6225..00991ee6a 100644 --- a/Telegram/SourceFiles/editor/controllers/stickers_panel_controller.cpp +++ b/Telegram/SourceFiles/editor/controllers/stickers_panel_controller.cpp @@ -9,6 +9,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_panel.h" #include "chat_helpers/tabbed_selector.h" +#include "window/window_session_controller.h" // Window::GifPauseReason + #include "styles/style_chat_helpers.h" namespace Editor { @@ -23,6 +25,7 @@ StickersPanelController::StickersPanelController( object_ptr( nullptr, controller, + Window::GifPauseReason::Layer, ChatHelpers::TabbedSelector::Mode::MediaEditor))) { _stickersPanel->setDesiredHeightValues( 1., diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 549de2ee6..d4990098e 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -620,7 +620,8 @@ SessionController::SessionController( , _tabbedSelector( std::make_unique( _window->widget(), - this)) + this, + GifPauseReason::TabbedPanel)) , _invitePeekTimer([=] { checkInvitePeek(); }) , _activeChatsFilter(session->data().chatsFilters().defaultId()) , _defaultChatTheme(std::make_shared()) diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index bd696e229..4d5338825 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -84,7 +84,7 @@ class FiltersMenu; enum class GifPauseReason { Any = 0, InlineResults = (1 << 0), - SavedGifs = (1 << 1), + TabbedPanel = (1 << 1), Layer = (1 << 2), RoundPlaying = (1 << 3), MediaPreview = (1 << 4),