Respected forum userpic type in userpic emoji builder.

This commit is contained in:
23rd 2023-01-31 23:41:16 +03:00 committed by John Preston
parent 1026f41da8
commit 7a63246e6c
11 changed files with 56 additions and 21 deletions

View file

@ -241,7 +241,8 @@ object_ptr<Ui::RpWidget> CreateGradientEditor(
container, container,
object_ptr<EmojiUserpic>( object_ptr<EmojiUserpic>(
container, container,
Size(st::defaultUserpicButton.photoSize))))->entity(); Size(st::defaultUserpicButton.photoSize),
false)))->entity();
preview->setDuration(0); preview->setDuration(0);
if (document) { if (document) {
preview->setDocument(document); preview->setDocument(document);

View file

@ -8,19 +8,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "info/userpic/info_userpic_emoji_builder_common.h" #include "info/userpic/info_userpic_emoji_builder_common.h"
#include "ui/image/image_prepare.h" #include "ui/image/image_prepare.h"
#include "ui/userpic_view.h" // ForumUserpicRadiusMultiplier.
namespace UserpicBuilder { namespace UserpicBuilder {
[[nodiscard]] QImage GenerateGradient( [[nodiscard]] QImage GenerateGradient(
const QSize &size, const QSize &size,
const std::vector<QColor> &colors, const std::vector<QColor> &colors,
bool circle) { bool circle,
bool roundForumRect) {
constexpr auto kRotation = int(45); constexpr auto kRotation = int(45);
auto gradient = Images::GenerateGradient(size, colors, kRotation); auto gradient = Images::GenerateGradient(size, colors, kRotation);
if (!circle) { if (!circle && !roundForumRect) {
return gradient; 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( auto image = QImage(
size * style::DevicePixelRatio(), size * style::DevicePixelRatio(),
@ -31,7 +45,7 @@ namespace UserpicBuilder {
auto p = QPainter(&image); auto p = QPainter(&image);
p.drawImage(QRect(QPoint(), size), gradient); p.drawImage(QRect(QPoint(), size), gradient);
} }
return Images::Circle(std::move(image)); return processModifier(std::move(image));
} }
} // namespace UserpicBuilder } // namespace UserpicBuilder

View file

@ -18,13 +18,15 @@ struct Result {
[[nodiscard]] QImage GenerateGradient( [[nodiscard]] QImage GenerateGradient(
const QSize &size, const QSize &size,
const std::vector<QColor> &colors, const std::vector<QColor> &colors,
bool circle = true); bool circle = true,
bool roundForumRect = false);
struct StartData { struct StartData {
DocumentId documentId = DocumentId(0); DocumentId documentId = DocumentId(0);
int builderColorIndex = 0; int builderColorIndex = 0;
rpl::producer<std::vector<DocumentId>> documents; rpl::producer<std::vector<DocumentId>> documents;
std::vector<QColor> gradientEditorColors; std::vector<QColor> gradientEditorColors;
bool isForum = false;
}; };
template <typename Result> template <typename Result>

View file

@ -32,7 +32,8 @@ 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(UserpicBuilder::Result)> &&done) { Fn<void(UserpicBuilder::Result)> &&done,
bool isForum) {
constexpr auto kTimeout = crl::time(1500); constexpr auto kTimeout = crl::time(1500);
struct State final { struct State final {
State() { State() {
@ -75,7 +76,7 @@ void AddEmojiBuilderAction(
: 0; : 0;
UserpicBuilder::ShowLayer( UserpicBuilder::ShowLayer(
controller, controller,
{ id, state->colorIndex.current(), docs }, { id, state->colorIndex.current(), docs, {}, isForum },
base::duplicate(done)); base::duplicate(done));
}), }),
nullptr, nullptr,
@ -103,7 +104,8 @@ void AddEmojiBuilderAction(
state->documentShown(); state->documentShown();
return d; return d;
}), }),
state->colorIndex.value()); state->colorIndex.value(),
isForum);
icon->setAttribute(Qt::WA_TransparentForMouseEvents); icon->setAttribute(Qt::WA_TransparentForMouseEvents);
icon->move(menu->st().menu.itemIconPosition icon->move(menu->st().menu.itemIconPosition
+ QPoint( + QPoint(

View file

@ -23,6 +23,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(UserpicBuilder::Result)> &&done); Fn<void(UserpicBuilder::Result)> &&done,
bool isForum);
} // namespace UserpicBuilder } // namespace UserpicBuilder

View file

@ -161,8 +161,12 @@ bool PreviewPainter::paintForeground(QPainter &p) {
return false; return false;
} }
EmojiUserpic::EmojiUserpic(not_null<Ui::RpWidget*> parent, const QSize &size) EmojiUserpic::EmojiUserpic(
not_null<Ui::RpWidget*> parent,
const QSize &size,
bool isForum)
: Ui::RpWidget(parent) : Ui::RpWidget(parent)
, _forum(isForum)
, _painter(size.width()) , _painter(size.width())
, _duration(st::slideWrapDuration) { , _duration(st::slideWrapDuration) {
resize(size); resize(size);
@ -205,11 +209,11 @@ void EmojiUserpic::setGradientColors(std::vector<QColor> colors) {
return; return;
} }
if (const auto colors = base::take(_colors); !colors.empty()) { if (const auto colors = base::take(_colors); !colors.empty()) {
_previousImage = GenerateGradient(size(), colors); _previousImage = GenerateGradient(size(), colors, !_forum, _forum);
} }
_colors = std::move(colors); _colors = std::move(colors);
{ {
_image = GenerateGradient(size(), _colors); _image = GenerateGradient(size(), _colors, !_forum, _forum);
} }
if (_duration) { if (_duration) {
_animation.stop(); _animation.stop();

View file

@ -59,7 +59,10 @@ private:
class EmojiUserpic final : public Ui::RpWidget { 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,
bool isForum);
void result(int size, Fn<void(UserpicBuilder::Result)> done); void result(int size, Fn<void(UserpicBuilder::Result)> done);
void setGradientColors(std::vector<QColor> colors); void setGradientColors(std::vector<QColor> colors);
@ -70,6 +73,7 @@ protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
private: private:
const bool _forum;
PreviewPainter _painter; PreviewPainter _painter;
std::optional<bool> _playOnce; std::optional<bool> _playOnce;

View file

@ -367,7 +367,8 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
container, container,
object_ptr<EmojiUserpic>( object_ptr<EmojiUserpic>(
container, container,
Size(st::settingsInfoPhotoSize))), Size(st::settingsInfoPhotoSize),
data.isForum)),
st::userpicBuilderEmojiPreviewPadding)->entity(); st::userpicBuilderEmojiPreviewPadding)->entity();
if (const auto id = data.documentId) { if (const auto id = data.documentId) {
if (const auto document = controller->session().data().document(id)) { if (const auto document = controller->session().data().document(id)) {
@ -504,8 +505,12 @@ not_null<Ui::RpWidget*> CreateEmojiUserpic(
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,
const QSize &size, const QSize &size,
rpl::producer<not_null<DocumentData*>> document, rpl::producer<not_null<DocumentData*>> document,
rpl::producer<int> colorIndex) { rpl::producer<int> colorIndex,
const auto widget = Ui::CreateChild<EmojiUserpic>(parent.get(), size); bool isForum) {
const auto widget = Ui::CreateChild<EmojiUserpic>(
parent.get(),
size,
isForum);
std::move( std::move(
document document
) | rpl::start_with_next([=](not_null<DocumentData*> d) { ) | rpl::start_with_next([=](not_null<DocumentData*> d) {

View file

@ -34,6 +34,7 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,
const QSize &size, const QSize &size,
rpl::producer<not_null<DocumentData*>> document, rpl::producer<not_null<DocumentData*>> document,
rpl::producer<int> colorIndex); rpl::producer<int> colorIndex,
bool isForum);
} // namespace UserpicBuilder } // namespace UserpicBuilder

View file

@ -335,7 +335,8 @@ void UserpicButton::choosePhotoLocally() {
_controller->session().api().peerPhoto().emojiListValue(user _controller->session().api().peerPhoto().emojiListValue(user
? Api::PeerPhoto::EmojiListType::Profile ? Api::PeerPhoto::EmojiListType::Profile
: Api::PeerPhoto::EmojiListType::Group), : Api::PeerPhoto::EmojiListType::Group),
done); done,
_peer ? _peer->isForum() : false);
}; };
_menu = base::make_unique_q<Ui::PopupMenu>( _menu = base::make_unique_q<Ui::PopupMenu>(
this, this,

@ -1 +1 @@
Subproject commit 5535a3fe5720272015dea2ff608bb759634ba7e5 Subproject commit 51fd4a0509e8a2aaa4cc7875fdb7afb0b52989de