From bec98e1fc5a25e68e3cc7bf7585c092a82a40633 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:29:11 +1000 Subject: plugin: better getDominantColour Use callback instead of setting prop --- components/effects/ColouredIcon.qml | 6 +++--- plugin/src/Caelestia/cutils.cpp | 17 +++++++++-------- plugin/src/Caelestia/cutils.hpp | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/components/effects/ColouredIcon.qml b/components/effects/ColouredIcon.qml index a858c25..b711b88 100644 --- a/components/effects/ColouredIcon.qml +++ b/components/effects/ColouredIcon.qml @@ -19,12 +19,12 @@ IconImage { } layer.onEnabledChanged: { - if (layer.enabled) - CUtils.getDominantColour(this); + if (layer.enabled && status === Image.Ready) + CUtils.getDominantColour(this, c => dominantColour = c); } onStatusChanged: { if (layer.enabled && status === Image.Ready) - CUtils.getDominantColour(this); + CUtils.getDominantColour(this, c => dominantColour = c); } } diff --git a/plugin/src/Caelestia/cutils.cpp b/plugin/src/Caelestia/cutils.cpp index 30f38dd..d17cd56 100644 --- a/plugin/src/Caelestia/cutils.cpp +++ b/plugin/src/Caelestia/cutils.cpp @@ -91,11 +91,11 @@ bool CUtils::copyFile(const QUrl& source, const QUrl& target, bool overwrite) co return QFile::copy(source.toLocalFile(), target.toLocalFile()); } -void CUtils::getDominantColour(QQuickItem* item) const { - this->getDominantColour(item, 128, 128); +void CUtils::getDominantColour(QQuickItem* item, QJSValue callback) const { + this->getDominantColour(item, 128, 128, callback); } -void CUtils::getDominantColour(QQuickItem* item, int width, int height) const { +void CUtils::getDominantColour(QQuickItem* item, int width, int height, QJSValue callback) const { if (!item) { qWarning() << "CUtils::getDominantColour: an item is required"; return; @@ -109,7 +109,7 @@ void CUtils::getDominantColour(QQuickItem* item, int width, int height) const { QSharedPointer grabResult = item->grabToImage(QSize(width, height)); QObject::connect(grabResult.data(), &QQuickItemGrabResult::ready, this, - [grabResult, item, this]() { + [grabResult, item, callback, this]() { QImage image = grabResult->image(); if (image.format() != QImage::Format_ARGB32) { @@ -154,10 +154,11 @@ void CUtils::getDominantColour(QQuickItem* item, int width, int height) const { } const QColor colour = QColor((0xFF << 24) | dominantColour); - - QMetaObject::invokeMethod(item, [item, colour]() { - item->setProperty("dominantColour", colour); - }, Qt::QueuedConnection); + if (callback.isCallable()) { + QMetaObject::invokeMethod(item, [item, callback, colour, this]() { + callback.call({ qmlEngine(this)->toScriptValue(QVariant::fromValue(colour)) }); + }, Qt::QueuedConnection); + } } ); } diff --git a/plugin/src/Caelestia/cutils.hpp b/plugin/src/Caelestia/cutils.hpp index 36120f4..08fad41 100644 --- a/plugin/src/Caelestia/cutils.hpp +++ b/plugin/src/Caelestia/cutils.hpp @@ -20,6 +20,6 @@ public: Q_INVOKABLE bool copyFile(const QUrl& source, const QUrl& target) const; Q_INVOKABLE bool copyFile(const QUrl& source, const QUrl& target, bool overwrite) const; - Q_INVOKABLE void getDominantColour(QQuickItem* item) const; - Q_INVOKABLE void getDominantColour(QQuickItem* item, int width, int height) const; + Q_INVOKABLE void getDominantColour(QQuickItem* item, QJSValue callback) const; + Q_INVOKABLE void getDominantColour(QQuickItem* item, int width, int height, QJSValue callback) const; }; -- cgit v1.2.3-freya