mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-18 23:27:09 +02:00
Respected forum userpic type in userpic emoji builder.
This commit is contained in:
parent
1026f41da8
commit
7a63246e6c
11 changed files with 56 additions and 21 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue