From 2f7e4ae8fb381edcca2dfeebe10c0f4f3085d00e Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 25 Jan 2023 19:29:50 +0300 Subject: [PATCH] Moved out common structures for userpic emoji builder to single place. --- Telegram/CMakeLists.txt | 2 + .../userpic/info_userpic_emoji_builder.cpp | 3 +- .../info_userpic_emoji_builder_common.cpp | 37 +++++++++++++++++++ .../info_userpic_emoji_builder_common.h | 29 +++++++++++++++ .../info_userpic_emoji_builder_menu_item.cpp | 1 + .../info_userpic_emoji_builder_widget.cpp | 5 ++- .../info_userpic_emoji_builder_widget.h | 13 ++----- 7 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp create mode 100644 Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 97b04f565..4674270cd 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -859,6 +859,8 @@ PRIVATE info/settings/info_settings_widget.h info/userpic/info_userpic_emoji_builder.cpp info/userpic/info_userpic_emoji_builder.h + info/userpic/info_userpic_emoji_builder_common.cpp + info/userpic/info_userpic_emoji_builder_common.h info/userpic/info_userpic_emoji_builder_menu_item.cpp info/userpic/info_userpic_emoji_builder_menu_item.h info/userpic/info_userpic_emoji_builder_preview.cpp diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp index d73b45676..9636d3705 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "info/userpic/info_userpic_emoji_builder.h" +#include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_layer.h" #include "info/userpic/info_userpic_emoji_builder_widget.h" #include "lang/lang_keys.h" @@ -33,7 +34,7 @@ void ShowLayer( layerRaw, controller, data, - BothWayCommunication{ + BothWayCommunication{ .triggers = state->clicks.events(), .result = [=, done = std::move(doneCallback)](QImage &&i) { done(std::move(i)); diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp new file mode 100644 index 000000000..bc4e3d0e2 --- /dev/null +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp @@ -0,0 +1,37 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "info/userpic/info_userpic_emoji_builder_common.h" + +#include "ui/image/image_prepare.h" + +namespace UserpicBuilder { + +[[nodiscard]] QImage GenerateGradient( + const QSize &size, + const std::vector &colors, + bool circle) { + constexpr auto kRotation = int(45); + auto gradient = Images::GenerateGradient(size, colors, kRotation); + if (!circle) { + return gradient; + } else if (style::DevicePixelRatio() == 1) { + return Images::Circle(std::move(gradient)); + } + auto image = QImage( + size * style::DevicePixelRatio(), + QImage::Format_ARGB32_Premultiplied); + image.setDevicePixelRatio(style::DevicePixelRatio()); + image.fill(Qt::transparent); + { + auto p = QPainter(&image); + p.drawImage(QRect(QPoint(), size), gradient); + } + return Images::Circle(std::move(image)); +} + +} // 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 new file mode 100644 index 000000000..ddec34fb0 --- /dev/null +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h @@ -0,0 +1,29 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace UserpicBuilder { + +[[nodiscard]] QImage GenerateGradient( + const QSize &size, + const std::vector &colors, + bool circle = true); + +struct StartData { + DocumentId documentId = DocumentId(0); + int builderColorIndex = 0; + std::vector gradientEditorColors; +}; + +template +struct BothWayCommunication { + rpl::producer<> triggers; + Fn result; +}; + +} // namespace UserpicBuilder 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 da5ba09bc..7d454b242 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 @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_document.h" #include "data/data_session.h" #include "info/userpic/info_userpic_emoji_builder.h" +#include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_widget.h" #include "lang/lang_keys.h" #include "main/main_session.h" 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 ed803fd6d..ea95c88dc 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "editor/photo_editor_layer_widget.h" // Editor::kProfilePhotoSize. #include "info/userpic/info_userpic_bubble_wrap.h" #include "info/userpic/info_userpic_colors_palette_chooser.h" +#include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_preview.h" #include "lang/lang_keys.h" #include "main/main_session.h" @@ -241,7 +242,7 @@ not_null CreateUserpicBuilder( not_null parent, not_null controller, StartData data, - BothWayCommunication communication) { + BothWayCommunication communication) { const auto container = Ui::CreateChild(parent.get()); const auto preview = container->add( @@ -273,7 +274,7 @@ not_null CreateUserpicBuilder( const auto palette = Ui::CreateChild( paletteBg.get(), - data.colorIndex); + data.builderColorIndex); palette->stopsValue( ) | rpl::start_with_next([=](QGradientStops stops) { preview->setGradientStops(std::move(stops)); 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 b6df3b4d0..24306290d 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h @@ -18,21 +18,16 @@ class SessionController; namespace UserpicBuilder { -struct StartData { - DocumentId documentId = DocumentId(0); - int colorIndex = 0; -}; +struct StartData; -struct BothWayCommunication { - rpl::producer<> triggers; - Fn result; -}; +template +struct BothWayCommunication; not_null CreateUserpicBuilder( not_null parent, not_null controller, StartData data, - BothWayCommunication communication); + BothWayCommunication communication); [[nodiscard]] not_null CreateEmojiUserpic( not_null parent,