From d4247511355a666903e9a57d821b1eb58884aade Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 12 Feb 2024 14:50:04 +0400 Subject: [PATCH] Ui::DynamicImage / Ui::CustomEmoji::DynamicImageEmoji. --- CMakeLists.txt | 1 + ui/dynamic_image.h | 19 ++++++++++++ ui/text/custom_emoji_instance.cpp | 51 +++++++++++++++++++++++++++++++ ui/text/custom_emoji_instance.h | 27 ++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 ui/dynamic_image.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 281dbb6..6646223 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,6 +273,7 @@ PRIVATE ui/delayed_activation.h ui/dragging_scroll_manager.cpp ui/dragging_scroll_manager.h + ui/dynamic_image.h ui/emoji_config.cpp ui/emoji_config.h ui/focus_persister.h diff --git a/ui/dynamic_image.h b/ui/dynamic_image.h new file mode 100644 index 0000000..6c62830 --- /dev/null +++ b/ui/dynamic_image.h @@ -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 callback) = 0; +}; + +} // namespace Ui diff --git a/ui/text/custom_emoji_instance.cpp b/ui/text/custom_emoji_instance.cpp index 279ac85..1e1acac 100644 --- a/ui/text/custom_emoji_instance.cpp +++ b/ui/text/custom_emoji_instance.cpp @@ -8,6 +8,7 @@ #include "ui/effects/animation_value.h" #include "ui/effects/frame_generator.h" +#include "ui/dynamic_image.h" #include "ui/ui_utility.h" #include "ui/painter.h" @@ -903,4 +904,54 @@ bool Internal::readyInDefaultState() { return true; } +DynamicImageEmoji::DynamicImageEmoji( + QString entityData, + std::shared_ptr image, + Fn 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 diff --git a/ui/text/custom_emoji_instance.h b/ui/text/custom_emoji_instance.h index be56c2d..337e8b6 100644 --- a/ui/text/custom_emoji_instance.h +++ b/ui/text/custom_emoji_instance.h @@ -17,6 +17,7 @@ class QColor; class QPainter; namespace Ui { +class DynamicImage; class FrameGenerator; } // namespace Ui @@ -296,4 +297,30 @@ private: }; +class DynamicImageEmoji final : public Ui::Text::CustomEmoji { +public: + DynamicImageEmoji( + QString entityData, + std::shared_ptr image, + Fn 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 _image; + const Fn _repaint; + const QMargins _padding; + const int _size = 0; + bool _subscribed = false; + +}; + } // namespace Ui::CustomEmoji