diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_colors_editor.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_colors_editor.cpp index bfef7d0c5..725223faa 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_colors_editor.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_colors_editor.cpp @@ -241,7 +241,8 @@ object_ptr CreateGradientEditor( container, object_ptr( container, - Size(st::defaultUserpicButton.photoSize))))->entity(); + Size(st::defaultUserpicButton.photoSize), + false)))->entity(); preview->setDuration(0); if (document) { preview->setDocument(document); diff --git a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp index bc4e3d0e2..6ddbf4adf 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.cpp @@ -8,19 +8,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/userpic/info_userpic_emoji_builder_common.h" #include "ui/image/image_prepare.h" +#include "ui/userpic_view.h" // ForumUserpicRadiusMultiplier. namespace UserpicBuilder { [[nodiscard]] QImage GenerateGradient( const QSize &size, const std::vector &colors, - bool circle) { + bool circle, + bool roundForumRect) { constexpr auto kRotation = int(45); auto gradient = Images::GenerateGradient(size, colors, kRotation); - if (!circle) { + if (!circle && !roundForumRect) { return gradient; - } else if (style::DevicePixelRatio() == 1) { - return Images::Circle(std::move(gradient)); + } + const auto processModifier = [&](QImage &&i) { + if (circle) { + return Images::Circle(std::move(i)); + } else if (roundForumRect) { + const auto radius = std::min(i.height(), i.width()) + * Ui::ForumUserpicRadiusMultiplier(); + return Images::Round( + std::move(i), + Images::CornersMask(radius / style::DevicePixelRatio())); + } + }; + if (style::DevicePixelRatio() == 1) { + return processModifier(std::move(gradient)); } auto image = QImage( size * style::DevicePixelRatio(), @@ -31,7 +45,7 @@ namespace UserpicBuilder { auto p = QPainter(&image); p.drawImage(QRect(QPoint(), size), gradient); } - return Images::Circle(std::move(image)); + return processModifier(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 index e28b2c9e9..3b8b66bdf 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_common.h @@ -18,13 +18,15 @@ struct Result { [[nodiscard]] QImage GenerateGradient( const QSize &size, const std::vector &colors, - bool circle = true); + bool circle = true, + bool roundForumRect = false); struct StartData { DocumentId documentId = DocumentId(0); int builderColorIndex = 0; rpl::producer> documents; std::vector gradientEditorColors; + bool isForum = false; }; template 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 a21740df1..2c990658b 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,8 @@ void AddEmojiBuilderAction( not_null controller, not_null menu, rpl::producer> documents, - Fn &&done) { + Fn &&done, + bool isForum) { constexpr auto kTimeout = crl::time(1500); struct State final { State() { @@ -75,7 +76,7 @@ void AddEmojiBuilderAction( : 0; UserpicBuilder::ShowLayer( controller, - { id, state->colorIndex.current(), docs }, + { id, state->colorIndex.current(), docs, {}, isForum }, base::duplicate(done)); }), nullptr, @@ -103,7 +104,8 @@ void AddEmojiBuilderAction( state->documentShown(); return d; }), - state->colorIndex.value()); + state->colorIndex.value(), + isForum); icon->setAttribute(Qt::WA_TransparentForMouseEvents); icon->move(menu->st().menu.itemIconPosition + QPoint( 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 70d9049b2..89d3f6cba 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 @@ -23,6 +23,7 @@ void AddEmojiBuilderAction( not_null controller, not_null menu, rpl::producer> documents, - Fn &&done); + Fn &&done, + bool isForum); } // 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 a955479a7..01f026ecf 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.cpp @@ -161,8 +161,12 @@ bool PreviewPainter::paintForeground(QPainter &p) { return false; } -EmojiUserpic::EmojiUserpic(not_null parent, const QSize &size) +EmojiUserpic::EmojiUserpic( + not_null parent, + const QSize &size, + bool isForum) : Ui::RpWidget(parent) +, _forum(isForum) , _painter(size.width()) , _duration(st::slideWrapDuration) { resize(size); @@ -205,11 +209,11 @@ void EmojiUserpic::setGradientColors(std::vector colors) { return; } if (const auto colors = base::take(_colors); !colors.empty()) { - _previousImage = GenerateGradient(size(), colors); + _previousImage = GenerateGradient(size(), colors, !_forum, _forum); } _colors = std::move(colors); { - _image = GenerateGradient(size(), _colors); + _image = GenerateGradient(size(), _colors, !_forum, _forum); } if (_duration) { _animation.stop(); 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 26e1ff43b..13561ac79 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_preview.h @@ -59,7 +59,10 @@ private: class EmojiUserpic final : public Ui::RpWidget { public: - EmojiUserpic(not_null parent, const QSize &size); + EmojiUserpic( + not_null parent, + const QSize &size, + bool isForum); void result(int size, Fn done); void setGradientColors(std::vector colors); @@ -70,6 +73,7 @@ protected: void paintEvent(QPaintEvent *event) override; private: + const bool _forum; PreviewPainter _painter; std::optional _playOnce; 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 43a15a264..d7d6341a5 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.cpp @@ -367,7 +367,8 @@ not_null CreateUserpicBuilder( container, object_ptr( container, - Size(st::settingsInfoPhotoSize))), + Size(st::settingsInfoPhotoSize), + data.isForum)), st::userpicBuilderEmojiPreviewPadding)->entity(); if (const auto id = data.documentId) { if (const auto document = controller->session().data().document(id)) { @@ -504,8 +505,12 @@ not_null CreateEmojiUserpic( not_null parent, const QSize &size, rpl::producer> document, - rpl::producer colorIndex) { - const auto widget = Ui::CreateChild(parent.get(), size); + rpl::producer colorIndex, + bool isForum) { + const auto widget = Ui::CreateChild( + parent.get(), + size, + isForum); std::move( document ) | rpl::start_with_next([=](not_null d) { 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 4a572b077..dab1b9272 100644 --- a/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h +++ b/Telegram/SourceFiles/info/userpic/info_userpic_emoji_builder_widget.h @@ -34,6 +34,7 @@ not_null CreateUserpicBuilder( not_null parent, const QSize &size, rpl::producer> document, - rpl::producer colorIndex); + rpl::producer colorIndex, + bool isForum); } // namespace UserpicBuilder diff --git a/Telegram/SourceFiles/ui/controls/userpic_button.cpp b/Telegram/SourceFiles/ui/controls/userpic_button.cpp index 34d8518e2..c6cc91998 100644 --- a/Telegram/SourceFiles/ui/controls/userpic_button.cpp +++ b/Telegram/SourceFiles/ui/controls/userpic_button.cpp @@ -335,7 +335,8 @@ void UserpicButton::choosePhotoLocally() { _controller->session().api().peerPhoto().emojiListValue(user ? Api::PeerPhoto::EmojiListType::Profile : Api::PeerPhoto::EmojiListType::Group), - done); + done, + _peer ? _peer->isForum() : false); }; _menu = base::make_unique_q( this, diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 5535a3fe5..51fd4a050 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 5535a3fe5720272015dea2ff608bb759634ba7e5 +Subproject commit 51fd4a0509e8a2aaa4cc7875fdb7afb0b52989de