feat: add Kirigami app skeleton with libmpv playback

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
triandClaude Opus 5.5 committed 2026-10-27 22:09:52 +07:00
commit 1eb67b829c
8 files changed
+540

No files matched your search

+58
View File
@@ -0,0 +1,58 @@
#pragma once
#include <MpvAbstractItem>
#include <QUrl>
#include <QtQml/qqmlregistration.h>
// QML video surface backed by libmpv (through MpvQt).
// mpv properties we care about are mirrored as Qt properties so QML can bind to them.
class MpvItem : public MpvAbstractItem
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(QUrl currentUrl READ currentUrl NOTIFY currentUrlChanged)
Q_PROPERTY(QString mediaTitle READ mediaTitle NOTIFY mediaTitleChanged)
Q_PROPERTY(double position READ position NOTIFY positionChanged)
Q_PROPERTY(double duration READ duration NOTIFY durationChanged)
Q_PROPERTY(bool paused READ paused WRITE setPaused NOTIFY pausedChanged)
Q_PROPERTY(bool fileLoaded READ isFileLoaded NOTIFY fileLoadedChanged)
public:
explicit MpvItem(QQuickItem *parent = nullptr);
~MpvItem() override = default;
QUrl currentUrl() const;
QString mediaTitle() const;
double position() const;
double duration() const;
bool paused() const;
void setPaused(bool paused);
bool isFileLoaded() const;
Q_INVOKABLE void loadFile(const QUrl &url);
Q_INVOKABLE void togglePause();
Q_INVOKABLE void seek(double seconds);
Q_SIGNALS:
void currentUrlChanged();
void mediaTitleChanged();
void positionChanged();
void durationChanged();
void pausedChanged();
void fileLoadedChanged();
private:
void onPropertyChanged(const QString &property, const QVariant &value);
void setFileLoaded(bool loaded);
bool m_ready = false;
QUrl m_pendingUrl;
QUrl m_currentUrl;
QString m_mediaTitle;
double m_position = 0.0;
double m_duration = 0.0;
bool m_paused = false;
bool m_fileLoaded = false;
};