]> Some of my projects - aniplayer.git/commitdiff
Implement basic settings
authorAPTX <marek321@gmail.com>
Sat, 11 Mar 2017 22:27:06 +0000 (23:27 +0100)
committerAPTX <marek321@gmail.com>
Sat, 11 Mar 2017 22:27:06 +0000 (23:27 +0100)
A ui instance gets a Settings QObject to save
whatever settings the ui wants. Currently the ui
is responsible for saving the player state.

The settings layout is very basic and will change
in the future in incompatible ways.

JS makes it difficult to read the settings properly
as all values return as strings and not their correct
type.

core/core.pro
core/include/aniplayer/uipluginbase.h
core/instancemanager.cpp
core/main.cpp
core/settings.cpp [new file with mode: 0644]
core/settings.h [new file with mode: 0644]
uiplugins/ui_desktop_qml_default/qml/PlayerControls.qml
uiplugins/ui_desktop_qml_default/qml/main.qml
uiplugins/ui_desktop_qml_default/uidesktopqmldefault.cpp
uiplugins/ui_desktop_qml_default/uidesktopqmldefault.h

index 30ca62d4c454baaeca846276056d72b929f8428e..9a045973148ac181c1f58ca08efeb8d017098a40 100644 (file)
@@ -10,7 +10,8 @@ SOURCES += main.cpp \
     player.cpp \
     pluginmanager.cpp \
     videoelement.cpp \
-    instancemanager.cpp
+    instancemanager.cpp \
+    settings.cpp
 
 HEADERS += \
     player.h \
@@ -20,7 +21,8 @@ HEADERS += \
     include/aniplayer/uipluginbase.h \
     pluginmanager.h \
     videoelement.h \
-    instancemanager.h
+    instancemanager.h \
+    settings.h
 
 include(qtsingleapplication/qtsingleapplication.pri)
 
index 16572e4da548a1a7c20e869f2000d02f7732d824..04b0479637183cd6df620383365c338c8278c186 100644 (file)
@@ -12,7 +12,8 @@ class UiPluginBase {
 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"
index 1ad5495ef2a8784cdea627ad984a45063c42dcd3..0a035749750f6b8e3d0f412ea8373ec2da01cdb1 100644 (file)
@@ -8,6 +8,7 @@
 #include "aniplayer/uipluginbase.h"
 #include "player.h"
 #include "pluginmanager.h"
+#include "settings.h"
 
 Q_LOGGING_CATEGORY(imCategory, "InstanceManager")
 
@@ -60,7 +61,10 @@ void InstanceManager::startFirstInstance() {
     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()) {
index be9e57bc512cd6efc2411ec50c9f1e65634d9136..6585b5e09e48d4548137af689673d549cff28b87 100644 (file)
 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,
diff --git a/core/settings.cpp b/core/settings.cpp
new file mode 100644 (file)
index 0000000..6b3d059
--- /dev/null
@@ -0,0 +1,39 @@
+#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);
+}
diff --git a/core/settings.h b/core/settings.h
new file mode 100644 (file)
index 0000000..7dfb91f
--- /dev/null
@@ -0,0 +1,31 @@
+#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
index a8c14a9cfcd220c33ad88d43df955eef1ebcfa24..aaeaee3bb9bdc242afb6945f3e6929175b6c7d16 100644 (file)
@@ -13,6 +13,30 @@ Row {
         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
index b52ec0047ed85fe68af002edb9b49940f600f0d1..540c58359032e08dc366832e1ad15904622eadb0 100644 (file)
@@ -4,16 +4,45 @@ import QtQuick 2.7
 
 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
@@ -88,9 +117,10 @@ Window {
         anchors.bottom: parent.bottom
         anchors.left: parent.left
         anchors.right: parent.right
+        visible: controlsVisible
 
         function toggleVisible() {
-            visible = !visible;
+            controlsVisible = !controlsVisible;
         }
     }
 }
index d1bec919d40ce9b9a1b78b1bd01d24cb4f90d344..c38d5f0d341981b7110949f06074972a832afe44 100644 (file)
@@ -1,26 +1,32 @@
 #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
index 389c5d7b9f046cb96babd3bd2cdb02da86ce81ad..928a7791b01f8b0b0cb3aa1a69e9e31202e0b4e3 100644 (file)
@@ -9,7 +9,7 @@ class UI_DESKTOP_QML_DEFAULTSHARED_EXPORT UiDesktopQmlDefaultInstance
       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
@@ -20,8 +20,10 @@ class UI_DESKTOP_QML_DEFAULTSHARED_EXPORT UiDesktopQmlDefault
   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