summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-08-27 20:32:51 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-08-27 20:32:51 +1000
commit4f60c07e0540f89654b469d134095c37e238d3e8 (patch)
tree6853439cce6933475898c608d4d846fd91fde6f5 /plugin
parentinternal: move notif icon lower (diff)
downloadcaelestia-shell-4f60c07e0540f89654b469d134095c37e238d3e8.tar.gz
caelestia-shell-4f60c07e0540f89654b469d134095c37e238d3e8.tar.bz2
caelestia-shell-4f60c07e0540f89654b469d134095c37e238d3e8.zip
plugin: create caching image manager
No need for external proc
Diffstat (limited to 'plugin')
-rw-r--r--plugin/src/Caelestia/CMakeLists.txt1
-rw-r--r--plugin/src/Caelestia/cachingimagemanager.cpp122
-rw-r--r--plugin/src/Caelestia/cachingimagemanager.hpp57
-rw-r--r--plugin/src/Caelestia/cutils.hpp3
4 files changed, 182 insertions, 1 deletions
diff --git a/plugin/src/Caelestia/CMakeLists.txt b/plugin/src/Caelestia/CMakeLists.txt
index 61d7f7e..3ea0225 100644
--- a/plugin/src/Caelestia/CMakeLists.txt
+++ b/plugin/src/Caelestia/CMakeLists.txt
@@ -3,6 +3,7 @@ qt_add_qml_module(caelestia
VERSION 0.1
SOURCES
cutils.hpp cutils.cpp
+ cachingimagemanager.hpp cachingimagemanager.cpp
)
qt_query_qml_module(caelestia
diff --git a/plugin/src/Caelestia/cachingimagemanager.cpp b/plugin/src/Caelestia/cachingimagemanager.cpp
new file mode 100644
index 0000000..d557203
--- /dev/null
+++ b/plugin/src/Caelestia/cachingimagemanager.cpp
@@ -0,0 +1,122 @@
+#include "cachingimagemanager.hpp"
+
+#include <qobject.h>
+#include <QtQuick/QQuickItem>
+#include <QtQuick/QQuickWindow>
+#include <QCryptographicHash>
+#include <QThreadPool>
+#include <QFile>
+
+qreal CachingImageManager::effectiveScale() const {
+ if (m_item->window() && m_item->window()->screen()) {
+ return m_item->window()->screen()->devicePixelRatio();
+ }
+
+ return 1.0;
+}
+
+int CachingImageManager::effectiveWidth() const {
+ int width = std::ceil(m_item->width() * effectiveScale());
+ m_item->setProperty("sourceWidth", width);
+ return width;
+}
+
+int CachingImageManager::effectiveHeight() const {
+ int height = std::ceil(m_item->height() * effectiveScale());
+ m_item->setProperty("sourceHeight", height);
+ return height;
+}
+
+QQuickItem* CachingImageManager::item() const {
+ return m_item;
+}
+
+void CachingImageManager::setItem(QQuickItem* item) {
+ if (m_item == item) {
+ return;
+ }
+
+ m_item = item;
+ emit itemChanged();
+}
+
+QUrl CachingImageManager::cacheDir() const {
+ return m_cacheDir;
+}
+
+void CachingImageManager::setCacheDir(const QUrl& cacheDir) {
+ if (m_cacheDir == cacheDir) {
+ return;
+ }
+
+ m_cacheDir = cacheDir;
+ emit cacheDirChanged();
+}
+
+QString CachingImageManager::path() const {
+ return m_path;
+}
+
+void CachingImageManager::setPath(const QString& path) {
+ if (m_path == path) {
+ return;
+ }
+
+ m_path = path;
+ emit pathChanged();
+
+ if (!path.isEmpty()) {
+ QThreadPool::globalInstance()->start([path, this] {
+ const QString filename = QString("%1@%2x%3.png")
+ .arg(sha256sum(path))
+ .arg(effectiveWidth())
+ .arg(effectiveHeight());
+
+ m_cachePath = m_cacheDir.resolved(QUrl(filename));
+ emit cachePathChanged();
+
+ if (!m_cachePath.isLocalFile()) {
+ qWarning() << "CachingImageManager::setPath: cachePath" << m_cachePath << "is not a local file";
+ return;
+ }
+
+ if (QFile::exists(m_cachePath.toLocalFile())) {
+ QMetaObject::invokeMethod(m_item, [this]() {
+ m_item->setProperty("source", m_cachePath);
+ }, Qt::QueuedConnection);
+
+ m_usingCache = true;
+ emit usingCacheChanged();
+ } else {
+ QMetaObject::invokeMethod(m_item, [path, this]() {
+ m_item->setProperty("source", QUrl::fromLocalFile(path));
+ }, Qt::QueuedConnection);
+
+ m_usingCache = false;
+ emit usingCacheChanged();
+ }
+ });
+ }
+}
+
+QUrl CachingImageManager::cachePath() const {
+ return m_cachePath;
+}
+
+bool CachingImageManager::usingCache() const {
+ return m_usingCache;
+}
+
+QString CachingImageManager::sha256sum(const QString& path) const {
+ QFile file(path);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qWarning() << "CachingImageManager::sha256sum: failed to open" << path;
+ return "";
+ }
+
+ QCryptographicHash hash(QCryptographicHash::Sha256);
+ hash.addData(&file);
+ file.close();
+
+ return hash.result().toHex();
+}
diff --git a/plugin/src/Caelestia/cachingimagemanager.hpp b/plugin/src/Caelestia/cachingimagemanager.hpp
new file mode 100644
index 0000000..e2cbd41
--- /dev/null
+++ b/plugin/src/Caelestia/cachingimagemanager.hpp
@@ -0,0 +1,57 @@
+#pragma once
+
+#include <qobject.h>
+#include <qqmlintegration.h>
+#include <QtQuick/QQuickItem>
+
+class CachingImageManager : public QObject {
+ Q_OBJECT;
+ QML_ELEMENT;
+
+ Q_PROPERTY(QQuickItem* item READ item WRITE setItem NOTIFY itemChanged REQUIRED);
+ Q_PROPERTY(QUrl cacheDir READ cacheDir WRITE setCacheDir NOTIFY cacheDirChanged REQUIRED);
+
+ Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged);
+ Q_PROPERTY(QUrl cachePath READ cachePath NOTIFY cachePathChanged);
+ Q_PROPERTY(bool usingCache READ usingCache NOTIFY usingCacheChanged);
+
+public:
+ explicit CachingImageManager(QObject* parent = nullptr): QObject(parent) {};
+
+ [[nodiscard]] QQuickItem* item() const;
+ void setItem(QQuickItem* item);
+
+ [[nodiscard]] QUrl cacheDir() const;
+ void setCacheDir(const QUrl& cacheDir);
+
+ [[nodiscard]] QString path() const;
+ void setPath(const QString& path);
+
+ [[nodiscard]] QUrl cachePath() const;
+ [[nodiscard]] bool usingCache() const;
+
+signals:
+ void itemChanged();
+ void cacheDirChanged();
+
+ void pathChanged();
+ void cachePathChanged();
+ void usingCacheChanged();
+
+private slots:
+ void handleStatusChanged();
+
+private:
+ QQuickItem* m_item;
+ QUrl m_cacheDir;
+
+ QString m_path;
+ QUrl m_cachePath;
+ bool m_usingCache;
+
+ [[nodiscard]] qreal effectiveScale() const;
+ int effectiveWidth() const;
+ int effectiveHeight() const;
+
+ [[nodiscard]] QString sha256sum(const QString& path) const;
+};
diff --git a/plugin/src/Caelestia/cutils.hpp b/plugin/src/Caelestia/cutils.hpp
index e1319a4..76beb2b 100644
--- a/plugin/src/Caelestia/cutils.hpp
+++ b/plugin/src/Caelestia/cutils.hpp
@@ -1,11 +1,12 @@
#pragma once
#include <qobject.h>
+#include <qqmlintegration.h>
#include <QtQuick/QQuickItem>
class CUtils : public QObject {
Q_OBJECT;
- QML_NAMED_ELEMENT(CUtils);
+ QML_ELEMENT;
QML_SINGLETON;
public: