plugin/cim: better cache impl
This commit is contained in:
parent
3596f2906e
commit
d22576ee82
5 changed files with 42 additions and 19 deletions
|
|
@ -16,11 +16,6 @@ Image {
|
|||
sourceSize.width: sourceWidth
|
||||
sourceSize.height: sourceHeight
|
||||
|
||||
onStatusChanged: {
|
||||
if (!manager.usingCache && status === Image.Ready)
|
||||
CUtils.saveItem(this, manager.cachePath);
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: QsWindow.window
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
find_package(Qt6 REQUIRED COMPONENTS Core Qml)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core Qml Gui)
|
||||
|
||||
if(QT_KNOWN_POLICY_QTP0001)
|
||||
qt_policy(SET QTP0001 NEW)
|
||||
|
|
|
|||
|
|
@ -23,4 +23,4 @@ install(TARGETS "${module_plugin_target}" LIBRARY DESTINATION "${module_dir}" RU
|
|||
install(FILES "${module_qmldir}" DESTINATION "${module_dir}")
|
||||
install(FILES "${module_typeinfo}" DESTINATION "${module_dir}")
|
||||
|
||||
target_link_libraries(caelestia PRIVATE Qt::Core Qt::Qml)
|
||||
target_link_libraries(caelestia PRIVATE Qt::Core Qt::Qml Qt::Gui)
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
#include <QCryptographicHash>
|
||||
#include <QThreadPool>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <QImageReader>
|
||||
|
||||
qreal CachingImageManager::effectiveScale() const {
|
||||
if (m_item->window()) {
|
||||
|
|
@ -99,10 +101,9 @@ void CachingImageManager::updateSource(const QString& path) {
|
|||
const QString sha = sha256sum(path);
|
||||
|
||||
QMetaObject::invokeMethod(this, [path, sha, this]() {
|
||||
const QString filename = QString("%1@%2x%3.png")
|
||||
.arg(sha)
|
||||
.arg(effectiveWidth())
|
||||
.arg(effectiveHeight());
|
||||
int width = effectiveWidth();
|
||||
int height = effectiveHeight();
|
||||
const QString filename = QString("%1@%2x%3.png").arg(sha).arg(width).arg(height);
|
||||
|
||||
const QUrl cache = m_cacheDir.resolved(QUrl(filename));
|
||||
if (m_cachePath == cache) {
|
||||
|
|
@ -123,10 +124,8 @@ void CachingImageManager::updateSource(const QString& path) {
|
|||
m_item->setProperty("source", cache);
|
||||
} else {
|
||||
m_item->setProperty("source", QUrl::fromLocalFile(path));
|
||||
createCache(path, cache.toLocalFile(), QSize(width, height));
|
||||
}
|
||||
|
||||
m_usingCache = cacheExists;
|
||||
emit usingCacheChanged();
|
||||
}, Qt::QueuedConnection);
|
||||
});
|
||||
}
|
||||
|
|
@ -135,8 +134,39 @@ QUrl CachingImageManager::cachePath() const {
|
|||
return m_cachePath;
|
||||
}
|
||||
|
||||
bool CachingImageManager::usingCache() const {
|
||||
return m_usingCache;
|
||||
void CachingImageManager::createCache(const QString& path, const QString& cache, const QSize& size) const {
|
||||
QThreadPool::globalInstance()->start([path, cache, size] {
|
||||
QImageReader reader(path);
|
||||
|
||||
QSize imgSize = reader.size();
|
||||
if (!imgSize.isValid()) {
|
||||
qWarning() << "CachingImageManager::createCache: unable to get size of" << path;
|
||||
return;
|
||||
}
|
||||
|
||||
qreal scale = std::max(
|
||||
qreal(size.width()) / imgSize.width(),
|
||||
qreal(size.height()) / imgSize.height()
|
||||
);
|
||||
QSizeF scaledSize(imgSize.width() * scale, imgSize.height() * scale);
|
||||
qreal xOff = (scaledSize.width() - size.width()) / 2.0;
|
||||
qreal yOff = (scaledSize.height() - size.height()) / 2.0;
|
||||
|
||||
reader.setScaledSize(scaledSize.toSize());
|
||||
reader.setScaledClipRect(QRectF(xOff, yOff, size.width(), size.height()).toRect());
|
||||
|
||||
QImage image = reader.read();
|
||||
|
||||
if (image.isNull()) {
|
||||
qWarning() << "CachingImageManager::createCache: failed to read" << path;
|
||||
return;
|
||||
}
|
||||
|
||||
const QString parent = QFileInfo(cache).absolutePath();
|
||||
if (!QDir().mkpath(parent) || !image.save(cache)) {
|
||||
qWarning() << "CachingImageManager::createCache: failed to save to" << cache;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
QString CachingImageManager::sha256sum(const QString& path) const {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ class CachingImageManager : public QObject {
|
|||
|
||||
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) {};
|
||||
|
|
@ -28,7 +27,6 @@ public:
|
|||
void setPath(const QString& path);
|
||||
|
||||
[[nodiscard]] QUrl cachePath() const;
|
||||
[[nodiscard]] bool usingCache() const;
|
||||
|
||||
Q_INVOKABLE void updateSource();
|
||||
Q_INVOKABLE void updateSource(const QString& path);
|
||||
|
|
@ -47,7 +45,6 @@ private:
|
|||
|
||||
QString m_path;
|
||||
QUrl m_cachePath;
|
||||
bool m_usingCache;
|
||||
|
||||
QMetaObject::Connection m_widthConn;
|
||||
QMetaObject::Connection m_heightConn;
|
||||
|
|
@ -56,5 +53,6 @@ private:
|
|||
[[nodiscard]] int effectiveWidth() const;
|
||||
[[nodiscard]] int effectiveHeight() const;
|
||||
|
||||
void createCache(const QString& path, const QString& cache, const QSize& size) const;
|
||||
[[nodiscard]] QString sha256sum(const QString& path) const;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue