From 802803cd07f2adb93f3a61dd9ad2939430b07feb Mon Sep 17 00:00:00 2001 From: Roy Shilkrot Date: Thu, 16 May 2024 23:08:06 -0400 Subject: [PATCH] Add image fetching from HTML template (#96) --- CMakeLists.txt | 5 ++-- src/ui/CustomTextDocument.cpp | 45 +++++++++++++++++++++++++++++++++++ src/ui/CustomTextDocument.h | 22 +++++++++++++++++ src/ui/text-render-helper.cpp | 4 ++-- 4 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/ui/CustomTextDocument.cpp create mode 100644 src/ui/CustomTextDocument.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c94b80..5c6e66a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,8 +22,8 @@ if(ENABLE_FRONTEND_API) endif() if(ENABLE_QT) - find_qt(COMPONENTS Widgets Core) - target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt::Core Qt::Widgets) + find_qt(COMPONENTS Widgets Core Network) + target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt::Core Qt::Widgets Qt::Network) target_compile_options( ${CMAKE_PROJECT_NAME} PRIVATE $<$:-Wno-quoted-include-in-framework-header -Wno-comma>) @@ -76,6 +76,7 @@ target_sources( src/obs-source-util.cpp src/mapping-data.cpp src/request-data.cpp + src/ui/CustomTextDocument.cpp src/ui/RequestBuilder.cpp src/ui/text-render-helper.cpp src/ui/outputmapping.cpp diff --git a/src/ui/CustomTextDocument.cpp b/src/ui/CustomTextDocument.cpp new file mode 100644 index 0000000..70e0402 --- /dev/null +++ b/src/ui/CustomTextDocument.cpp @@ -0,0 +1,45 @@ +#include "CustomTextDocument.h" + +#include "plugin-support.h" +#include "request-data.h" + +#include +#include +#include +#include + +#include + +// Initialize the static member +QHash CustomTextDocument::imageCache; + +CustomTextDocument::CustomTextDocument(QObject *parent) : QTextDocument(parent) {} + +QVariant CustomTextDocument::loadResource(int type, const QUrl &name) +{ + if (type == QTextDocument::ImageResource) { + if (imageCache.contains(name)) { + return QVariant(imageCache.value(name)); + } + obs_log(LOG_INFO, "fetch %s", name.toString().toStdString().c_str()); + std::string mime_type; + std::vector image_bytes = + fetch_image(name.toString().toStdString(), mime_type); + // Create a QByteArray from the std::vector + QByteArray imageData(reinterpret_cast(image_bytes.data()), + image_bytes.size()); + QBuffer buffer(&imageData); + buffer.open(QIODevice::ReadOnly); + QImageReader reader(&buffer); + reader.setDecideFormatFromContent(true); + QImage image = reader.read(); + if (!image.isNull()) { + imageCache[name] = image; + return image; + } + obs_log(LOG_ERROR, "Unable to load image from: %s", + name.toString().toStdString().c_str()); + return QVariant(); + } + return QTextDocument::loadResource(type, name); +} diff --git a/src/ui/CustomTextDocument.h b/src/ui/CustomTextDocument.h new file mode 100644 index 0000000..883d5d1 --- /dev/null +++ b/src/ui/CustomTextDocument.h @@ -0,0 +1,22 @@ +#ifndef CUSTOMTEXTDOCUMENT_H +#define CUSTOMTEXTDOCUMENT_H + +#include +#include +#include +#include + +class CustomTextDocument : public QTextDocument { + Q_OBJECT + +public: + CustomTextDocument(QObject *parent = nullptr); + +protected: + QVariant loadResource(int type, const QUrl &name) override; + +private: + static QHash imageCache; // Static member for the cache +}; + +#endif // CUSTOMTEXTDOCUMENT_H diff --git a/src/ui/text-render-helper.cpp b/src/ui/text-render-helper.cpp index a038e52..ce25cb2 100644 --- a/src/ui/text-render-helper.cpp +++ b/src/ui/text-render-helper.cpp @@ -1,4 +1,4 @@ -#include +#include "CustomTextDocument.h" #include const QString template_text = R"( @@ -108,7 +108,7 @@ void render_text_with_qtextdocument(const std::string &text, uint32_t &width, ui QString html = QString(template_text) .replace("{{text}}", QString::fromStdString(text)) .replace("{{css_props}}", QString::fromStdString(css_props)); - QTextDocument textDocument; + CustomTextDocument textDocument; textDocument.setHtml(html); textDocument.setTextWidth(width);