]> Some of my projects - aniplayer.git/commitdiff
Add UI plugins
authorAPTX <marek321@gmail.com>
Wed, 1 Mar 2017 23:24:28 +0000 (00:24 +0100)
committerAPTX <marek321@gmail.com>
Wed, 1 Mar 2017 23:53:37 +0000 (00:53 +0100)
24 files changed:
.gitignore
aniplayer3.pro
core/backendapi.pri
core/core.pro
core/include/aniplayer/uipluginbase.h [new file with mode: 0644]
core/instancemanager.cpp
core/instancemanager.h
uiplugins/ui_desktop_qml_default/qml.qrc [moved from core/qml.qrc with 84% similarity]
uiplugins/ui_desktop_qml_default/qml/Button.qml [moved from core/qml/Button.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/OpenButton.qml [moved from core/qml/OpenButton.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/PlaybackPosition.qml [moved from core/qml/PlaybackPosition.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/PlayerControls.qml [moved from core/qml/PlayerControls.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/SeekSlider.qml [moved from core/qml/SeekSlider.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/VolumeSlider.qml [moved from core/qml/VolumeSlider.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/qml/main.qml [moved from core/qml/main.qml with 100% similarity]
uiplugins/ui_desktop_qml_default/timeformatter.cpp [moved from core/timeformatter.cpp with 100% similarity]
uiplugins/ui_desktop_qml_default/timeformatter.h [moved from core/timeformatter.h with 100% similarity]
uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.json [new file with mode: 0644]
uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.pro [new file with mode: 0644]
uiplugins/ui_desktop_qml_default/ui_desktop_qml_default_global.h [new file with mode: 0644]
uiplugins/ui_desktop_qml_default/uidesktopqmldefault.cpp [new file with mode: 0644]
uiplugins/ui_desktop_qml_default/uidesktopqmldefault.h [new file with mode: 0644]
uiplugins/uibuildconfig.pri [new file with mode: 0644]
uiplugins/uiplugins.pro [new file with mode: 0644]

index f2980199c190a9f65f5c0255a82bfe801e5696cf..fa63ce16c2516cb665161dac794529f9fb048c41 100644 (file)
@@ -23,7 +23,7 @@ Makefile*
 *.prl
 *.app
 moc_*.cpp
-ui_*.h
+#ui_*.h
 qrc_*.cpp
 *.qmake.stash
 
index fb53cae2214a4dd4080ba8ca0a8e6fed0301aa6c..a4531ebdf24fe0429be3598f4c2177bbc11a11da 100644 (file)
@@ -3,4 +3,5 @@ TEMPLATE = subdirs
 SUBDIRS += \
     core \
     backendplugins \
+    uiplugins \
     featureplugins
index 2dba1287187d8ddc674ee1f88f71e90664d5c64c..3b5ca33009b66c874c9ab458d1f4b39e0888ab9e 100644 (file)
@@ -1,2 +1,2 @@
-INCLUDEPATH += $$PWD/include\r
+INCLUDEPATH += $$PWD/include
 include(../buildconfig.pri)
\ No newline at end of file
index 22a282b90d492a30c4fe932d7c4320b2346f92f2..37cc4a2b5ccad892364f8f85616f242be5c09034 100644 (file)
@@ -10,22 +10,16 @@ SOURCES += main.cpp \
     player.cpp \
     pluginmanager.cpp \
     videoelement.cpp \
-    timeformatter.cpp \
     instancemanager.cpp
 
-RESOURCES += qml.qrc
-
-# Additional import path used to resolve QML modules in Qt Creator's code model
-QML_IMPORT_PATH =
-
 HEADERS += \
     player.h \
     include/aniplayer/backendpluginbase.h \
     include/aniplayer/playerplugininterface.h \
     include/aniplayer/featurepluginbase.h \
+    include/aniplayer/uipluginbase.h \
     pluginmanager.h \
     videoelement.h \
-    timeformatter.h \
     instancemanager.h
 
 include(qtsingleapplication/qtsingleapplication.pri)
diff --git a/core/include/aniplayer/uipluginbase.h b/core/include/aniplayer/uipluginbase.h
new file mode 100644 (file)
index 0000000..16572e4
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef UIPLUGINBASE_H
+#define UIPLUGINBASE_H
+
+#include <QObject>
+
+class UiInstance {
+public:
+  virtual ~UiInstance() = default;
+};
+
+class UiPluginBase {
+public:
+  virtual ~UiPluginBase() = default;
+
+  virtual UiInstance *createUi(QObject *player, QObject *parent = nullptr) = 0;
+};
+
+#define ANIPLAYER_UI_PLUGIN_INTERFACE_IID "org.aptx.aniplayer.UiPluginInterface"
+
+Q_DECLARE_INTERFACE(UiPluginBase, ANIPLAYER_UI_PLUGIN_INTERFACE_IID)
+
+#endif // UIPLUGINBASE_H
index d04d10dd22e56037805e06ec59db486567c57234..1ad5495ef2a8784cdea627ad984a45063c42dcd3 100644 (file)
@@ -3,13 +3,11 @@
 #include <QDataStream>
 #include <QDir>
 #include <QLoggingCategory>
-#include <QQmlApplicationEngine>
-#include <QQmlContext>
 
 #include "aniplayer/featurepluginbase.h"
+#include "aniplayer/uipluginbase.h"
 #include "player.h"
 #include "pluginmanager.h"
-#include "timeformatter.h"
 
 Q_LOGGING_CATEGORY(imCategory, "InstanceManager")
 
@@ -25,14 +23,21 @@ InstanceManager::InstanceManager(QObject *parent)
   m_parser.addOption(cwdOption);
 
 #ifdef Q_OS_WIN
-  static QStringList pluginPaths{"featureplugins"};
+  static QStringList featurePluginPaths{"featureplugins"};
+  static QStringList uiPluginPaths{"uiplugins"};
 #else
-  static QStringList pluginPaths{"featureplugins",
-                                 "/usr/lib/aniplayer/featureplugins"};
+  static QStringList featurePluginPaths{"featureplugins",
+                                        "/usr/lib/aniplayer/featureplugins"};
+  static QStringList uiPluginPaths{"uiplugins", "/usr/lib/aniplayer/uiplugins"};
 #endif
 
-  m_featurePluginManager = new PluginManager;
-  m_featurePluginManager->setPluginDirectories(pluginPaths);
+  m_uiPluginManager = new PluginManager{this};
+  m_uiPluginManager->setPluginDirectories(uiPluginPaths);
+  m_uiPluginManager->setPluginPrefix("ui");
+  m_uiPluginManager->setPreferredPlugins({"desktop_qml_default"});
+
+  m_featurePluginManager = new PluginManager{this};
+  m_featurePluginManager->setPluginDirectories(featurePluginPaths);
   m_featurePluginManager->setPluginPrefix("feature");
   // TODO feature plugins should be looked up and not preferred.
   m_featurePluginManager->setPreferredPlugins({"localmylist"});
@@ -44,25 +49,25 @@ void InstanceManager::startFirstInstance() {
 
   const auto positionalArgs = m_parser.positionalArguments();
 
-  QQmlApplicationEngine *engine = new QQmlApplicationEngine{this};
-  Q_CHECK_PTR(engine);
-
-  auto player = createInstance();
+  auto player = createPlayerInstance();
   qCDebug(imCategory, "Player Created");
 
   m_instances.insert(player);
 
+  m_uiPluginManager->loadBestPlugin();
+  auto uiInstance = m_uiPluginManager->bestInstance<UiPluginBase>();
+  if (!uiInstance)
+    throw std::runtime_error{std::string("Failed to load ui: ") +
+                             qPrintable(m_uiPluginManager->errorString())};
+
+  auto ui = uiInstance->createUi(player, this);
+  Q_CHECK_PTR(ui);
+
   if (!positionalArgs.empty()) {
     auto url = parseUserInput(positionalArgs[0], m_parser.value(cwdOption));
     qCDebug(imCategory) << "Parsed positional argument as" << url;
     player->setNextSource(url);
   }
-  auto timeFormatter = new TimeFormatter{this};
-  engine->rootContext()->setContextProperty("player", player);
-  engine->rootContext()->setContextProperty("timeFormatter", timeFormatter);
-  qCDebug(imCategory, "Player Added");
-  engine->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
-  qCDebug(imCategory, "QML engine loaded");
 }
 
 QString InstanceManager::encodeCommandLine() const {
@@ -122,7 +127,7 @@ QUrl InstanceManager::parseUserInput(const QString &arg,
   return QUrl::fromUserInput(arg, workingDirectory, QUrl::AssumeLocalFile);
 }
 
-Player *InstanceManager::createInstance() {
+Player *InstanceManager::createPlayerInstance() {
 #ifdef Q_OS_WIN
   static QStringList pluginPaths{"backendplugins"};
 #else
index d852c098cf22ebb7b0f11615308f5da320d3ea23..0c2168a6ec60b99e110697914b6f6223e9790484 100644 (file)
@@ -17,7 +17,6 @@ public:
   explicit InstanceManager(QObject *parent = 0);
 
   void startFirstInstance();
-  void startInstance();
 
 public slots:
   QString encodeCommandLine() const;
@@ -28,7 +27,7 @@ public:
                              const QString &workingDirectory);
 
 private:
-  Player *createInstance();
+  Player *createPlayerInstance();
   const QCommandLineOption backendOption{"backend", "Use backend",
                                          "name of backend plugin", "default"};
   const QCommandLineOption uiOption{"ui", "Use ui", "name of ui", "default"};
@@ -42,6 +41,7 @@ private:
   QCommandLineParser m_parser;
   QSet<Player *> m_instances;
   PluginManager *m_backendPluginManager;
+  PluginManager *m_uiPluginManager;
   PluginManager *m_featurePluginManager;
 };
 
similarity index 84%
rename from core/qml.qrc
rename to uiplugins/ui_desktop_qml_default/qml.qrc
index 0e27bae6c51eec8eb91729d323b00f8f461abf2d..4ba679cb04b901b41d85a50ee7d68c99185e2e76 100644 (file)
@@ -1,5 +1,5 @@
 <RCC>
-    <qresource prefix="/">
+    <qresource prefix="/ui_desktop_qml_default">
         <file>qml/main.qml</file>
         <file>qml/OpenButton.qml</file>
         <file>qml/PlayerControls.qml</file>
diff --git a/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.json b/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.pro b/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default.pro
new file mode 100644 (file)
index 0000000..85c1769
--- /dev/null
@@ -0,0 +1,26 @@
+TARGET = ui_desktop_qml_default\r
+QT       += qml quick\r
+TEMPLATE = lib\r
+\r
+include(../../core/core.pri)\r
+include(../uibuildconfig.pri)\r
+\r
+DEFINES += UI_DESKTOP_QML_DEFAULT_LIBRARY QT_DEPRECATED_WARNINGS\r
+\r
+SOURCES += \\r
+    uidesktopqmldefault.cpp \\r
+    timeformatter.cpp\r
+\r
+HEADERS += \\r
+    ui_desktop_qml_default_global.h \\r
+    uidesktopqmldefault.h \\r
+    timeformatter.h\r
+\r
+RESOURCES += qml.qrc\r
+\r
+DISTFILES += ui_desktop_qml_default.json\r
+\r
+unix {\r
+    target.path = $${PREFIX}/lib/aniplayer/uiplugins\r
+    INSTALLS += target\r
+}\r
diff --git a/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default_global.h b/uiplugins/ui_desktop_qml_default/ui_desktop_qml_default_global.h
new file mode 100644 (file)
index 0000000..7bc7ee7
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef UI_DESKTOP_QML_DEFAULT_GLOBAL_H
+#define UI_DESKTOP_QML_DEFAULT_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(UI_DESKTOP_QML_DEFAULT_LIBRARY)
+#  define UI_DESKTOP_QML_DEFAULTSHARED_EXPORT Q_DECL_EXPORT
+#else
+#  define UI_DESKTOP_QML_DEFAULTSHARED_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // UI_DESKTOP_QML_DEFAULT_GLOBAL_H
diff --git a/uiplugins/ui_desktop_qml_default/uidesktopqmldefault.cpp b/uiplugins/ui_desktop_qml_default/uidesktopqmldefault.cpp
new file mode 100644 (file)
index 0000000..d1bec91
--- /dev/null
@@ -0,0 +1,26 @@
+#include "uidesktopqmldefault.h"\r
+\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
+  player->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("timeFormatter", timeFormatter);\r
+  qCDebug(uidqdCategory, "Player Added");\r
+  engine->load(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
+}\r
diff --git a/uiplugins/ui_desktop_qml_default/uidesktopqmldefault.h b/uiplugins/ui_desktop_qml_default/uidesktopqmldefault.h
new file mode 100644 (file)
index 0000000..389c5d7
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef UIDESKTOPQMLDEFAULT_H\r
+#define UIDESKTOPQMLDEFAULT_H\r
+\r
+#include "aniplayer/uipluginbase.h"\r
+#include "ui_desktop_qml_default_global.h"\r
+\r
+class UI_DESKTOP_QML_DEFAULTSHARED_EXPORT UiDesktopQmlDefaultInstance\r
+    : public QObject,\r
+      public UiInstance {\r
+  Q_OBJECT\r
+public:\r
+  explicit UiDesktopQmlDefaultInstance(QObject *player,\r
+                                       QObject *parent = nullptr);\r
+};\r
+\r
+class UI_DESKTOP_QML_DEFAULTSHARED_EXPORT UiDesktopQmlDefault\r
+    : public QObject,\r
+      public UiPluginBase {\r
+  Q_OBJECT\r
+  Q_PLUGIN_METADATA(IID ANIPLAYER_UI_PLUGIN_INTERFACE_IID FILE\r
+                    "ui_desktop_qml_default.json")\r
+  Q_INTERFACES(UiPluginBase)\r
+public:\r
+  UiInstance *createUi(QObject *player, QObject *parent) override;\r
+};\r
+\r
+#endif // UIDESKTOPQMLDEFAULT_H\r
diff --git a/uiplugins/uibuildconfig.pri b/uiplugins/uibuildconfig.pri
new file mode 100644 (file)
index 0000000..424939d
--- /dev/null
@@ -0,0 +1,2 @@
+include(../buildconfig.pri)
+DESTDIR=../../build/uiplugins
\ No newline at end of file
diff --git a/uiplugins/uiplugins.pro b/uiplugins/uiplugins.pro
new file mode 100644 (file)
index 0000000..2a46a74
--- /dev/null
@@ -0,0 +1,7 @@
+TEMPLATE = subdirs\r
+\r
+include(../config.pri)\r
+\r
+!no_ui_desktop_qml_default {\r
+    SUBDIRS += ui_desktop_qml_default\r
+}\r