Extended output data from emoji userpic builder.
This commit is contained in:
parent
9940ee21d3
commit
b7cf32a65f
|
@ -21,7 +21,7 @@ namespace UserpicBuilder {
|
||||||
void ShowLayer(
|
void ShowLayer(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
StartData data,
|
StartData data,
|
||||||
Fn<void(QImage &&image)> &&doneCallback) {
|
Fn<void(UserpicBuilder::Result)> &&doneCallback) {
|
||||||
auto layer = std::make_unique<LayerWidget>();
|
auto layer = std::make_unique<LayerWidget>();
|
||||||
const auto layerRaw = layer.get();
|
const auto layerRaw = layer.get();
|
||||||
{
|
{
|
||||||
|
@ -34,10 +34,10 @@ void ShowLayer(
|
||||||
layerRaw,
|
layerRaw,
|
||||||
controller,
|
controller,
|
||||||
data,
|
data,
|
||||||
BothWayCommunication<QImage&&>{
|
BothWayCommunication<UserpicBuilder::Result>{
|
||||||
.triggers = state->clicks.events(),
|
.triggers = state->clicks.events(),
|
||||||
.result = [=, done = std::move(doneCallback)](QImage &&i) {
|
.result = [=, done = std::move(doneCallback)](Result r) {
|
||||||
done(std::move(i));
|
done(std::move(r));
|
||||||
layerRaw->closeLayer();
|
layerRaw->closeLayer();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,11 +13,12 @@ class SessionController;
|
||||||
|
|
||||||
namespace UserpicBuilder {
|
namespace UserpicBuilder {
|
||||||
|
|
||||||
|
struct Result;
|
||||||
struct StartData;
|
struct StartData;
|
||||||
|
|
||||||
void ShowLayer(
|
void ShowLayer(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
StartData data,
|
StartData data,
|
||||||
Fn<void(QImage &&image)> &&doneCallback);
|
Fn<void(UserpicBuilder::Result)> &&doneCallback);
|
||||||
|
|
||||||
} // namespace UserpicBuilder
|
} // namespace UserpicBuilder
|
||||||
|
|
|
@ -9,6 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
namespace UserpicBuilder {
|
namespace UserpicBuilder {
|
||||||
|
|
||||||
|
struct Result {
|
||||||
|
QImage&& image;
|
||||||
|
DocumentId id = 0;
|
||||||
|
std::vector<QColor> colors;
|
||||||
|
};
|
||||||
|
|
||||||
[[nodiscard]] QImage GenerateGradient(
|
[[nodiscard]] QImage GenerateGradient(
|
||||||
const QSize &size,
|
const QSize &size,
|
||||||
const std::vector<QColor> &colors,
|
const std::vector<QColor> &colors,
|
||||||
|
|
|
@ -32,7 +32,7 @@ void AddEmojiBuilderAction(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
not_null<Ui::PopupMenu*> menu,
|
not_null<Ui::PopupMenu*> menu,
|
||||||
rpl::producer<std::vector<DocumentId>> documents,
|
rpl::producer<std::vector<DocumentId>> documents,
|
||||||
Fn<void(QImage &&image)> &&done) {
|
Fn<void(UserpicBuilder::Result)> &&done) {
|
||||||
constexpr auto kTimeout = crl::time(1500);
|
constexpr auto kTimeout = crl::time(1500);
|
||||||
struct State final {
|
struct State final {
|
||||||
State() {
|
State() {
|
||||||
|
|
|
@ -17,10 +17,12 @@ class PopupMenu;
|
||||||
|
|
||||||
namespace UserpicBuilder {
|
namespace UserpicBuilder {
|
||||||
|
|
||||||
|
struct Result;
|
||||||
|
|
||||||
void AddEmojiBuilderAction(
|
void AddEmojiBuilderAction(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
not_null<Ui::PopupMenu*> menu,
|
not_null<Ui::PopupMenu*> menu,
|
||||||
rpl::producer<std::vector<DocumentId>> documents,
|
rpl::producer<std::vector<DocumentId>> documents,
|
||||||
Fn<void(QImage &&image)> &&done);
|
Fn<void(UserpicBuilder::Result)> &&done);
|
||||||
|
|
||||||
} // namespace UserpicBuilder
|
} // namespace UserpicBuilder
|
||||||
|
|
|
@ -148,19 +148,22 @@ void EmojiUserpic::setDocument(not_null<DocumentData*> document) {
|
||||||
_painter.setPlayOnce(*_playOnce);
|
_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);
|
const auto painter = lifetime().make_state<PreviewPainter>(size);
|
||||||
// Reset to the first frame.
|
// 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 background = GenerateGradient(Size(size), _colors, false);
|
||||||
|
|
||||||
auto p = QPainter(&background);
|
{
|
||||||
while (true) {
|
auto p = QPainter(&background);
|
||||||
if (painter->paintForeground(p)) {
|
while (true) {
|
||||||
break;
|
if (painter->paintForeground(p)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
done(std::move(background));
|
done({ std::move(background), document->id, _colors });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@ class DocumentData;
|
||||||
|
|
||||||
namespace UserpicBuilder {
|
namespace UserpicBuilder {
|
||||||
|
|
||||||
|
struct Result;
|
||||||
|
|
||||||
class PreviewPainter final {
|
class PreviewPainter final {
|
||||||
public:
|
public:
|
||||||
PreviewPainter(int size);
|
PreviewPainter(int size);
|
||||||
|
@ -55,7 +57,7 @@ class EmojiUserpic final : public Ui::RpWidget {
|
||||||
public:
|
public:
|
||||||
EmojiUserpic(not_null<Ui::RpWidget*> parent, const QSize &size);
|
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 setGradientColors(std::vector<QColor> colors);
|
||||||
void setDocument(not_null<DocumentData*> document);
|
void setDocument(not_null<DocumentData*> document);
|
||||||
void setDuration(crl::time duration);
|
void setDuration(crl::time duration);
|
||||||
|
|
|
@ -356,7 +356,7 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
|
||||||
not_null<Ui::RpWidget*> parent,
|
not_null<Ui::RpWidget*> parent,
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
StartData data,
|
StartData data,
|
||||||
BothWayCommunication<QImage&&> communication) {
|
BothWayCommunication<UserpicBuilder::Result> communication) {
|
||||||
const auto container = Ui::CreateChild<Ui::VerticalLayout>(parent.get());
|
const auto container = Ui::CreateChild<Ui::VerticalLayout>(parent.get());
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
|
@ -500,8 +500,8 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
|
||||||
base::take(
|
base::take(
|
||||||
communication.triggers
|
communication.triggers
|
||||||
) | rpl::start_with_next([=, done = base::take(communication.result)] {
|
) | rpl::start_with_next([=, done = base::take(communication.result)] {
|
||||||
preview->result(Editor::kProfilePhotoSize, [=](QImage &&image) {
|
preview->result(Editor::kProfilePhotoSize, [=](Result result) {
|
||||||
done(std::move(image));
|
done(std::move(result));
|
||||||
});
|
});
|
||||||
}, preview->lifetime());
|
}, preview->lifetime());
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ class SessionController;
|
||||||
namespace UserpicBuilder {
|
namespace UserpicBuilder {
|
||||||
|
|
||||||
struct StartData;
|
struct StartData;
|
||||||
|
struct Result;
|
||||||
|
|
||||||
template <typename Result>
|
template <typename Result>
|
||||||
struct BothWayCommunication;
|
struct BothWayCommunication;
|
||||||
|
@ -27,7 +28,7 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
|
||||||
not_null<Ui::RpWidget*> parent,
|
not_null<Ui::RpWidget*> parent,
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
StartData data,
|
StartData data,
|
||||||
BothWayCommunication<QImage&&> communication);
|
BothWayCommunication<UserpicBuilder::Result> communication);
|
||||||
|
|
||||||
[[nodiscard]] not_null<Ui::RpWidget*> CreateEmojiUserpic(
|
[[nodiscard]] not_null<Ui::RpWidget*> CreateEmojiUserpic(
|
||||||
not_null<Ui::RpWidget*> parent,
|
not_null<Ui::RpWidget*> parent,
|
||||||
|
|
|
@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "editor/photo_editor_common.h"
|
#include "editor/photo_editor_common.h"
|
||||||
#include "editor/photo_editor_layer_widget.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 "info/userpic/info_userpic_emoji_builder_menu_item.h"
|
||||||
#include "media/streaming/media_streaming_instance.h"
|
#include "media/streaming/media_streaming_instance.h"
|
||||||
#include "media/streaming/media_streaming_player.h"
|
#include "media/streaming/media_streaming_player.h"
|
||||||
|
@ -351,6 +352,15 @@ void UserpicButton::choosePhotoLocally() {
|
||||||
}, &st::menuIconPhotoSet);
|
}, &st::menuIconPhotoSet);
|
||||||
}
|
}
|
||||||
if (_controller) {
|
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();
|
auto &session = _controller->session();
|
||||||
UserpicBuilder::AddEmojiBuilderAction(
|
UserpicBuilder::AddEmojiBuilderAction(
|
||||||
_controller,
|
_controller,
|
||||||
|
@ -358,7 +368,7 @@ void UserpicButton::choosePhotoLocally() {
|
||||||
session.api().peerPhoto().emojiListValue(user
|
session.api().peerPhoto().emojiListValue(user
|
||||||
? Api::PeerPhoto::EmojiListType::Profile
|
? Api::PeerPhoto::EmojiListType::Profile
|
||||||
: Api::PeerPhoto::EmojiListType::Group),
|
: Api::PeerPhoto::EmojiListType::Group),
|
||||||
callback(ChosenType::Set));
|
done);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chooseFile();
|
chooseFile();
|
||||||
|
|
Loading…
Reference in New Issue