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,
object_ptr<EmojiUserpic>(
container,
Size(st::defaultUserpicButton.photoSize))))->entity();
Size(st::defaultUserpicButton.photoSize),
false)))->entity();
preview->setDuration(0);
if (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 "ui/image/image_prepare.h"
#include "ui/userpic_view.h" // ForumUserpicRadiusMultiplier.
namespace UserpicBuilder {
[[nodiscard]] QImage GenerateGradient(
const QSize &size,
const std::vector<QColor> &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

View file

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

View file

@ -32,7 +32,8 @@ void AddEmojiBuilderAction(
not_null<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
rpl::producer<std::vector<DocumentId>> documents,
Fn<void(UserpicBuilder::Result)> &&done) {
Fn<void(UserpicBuilder::Result)> &&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(

View file

@ -23,6 +23,7 @@ void AddEmojiBuilderAction(
not_null<Window::SessionController*> controller,
not_null<Ui::PopupMenu*> menu,
rpl::producer<std::vector<DocumentId>> documents,
Fn<void(UserpicBuilder::Result)> &&done);
Fn<void(UserpicBuilder::Result)> &&done,
bool isForum);
} // namespace UserpicBuilder

View file

@ -161,8 +161,12 @@ bool PreviewPainter::paintForeground(QPainter &p) {
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)
, _forum(isForum)
, _painter(size.width())
, _duration(st::slideWrapDuration) {
resize(size);
@ -205,11 +209,11 @@ void EmojiUserpic::setGradientColors(std::vector<QColor> 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();

View file

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

View file

@ -367,7 +367,8 @@ not_null<Ui::VerticalLayout*> CreateUserpicBuilder(
container,
object_ptr<EmojiUserpic>(
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<Ui::RpWidget*> CreateEmojiUserpic(
not_null<Ui::RpWidget*> parent,
const QSize &size,
rpl::producer<not_null<DocumentData*>> document,
rpl::producer<int> colorIndex) {
const auto widget = Ui::CreateChild<EmojiUserpic>(parent.get(), size);
rpl::producer<int> colorIndex,
bool isForum) {
const auto widget = Ui::CreateChild<EmojiUserpic>(
parent.get(),
size,
isForum);
std::move(
document
) | rpl::start_with_next([=](not_null<DocumentData*> d) {

View file

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

View file

@ -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<Ui::PopupMenu>(
this,

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