Extended output data from emoji userpic builder.

This commit is contained in:
23rd 2023-01-30 23:32:41 +03:00 committed by John Preston
parent 9940ee21d3
commit b7cf32a65f
10 changed files with 45 additions and 20 deletions

View File

@ -21,7 +21,7 @@ namespace UserpicBuilder {
void ShowLayer(
not_null<Window::SessionController*> controller,
StartData data,
Fn<void(QImage &&image)> &&doneCallback) {
Fn<void(UserpicBuilder::Result)> &&doneCallback) {
auto layer = std::make_unique<LayerWidget>();
const auto layerRaw = layer.get();
{
@ -34,10 +34,10 @@ void ShowLayer(
layerRaw,
controller,
data,
BothWayCommunication<QImage&&>{
BothWayCommunication<UserpicBuilder::Result>{
.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();
},
});

View File

@ -13,11 +13,12 @@ class SessionController;
namespace UserpicBuilder {
struct Result;
struct StartData;
void ShowLayer(
not_null<Window::SessionController*> controller,
StartData data,
Fn<void(QImage &&image)> &&doneCallback);
Fn<void(UserpicBuilder::Result)> &&doneCallback);
} // namespace UserpicBuilder

View File

@ -9,6 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace UserpicBuilder {
struct Result {
QImage&& image;
DocumentId id = 0;
std::vector<QColor> colors;
};
[[nodiscard]] QImage GenerateGradient(
const QSize &size,
const std::vector<QColor> &colors,

View File

@ -32,7 +32,7 @@ void AddEmojiBuilderAction(
not_null<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
rpl::producer<std::vector<DocumentId>> documents,
Fn<void(QImage &&image)> &&done) {
Fn<void(UserpicBuilder::Result)> &&done) {
constexpr auto kTimeout = crl::time(1500);
struct State final {
State() {

View File

@ -17,10 +17,12 @@ class PopupMenu;
namespace UserpicBuilder {
struct Result;
void AddEmojiBuilderAction(
not_null<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
rpl::producer<std::vector<DocumentId>> documents,
Fn<void(QImage &&image)> &&done);
Fn<void(UserpicBuilder::Result)> &&done);
} // namespace UserpicBuilder

View File

@ -148,19 +148,22 @@ void EmojiUserpic::setDocument(not_null<DocumentData*> document) {
_painter.setPlayOnce(*_playOnce);
}
void EmojiUserpic::result(int size, Fn<void(QImage &&image)> done) {
void EmojiUserpic::result(int size, Fn<void(UserpicBuilder::Result)> done) {
const auto painter = lifetime().make_state<PreviewPainter>(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 });
});
}

View File

@ -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<Ui::RpWidget*> parent, const QSize &size);
void result(int size, Fn<void(QImage &&image)> done);
void result(int size, Fn<void(UserpicBuilder::Result)> done);
void setGradientColors(std::vector<QColor> colors);
void setDocument(not_null<DocumentData*> document);
void setDuration(crl::time duration);

View File

@ -356,7 +356,7 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
not_null<Ui::RpWidget*> parent,
not_null<Window::SessionController*> controller,
StartData data,
BothWayCommunication<QImage&&> communication) {
BothWayCommunication<UserpicBuilder::Result> communication) {
const auto container = Ui::CreateChild<Ui::VerticalLayout>(parent.get());
struct State {
@ -500,8 +500,8 @@ not_null<Ui::VerticalLayout*> 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());

View File

@ -19,6 +19,7 @@ class SessionController;
namespace UserpicBuilder {
struct StartData;
struct Result;
template <typename Result>
struct BothWayCommunication;
@ -27,7 +28,7 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
not_null<Ui::RpWidget*> parent,
not_null<Window::SessionController*> controller,
StartData data,
BothWayCommunication<QImage&&> communication);
BothWayCommunication<UserpicBuilder::Result> communication);
[[nodiscard]] not_null<Ui::RpWidget*> CreateEmojiUserpic(
not_null<Ui::RpWidget*> parent,

View File

@ -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();