mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-21 16:47:07 +02:00
Extended output data from emoji userpic builder.
This commit is contained in:
parent
9940ee21d3
commit
b7cf32a65f
10 changed files with 45 additions and 20 deletions
|
@ -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();
|
||||
},
|
||||
});
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue