player.cpp \
pluginmanager.cpp \
videoelement.cpp \
- instancemanager.cpp
+ instancemanager.cpp \
+ settings.cpp
HEADERS += \
player.h \
include/aniplayer/uipluginbase.h \
pluginmanager.h \
videoelement.h \
- instancemanager.h
+ instancemanager.h \
+ settings.h
include(qtsingleapplication/qtsingleapplication.pri)
public:
virtual ~UiPluginBase() = default;
- virtual UiInstance *createUi(QObject *player, QObject *parent = nullptr) = 0;
+ virtual UiInstance *createUi(QObject *player, QObject *settings,
+ QObject *parent = nullptr) = 0;
};
#define ANIPLAYER_UI_PLUGIN_INTERFACE_IID "org.aptx.aniplayer.UiPluginInterface"
#include "aniplayer/uipluginbase.h"
#include "player.h"
#include "pluginmanager.h"
+#include "settings.h"
Q_LOGGING_CATEGORY(imCategory, "InstanceManager")
throw std::runtime_error{std::string("Failed to load ui: ") +
qPrintable(m_uiPluginManager->errorString())};
- auto ui = uiInstance->createUi(player, this);
+ auto settings = new Settings;
+ Q_CHECK_PTR(settings);
+
+ auto ui = uiInstance->createUi(player, settings, this);
Q_CHECK_PTR(ui);
if (!positionalArgs.empty()) {
int main(int argc, char *argv[]) {
QtSingleApplication app(argc, argv);
app.setApplicationDisplayName("AniPlayer");
- app.setApplicationName("AniPlayer");
- app.setApplicationVersion("1.0");
+ app.setApplicationName("AniPlayer3");
+ app.setOrganizationName("APTX");
+ app.setOrganizationDomain("aptx.org");
+ app.setApplicationVersion("3.0");
InstanceManager im;
QObject::connect(&app, SIGNAL(messageReceived(QString)), &im,
--- /dev/null
+#include "settings.h"
+
+#include <QCoreApplication>
+#include <QSettings>
+
+#include "player.h"
+
+Settings::Settings(QObject *parent) : QObject(parent) {
+ m_settings =
+ new QSettings{QSettings::IniFormat, QSettings::UserScope,
+ qApp->organizationName(), qApp->applicationName(), this};
+}
+
+Settings::~Settings()
+{
+ m_settings->sync();
+}
+
+void Settings::savePlayerState(Player *player)
+{
+ set("playerVolume", player->volume());
+ set("playerMuted", player->volume());
+}
+
+void Settings::loadPlayerState(Player *player) const
+{
+ player->setVolume(get("playerVolume", player->volume()).toDouble());
+ player->setMuted(get("playerMuted", player->muted()).toBool());
+}
+
+void Settings::set(const QString &name, const QVariant &value)
+{
+ m_settings->setValue(name, value);
+}
+
+QVariant Settings::get(const QString &name, const QVariant &defaultValue) const
+{
+ return m_settings->value(name, defaultValue);
+}
--- /dev/null
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <QObject>
+#include <QVariant>
+
+class QSettings;
+class Player;
+
+class Settings : public QObject
+{
+ Q_OBJECT
+public:
+ explicit Settings(QObject *parent = 0);
+ ~Settings() override;
+
+signals:
+ void settingsChanged();
+
+public slots:
+ void savePlayerState(Player *);
+ void loadPlayerState(Player *) const;
+
+ void set(const QString &name, const QVariant &value);
+ QVariant get(const QString &name, const QVariant &defaultValue = QVariant{}) const;
+
+private:
+ QSettings *m_settings;
+};
+
+#endif // SETTINGS_H
fullscreenButton.checked = !fullscreenButton.checked;
}
+ function saveSettings() {
+ settings.set("fullScreen", fullscreenButton.checked);
+ settings.set("stayOnTop", stayOnTopButton.checked);
+ settings.set("frameless", framelessButton.checked);
+ }
+
+ function loadSettings() {
+ fullscreenButton.checked = "true" === settings.get("fullScreen", fullscreenButton.checked);
+ stayOnTopButton.checked = "true" === settings.get("stayOnTop", stayOnTopButton.checked);
+ framelessButton.checked = "true" === settings.get("frameless", framelessButton.checked);
+ }
+
+ Timer {
+ running: true
+ interval: 100
+ onTriggered: {
+ if (!fullscreenButton.checked) {
+ console.log("Fixing onTop");
+ stayOnTopButton.checked = !stayOnTopButton.checked;
+ stayOnTopButton.checked = !stayOnTopButton.checked;
+ }
+ }
+ }
+
Action {
id: openAction
enabled: controlledPlayer
Window {
id: window
- visible: true
width: 300
height: 300
- property int clicks: 0
+ property bool controlsVisible: true
//property Visibility previousVisibility: Window.Normal
+ Component.onCompleted: {
+ loadSettings();
+ window.visible = true
+ }
+
+ onClosing: saveSettings()
+
function isFullScreen() {
return visibility === Window.FullScreen
}
+ function saveSettings() {
+ console.log("SAVING SETTINGS");
+ settings.savePlayerState(player);
+ settings.set("x", x);
+ settings.set("y", y);
+ settings.set("width", width);
+ settings.set("height", height);
+ settings.set("controlsVisible", controls.visible);
+ controls.saveSettings();
+ }
+
+ function loadSettings() {
+ console.log("LOADING SETTINGS");
+ settings.loadPlayerState(player);
+ x = settings.get("x", x) - 0;
+ y = settings.get("y", y) - 0;
+ width = settings.get("width", width) - 0;
+ height = settings.get("height", height) - 0;
+ controlsVisible = "true" === settings.get("controlsVisible", controlsVisible);
+ controls.loadSettings();
+ }
+
+
VideoElement {
source: player
anchors.fill: parent
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
+ visible: controlsVisible
function toggleVisible() {
- visible = !visible;
+ controlsVisible = !controlsVisible;
}
}
}
#include "uidesktopqmldefault.h"\r
\r
+#include <QLoggingCategory>\r
#include <QQmlApplicationEngine>\r
#include <QQmlContext>\r
-#include <QLoggingCategory>\r
\r
#include "timeformatter.h"\r
\r
Q_LOGGING_CATEGORY(uidqdCategory, "UiDefault")\r
\r
-UiDesktopQmlDefaultInstance::UiDesktopQmlDefaultInstance(QObject *player, QObject *parent)\r
-: QObject{parent} {\r
+UiDesktopQmlDefaultInstance::UiDesktopQmlDefaultInstance(QObject *player,\r
+ QObject *settings,\r
+ QObject *parent)\r
+ : QObject{parent} {\r
player->setParent(this);\r
+ settings->setParent(this);\r
QQmlApplicationEngine *engine = new QQmlApplicationEngine{this};\r
Q_CHECK_PTR(engine);\r
auto timeFormatter = new TimeFormatter{this};\r
engine->rootContext()->setContextProperty("player", player);\r
+ engine->rootContext()->setContextProperty("settings", settings);\r
engine->rootContext()->setContextProperty("timeFormatter", timeFormatter);\r
qCDebug(uidqdCategory, "Player Added");\r
- engine->load(QUrl(QStringLiteral("qrc:/ui_desktop_qml_default/qml/main.qml")));\r
+ engine->load(\r
+ QUrl(QStringLiteral("qrc:/ui_desktop_qml_default/qml/main.qml")));\r
qCDebug(uidqdCategory, "QML engine loaded");\r
}\r
\r
-UiInstance *UiDesktopQmlDefault::createUi(QObject *player, QObject *parent) {\r
- return new UiDesktopQmlDefaultInstance{player, parent};\r
+UiInstance *UiDesktopQmlDefault::createUi(QObject *player, QObject *settings,\r
+ QObject *parent) {\r
+ return new UiDesktopQmlDefaultInstance{player, settings, parent};\r
}\r
public UiInstance {\r
Q_OBJECT\r
public:\r
- explicit UiDesktopQmlDefaultInstance(QObject *player,\r
+ explicit UiDesktopQmlDefaultInstance(QObject *player, QObject *settings,\r
QObject *parent = nullptr);\r
};\r
\r
Q_PLUGIN_METADATA(IID ANIPLAYER_UI_PLUGIN_INTERFACE_IID FILE\r
"ui_desktop_qml_default.json")\r
Q_INTERFACES(UiPluginBase)\r
+\r
public:\r
- UiInstance *createUi(QObject *player, QObject *parent) override;\r
+ UiInstance *createUi(QObject *player, QObject *settings,\r
+ QObject *parent) override;\r
};\r
\r
#endif // UIDESKTOPQMLDEFAULT_H\r