Files
Lumen-wallpaper/src/wallpaperitem.h
T

98 lines
3.3 KiB
C++

#pragma once
#include "rendernode.h"
#include <QDateTime>
#include <QElapsedTimer>
#include <QFileSystemWatcher>
#include <QQuickItem>
#include <QTimer>
#include <QUrl>
#include <QVector4D>
class VulkanWallpaperItem : public QQuickItem {
Q_OBJECT
Q_PROPERTY(QUrl shaderUrl READ shaderUrl WRITE setShaderUrl NOTIFY shaderUrlChanged)
Q_PROPERTY(int targetFps READ targetFps WRITE setTargetFps NOTIFY targetFpsChanged)
Q_PROPERTY(double speed READ speed WRITE setSpeed NOTIFY speedChanged)
Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged)
Q_PROPERTY(bool mouseEnabled READ mouseEnabled WRITE setMouseEnabled NOTIFY mouseEnabledChanged)
Q_PROPERTY(bool watchSource READ watchSource WRITE setWatchSource NOTIFY watchSourceChanged)
Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged)
Q_PROPERTY(bool fallbackActive READ fallbackActive NOTIFY fallbackActiveChanged)
public:
explicit VulkanWallpaperItem(QQuickItem *parent = nullptr);
~VulkanWallpaperItem() override = default;
QUrl shaderUrl() const { return m_shaderUrl; }
int targetFps() const { return m_targetFps; }
double speed() const { return m_speed; }
bool running() const { return m_running; }
bool mouseEnabled() const { return m_mouseEnabled; }
bool watchSource() const { return m_watchSource; }
QString errorMessage() const { return m_errorMessage; }
bool fallbackActive() const { return m_fallbackActive; }
void setShaderUrl(const QUrl &url);
void setTargetFps(int fps);
void setSpeed(double speed);
void setRunning(bool running);
void setMouseEnabled(bool enabled);
void setWatchSource(bool enabled);
void applyRenderStatus(int status, const QString &message);
Q_SIGNALS:
void shaderUrlChanged();
void targetFpsChanged();
void speedChanged();
void runningChanged();
void mouseEnabledChanged();
void watchSourceChanged();
void errorMessageChanged();
void fallbackActiveChanged();
protected:
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override;
void itemChange(ItemChange change, const ItemChangeData &value) override;
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
void hoverMoveEvent(QHoverEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseUngrabEvent() override;
private:
void loadShader();
void updateWatcher();
void updateTimer();
void tick();
void setMousePosition(const QPointF &position);
void setMouseDown(bool down);
void updateErrorState();
QUrl m_shaderUrl;
QString m_shaderFile;
QByteArray m_shaderSource;
QString m_fileError;
QString m_renderError;
QString m_errorMessage;
QFileSystemWatcher m_watcher;
QTimer m_renderTimer;
QTimer m_reloadTimer;
QElapsedTimer m_clock;
qint64 m_lastTickNs = 0;
double m_animationTime = 0.0;
double m_timeDelta = 1.0 / 30.0;
double m_frameRate = 30.0;
quint64 m_frame = 0;
int m_targetFps = 30;
double m_speed = 1.0;
bool m_running = true;
bool m_mouseEnabled = true;
bool m_watchSource = true;
bool m_fallbackActive = false;
int m_renderStatus = -2;
QVector4D m_mouse;
};