Ui::DynamicImage / Ui::CustomEmoji::DynamicImageEmoji.

This commit is contained in:
John Preston 2024-02-12 14:50:04 +04:00
parent 7328e27862
commit d424751135
4 changed files with 98 additions and 0 deletions

View file

@ -273,6 +273,7 @@ PRIVATE
ui/delayed_activation.h ui/delayed_activation.h
ui/dragging_scroll_manager.cpp ui/dragging_scroll_manager.cpp
ui/dragging_scroll_manager.h ui/dragging_scroll_manager.h
ui/dynamic_image.h
ui/emoji_config.cpp ui/emoji_config.cpp
ui/emoji_config.h ui/emoji_config.h
ui/focus_persister.h ui/focus_persister.h

19
ui/dynamic_image.h Normal file
View file

@ -0,0 +1,19 @@
// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#pragma once
namespace Ui {
class DynamicImage {
public:
virtual ~DynamicImage() = default;
[[nodiscard]] virtual QImage image(int size) = 0;
virtual void subscribeToUpdates(Fn<void()> callback) = 0;
};
} // namespace Ui

View file

@ -8,6 +8,7 @@
#include "ui/effects/animation_value.h" #include "ui/effects/animation_value.h"
#include "ui/effects/frame_generator.h" #include "ui/effects/frame_generator.h"
#include "ui/dynamic_image.h"
#include "ui/ui_utility.h" #include "ui/ui_utility.h"
#include "ui/painter.h" #include "ui/painter.h"
@ -903,4 +904,54 @@ bool Internal::readyInDefaultState() {
return true; return true;
} }
DynamicImageEmoji::DynamicImageEmoji(
QString entityData,
std::shared_ptr<DynamicImage> image,
Fn<void()> repaint,
QMargins padding,
int size)
: _entityData(entityData)
, _image(std::move(image))
, _repaint(std::move(repaint))
, _padding(padding)
, _size(size) {
}
int DynamicImageEmoji::width() {
return _padding.left() + _size + _padding.right();
}
QString DynamicImageEmoji::entityData() {
return _entityData;
}
void DynamicImageEmoji::paint(QPainter &p, const Context &context) {
if (!_subscribed) {
_subscribed = true;
_image->subscribeToUpdates(_repaint);
}
const auto rect = QRect(
context.position + QPoint(_padding.left(), _padding.top()),
QSize(_size, _size));
auto image = _image->image(_size);
context.internal.colorized = false;
PaintScaledImage(p, rect, { &image }, context);
}
void DynamicImageEmoji::unload() {
if (_subscribed) {
_subscribed = false;
_image->subscribeToUpdates(nullptr);
}
}
bool DynamicImageEmoji::ready() {
return true;
}
bool DynamicImageEmoji::readyInDefaultState() {
return true;
}
} // namespace Ui::CustomEmoji } // namespace Ui::CustomEmoji

View file

@ -17,6 +17,7 @@ class QColor;
class QPainter; class QPainter;
namespace Ui { namespace Ui {
class DynamicImage;
class FrameGenerator; class FrameGenerator;
} // namespace Ui } // namespace Ui
@ -296,4 +297,30 @@ private:
}; };
class DynamicImageEmoji final : public Ui::Text::CustomEmoji {
public:
DynamicImageEmoji(
QString entityData,
std::shared_ptr<DynamicImage> image,
Fn<void()> repaint,
QMargins padding,
int size);
int width() override;
QString entityData() override;
void paint(QPainter &p, const Context &context) override;
void unload() override;
bool ready() override;
bool readyInDefaultState() override;
private:
const QString _entityData;
const std::shared_ptr<DynamicImage> _image;
const Fn<void()> _repaint;
const QMargins _padding;
const int _size = 0;
bool _subscribed = false;
};
} // namespace Ui::CustomEmoji } // namespace Ui::CustomEmoji