diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp index 9636d37050..24fc13e4b0 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp @@ -21,7 +21,7 @@ namespace UserpicBuilder { void ShowLayer( not_null controller, StartData data, - Fn &&doneCallback) { + Fn &&doneCallback) { auto layer = std::make_unique(); const auto layerRaw = layer.get(); { @@ -34,10 +34,10 @@ void ShowLayer( layerRaw, controller, data, - BothWayCommunication{ + BothWayCommunication{ .triggers = state->clicks.events(), - .result = [=, done = std::move(doneCallback)](QImage &&i) { - done(std::move(i)); + .result = [=, done = std::move(doneCallback)](Result r) { + done(std::move(r)); layerRaw->closeLayer(); }, }); diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.h index d18bd12d37..71ca81a426 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.h @@ -13,11 +13,12 @@ class SessionController; namespace UserpicBuilder { +struct Result; struct StartData; void ShowLayer( not_null controller, StartData data, - Fn &&doneCallback); + Fn &&doneCallback); } // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h index 5880b31dff..e28b2c9e94 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h @@ -9,6 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace UserpicBuilder { +struct Result { + QImage&& image; + DocumentId id = 0; + std::vector colors; +}; + [[nodiscard]] QImage GenerateGradient( const QSize &size, const std::vector &colors, diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp index 7e2e811997..a21740df11 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.cpp @@ -32,7 +32,7 @@ void AddEmojiBuilderAction( not_null controller, not_null menu, rpl::producer> documents, - Fn &&done) { + Fn &&done) { constexpr auto kTimeout = crl::time(1500); struct State final { State() { diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h index 9d8a9b22fc..70d9049b2e 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_menu_item.h @@ -17,10 +17,12 @@ class PopupMenu; namespace UserpicBuilder { +struct Result; + void AddEmojiBuilderAction( not_null controller, not_null menu, rpl::producer> documents, - Fn &&done); + Fn &&done); } // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp index 85dcb680d8..9049312536 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp @@ -148,19 +148,22 @@ void EmojiUserpic::setDocument(not_null document) { _painter.setPlayOnce(*_playOnce); } -void EmojiUserpic::result(int size, Fn done) { +void EmojiUserpic::result(int size, Fn done) { const auto painter = lifetime().make_state(size); // Reset to the first frame. - painter->setDocument(_painter.document(), [=] { + const auto document = _painter.document(); + painter->setDocument(document, [=] { auto background = GenerateGradient(Size(size), _colors, false); - auto p = QPainter(&background); - while (true) { - if (painter->paintForeground(p)) { - break; + { + auto p = QPainter(&background); + while (true) { + if (painter->paintForeground(p)) { + break; + } } } - done(std::move(background)); + done({ std::move(background), document->id, _colors }); }); } diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h index 75680c331b..ce36d5051c 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h @@ -23,6 +23,8 @@ class DocumentData; namespace UserpicBuilder { +struct Result; + class PreviewPainter final { public: PreviewPainter(int size); @@ -55,7 +57,7 @@ class EmojiUserpic final : public Ui::RpWidget { public: EmojiUserpic(not_null parent, const QSize &size); - void result(int size, Fn done); + void result(int size, Fn done); void setGradientColors(std::vector colors); void setDocument(not_null document); void setDuration(crl::time duration); diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp index 42a16aa821..85f247ba89 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp @@ -356,7 +356,7 @@ not_null CreateUserpicBuilder( not_null parent, not_null controller, StartData data, - BothWayCommunication communication) { + BothWayCommunication communication) { const auto container = Ui::CreateChild(parent.get()); struct State { @@ -500,8 +500,8 @@ not_null CreateUserpicBuilder( base::take( communication.triggers ) | rpl::start_with_next([=, done = base::take(communication.result)] { - preview->result(Editor::kProfilePhotoSize, [=](QImage &&image) { - done(std::move(image)); + preview->result(Editor::kProfilePhotoSize, [=](Result result) { + done(std::move(result)); }); }, preview->lifetime()); diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h index 24306290d9..4a572b0770 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h @@ -19,6 +19,7 @@ class SessionController; namespace UserpicBuilder { struct StartData; +struct Result; template struct BothWayCommunication; @@ -27,7 +28,7 @@ not_null CreateUserpicBuilder( not_null parent, not_null controller, StartData data, - BothWayCommunication communication); + BothWayCommunication communication); [[nodiscard]] not_null CreateEmojiUserpic( not_null parent, diff --git a/Telegram/SourceFiles/ui/controls/userpic_button.cpp b/Telegram/SourceFiles/ui/controls/userpic_button.cpp index 3f44584934..d87d8a6e85 100644 --- a/Telegram/SourceFiles/ui/controls/userpic_button.cpp +++ b/Telegram/SourceFiles/ui/controls/userpic_button.cpp @@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/painter.h" #include "editor/photo_editor_common.h" #include "editor/photo_editor_layer_widget.h" +#include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_menu_item.h" #include "media/streaming/media_streaming_instance.h" #include "media/streaming/media_streaming_player.h" @@ -351,6 +352,15 @@ void UserpicButton::choosePhotoLocally() { }, &st::menuIconPhotoSet); } if (_controller) { + const auto done = [=](UserpicBuilder::Result data) { + auto result = ChosenImage{ + base::take(data.image), + ChosenType::Set, + }; + result.markup.documentId = data.id; + result.markup.colors = base::take(data.colors); + _chosenImages.fire(std::move(result)); + }; auto &session = _controller->session(); UserpicBuilder::AddEmojiBuilderAction( _controller, @@ -358,7 +368,7 @@ void UserpicButton::choosePhotoLocally() { session.api().peerPhoto().emojiListValue(user ? Api::PeerPhoto::EmojiListType::Profile : Api::PeerPhoto::EmojiListType::Group), - callback(ChosenType::Set)); + done); } } else { chooseFile();