aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-10-19 20:36:51 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-10-19 20:36:51 +0000
commit6baa843a2a0bdf143617df269129d81dae0a3a38 (patch)
tree9a650b4349c1129c8c20b4536228bb838eb9ee67
parentb0ab8e75df1bb8c5752ebf3ed60334f1134b04f3 (diff)
downloadqmmp-6baa843a2a0bdf143617df269129d81dae0a3a38.tar.gz
qmmp-6baa843a2a0bdf143617df269129d81dae0a3a38.tar.bz2
qmmp-6baa843a2a0bdf143617df269129d81dae0a3a38.zip
qsui: added feature to add dock widgets from plugins
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9509 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/plugins/General/lyrics/lyricsfactory.cpp9
-rw-r--r--src/plugins/General/lyrics/lyricsfactory.h1
-rw-r--r--src/plugins/General/lyrics/lyricswindow.cpp10
-rw-r--r--src/plugins/Ui/qsui/dockwidgetlist.cpp114
-rw-r--r--src/plugins/Ui/qsui/dockwidgetlist.h32
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp8
-rw-r--r--src/plugins/Ui/qsui/mainwindow.h2
-rw-r--r--src/plugins/Ui/qsui/qsui.pro6
-rw-r--r--src/qmmpui/general.cpp66
-rw-r--r--src/qmmpui/general.h9
-rw-r--r--src/qmmpui/generalfactory.cpp10
-rw-r--r--src/qmmpui/generalfactory.h13
-rw-r--r--src/qmmpui/qmmpui.pro3
-rw-r--r--src/qmmpui/uihelper.cpp17
-rw-r--r--src/qmmpui/uihelper.h9
15 files changed, 291 insertions, 18 deletions
diff --git a/src/plugins/General/lyrics/lyricsfactory.cpp b/src/plugins/General/lyrics/lyricsfactory.cpp
index a8076d416..c20278f0f 100644
--- a/src/plugins/General/lyrics/lyricsfactory.cpp
+++ b/src/plugins/General/lyrics/lyricsfactory.cpp
@@ -21,6 +21,7 @@
#include <QMessageBox>
#include "settingsdialog.h"
#include "lyrics.h"
+#include "lyricswindow.h"
#include "lyricsfactory.h"
GeneralProperties LyricsFactory::properties() const
@@ -31,6 +32,7 @@ GeneralProperties LyricsFactory::properties() const
properties.hasAbout = true;
properties.hasSettings = true;
properties.visibilityControl = false;
+ properties.widgets = { { 0, tr("Lyrics"), Qt::AllDockWidgetAreas } };
return properties;
}
@@ -39,6 +41,13 @@ QObject *LyricsFactory::create(QObject *parent)
return new Lyrics(parent);
}
+QWidget *LyricsFactory::createWidget(int id, QWidget *parent)
+{
+ if(id == 0)
+ return new LyricsWindow(nullptr, parent);
+ return nullptr;
+}
+
QDialog *LyricsFactory::createConfigDialog(QWidget *parent)
{
return new SettingsDialog(parent);
diff --git a/src/plugins/General/lyrics/lyricsfactory.h b/src/plugins/General/lyrics/lyricsfactory.h
index 48d361c16..4593dedf7 100644
--- a/src/plugins/General/lyrics/lyricsfactory.h
+++ b/src/plugins/General/lyrics/lyricsfactory.h
@@ -37,6 +37,7 @@ Q_INTERFACES(GeneralFactory)
public:
GeneralProperties properties() const override;
QObject *create(QObject *parent) override;
+ QWidget *createWidget(int id, QWidget *parent) override;
QDialog *createConfigDialog(QWidget *parent) override;
void showAbout(QWidget *parent) override;
QString translation() const override;
diff --git a/src/plugins/General/lyrics/lyricswindow.cpp b/src/plugins/General/lyrics/lyricswindow.cpp
index 750d91835..4f75bf2ac 100644
--- a/src/plugins/General/lyrics/lyricswindow.cpp
+++ b/src/plugins/General/lyrics/lyricswindow.cpp
@@ -35,9 +35,12 @@ LyricsWindow::LyricsWindow(const TrackInfo *info, QWidget *parent)
: QWidget(parent)
{
m_ui.setupUi(this);
- setWindowFlags(Qt::Dialog);
- setAttribute(Qt::WA_DeleteOnClose);
- setAttribute(Qt::WA_QuitOnClose, false);
+ if(!info)
+ return;
+
+ //setWindowFlags(Qt::Dialog);
+ //setAttribute(Qt::WA_DeleteOnClose);
+ //setAttribute(Qt::WA_QuitOnClose, false);
m_cachePath = Qmmp::configDir() + "/lyrics/";
m_ui.editWidget->setVisible(false);
m_ui.titleLineEdit->setText(info->value(Qmmp::TITLE));
@@ -86,6 +89,7 @@ LyricsWindow::LyricsWindow(const TrackInfo *info, QWidget *parent)
LyricsWindow::~LyricsWindow()
{
+ qDebug("%s", Q_FUNC_INFO);
}
void LyricsWindow::onRequestFinished(QNetworkReply *reply)
diff --git a/src/plugins/Ui/qsui/dockwidgetlist.cpp b/src/plugins/Ui/qsui/dockwidgetlist.cpp
new file mode 100644
index 000000000..66f72df61
--- /dev/null
+++ b/src/plugins/Ui/qsui/dockwidgetlist.cpp
@@ -0,0 +1,114 @@
+#include <QDockWidget>
+#include <QMenu>
+#include <QAction>
+#include <QDebug>
+#include <qmmpui/general.h>
+#include <qmmpui/uihelper.h>
+#include "dockwidgetlist.h"
+
+DockWidgetList::DockWidgetList(QMainWindow *parent) : QObject(parent), m_mw(parent)
+{
+ connect(UiHelper::instance(), SIGNAL(widgetAdded(QString)), SLOT(onWidgetAdded(QString)));
+ connect(UiHelper::instance(), SIGNAL(widgetRemoved(QString)), SLOT(onWidgetRemoved(QString)));
+ connect(UiHelper::instance(), SIGNAL(widgetUpdated(QString)), SLOT(onWidgetUpdated(QString)));
+
+ for(const QString &id : General::enabledWidgets())
+ {
+ WidgetDescription desc = General::widgetDescription(id);
+ QDockWidget *dockWidget = new QDockWidget(desc.name, m_mw);
+ dockWidget->setObjectName(id);
+ dockWidget->setAllowedAreas(desc.allowedAreas);
+ m_mw->addDockWidget(Qt::LeftDockWidgetArea, dockWidget, Qt::Vertical);
+ connect(dockWidget->toggleViewAction(), SIGNAL(toggled(bool)), SLOT(onViewActionToggled(bool)));
+ m_dockWidgetList << dockWidget;
+ }
+}
+
+void DockWidgetList::registerMenu(QMenu *menu, QAction *before)
+{
+ m_menu = menu;
+ m_beforeAction = before;
+
+ for(QDockWidget *dock : qAsConst(m_dockWidgetList))
+ menu->insertAction(m_beforeAction, dock->toggleViewAction());
+}
+
+void DockWidgetList::onViewActionToggled(bool checked)
+{
+ if(!sender() || !sender()->parent())
+ return;
+
+ QString id = sender()->parent()->objectName();
+ QDockWidget *dockWidget = qobject_cast<QDockWidget *>(sender()->parent());
+ if(!dockWidget)
+ return;
+
+ if(checked)
+ {
+ QWidget *w = General::createWidget(id, m_mw);
+ if(w)
+ {
+ dockWidget->setWidget(w);
+ w->show();
+ }
+ }
+ else if(dockWidget->widget())
+ {
+ dockWidget->widget()->deleteLater();
+ }
+}
+
+void DockWidgetList::onWidgetAdded(const QString &id)
+{
+ for(QDockWidget *dockWidget : m_dockWidgetList)
+ {
+ if(dockWidget->objectName() == id)
+ return;
+ }
+
+ WidgetDescription desc = General::widgetDescription(id);
+ QDockWidget *dockWidget = new QDockWidget(desc.name, m_mw);
+ dockWidget->setObjectName(id);
+ dockWidget->setAllowedAreas(desc.allowedAreas);
+ if(m_menu && m_beforeAction)
+ m_menu->insertAction(m_beforeAction, dockWidget->toggleViewAction());
+ m_mw->addDockWidget(Qt::LeftDockWidgetArea, dockWidget, Qt::Vertical);
+ connect(dockWidget->toggleViewAction(), SIGNAL(toggled(bool)), SLOT(onViewActionToggled(bool)));
+ m_dockWidgetList << dockWidget;
+
+ QWidget *w = General::createWidget(id, m_mw);
+ dockWidget->setWidget(w);
+ w->show();
+}
+
+void DockWidgetList::onWidgetRemoved(const QString &id)
+{
+ for(QDockWidget *dockWidget : m_dockWidgetList)
+ {
+ if(dockWidget->objectName() == id)
+ {
+ m_dockWidgetList.removeAll(dockWidget);
+ if(dockWidget->widget())
+ dockWidget->widget()->deleteLater();
+ dockWidget->deleteLater();
+ }
+ }
+}
+
+void DockWidgetList::onWidgetUpdated(const QString &id)
+{
+ for(QDockWidget *dockWidget : m_dockWidgetList)
+ {
+ if(dockWidget->objectName() == id && dockWidget->widget())
+ {
+ dockWidget->widget()->deleteLater();
+ QWidget *w = General::createWidget(id, m_mw);
+ if(w)
+ {
+ dockWidget->setWidget(w);
+ w->show();
+ }
+ break;
+ }
+ }
+}
diff --git a/src/plugins/Ui/qsui/dockwidgetlist.h b/src/plugins/Ui/qsui/dockwidgetlist.h
new file mode 100644
index 000000000..a03e29ff2
--- /dev/null
+++ b/src/plugins/Ui/qsui/dockwidgetlist.h
@@ -0,0 +1,32 @@
+#ifndef DOCKWIDGETLIST_H
+#define DOCKWIDGETLIST_H
+
+#include <QMainWindow>
+#include <QList>
+
+class QDockWidget;
+class QAction;
+class QMenu;
+
+class DockWidgetList : public QObject
+{
+ Q_OBJECT
+public:
+ explicit DockWidgetList(QMainWindow *parent);
+
+ void registerMenu(QMenu *menu, QAction *before);
+
+private slots:
+ void onViewActionToggled(bool visible);
+ void onWidgetAdded(const QString &id);
+ void onWidgetRemoved(const QString &id);
+ void onWidgetUpdated(const QString &id);
+
+private:
+ QMainWindow *m_mw;
+ QList<QDockWidget *> m_dockWidgetList;
+ QAction *m_beforeAction = nullptr;
+ QMenu *m_menu;
+};
+
+#endif // DOCKWIDGETLIST_H
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp
index 5a9c3347a..8b0733272 100644
--- a/src/plugins/Ui/qsui/mainwindow.cpp
+++ b/src/plugins/Ui/qsui/mainwindow.cpp
@@ -59,6 +59,7 @@
#include "qsuiquicksearch.h"
#include "qsuiwaveformseekbar.h"
#include "qsuistatusbar.h"
+#include "dockwidgetlist.h"
#include "equalizer.h"
#define KEY_OFFSET 10000
@@ -156,7 +157,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_ui.coverDockWidget->setWidget(new CoverWidget(this));
//playlists
m_ui.playlistsDockWidget->setWidget(new PlayListBrowser(m_pl_manager, this));
-
+ //dock widgets (plugins)
+ m_dockWidgetList = new DockWidgetList(this);
+ //other
createActions();
readSettings();
restoreWindowTitle();
@@ -483,7 +486,8 @@ void MainWindow::createActions()
m_ui.menuView->addAction(m_ui.fileSystemDockWidget->toggleViewAction());
m_ui.menuView->addAction(m_ui.coverDockWidget->toggleViewAction());
m_ui.menuView->addAction(m_ui.playlistsDockWidget->toggleViewAction());
- m_ui.menuView->addSeparator();
+ QAction *separator = m_ui.menuView->addSeparator();
+ m_dockWidgetList->registerMenu(m_ui.menuView, separator);
m_ui.menuView->addAction(SET_ACTION(ActionManager::UI_SHOW_TABS, m_tabWidget->tabBar(), SLOT(setVisible(bool))));
m_ui.menuView->addAction(SET_ACTION(ActionManager::UI_SHOW_TITLEBARS, this, SLOT(setTitleBarsVisible(bool))));
m_ui.menuView->addAction(ACTION(ActionManager::PL_SHOW_HEADER));
diff --git a/src/plugins/Ui/qsui/mainwindow.h b/src/plugins/Ui/qsui/mainwindow.h
index 0cb5dd53d..6b1dabc83 100644
--- a/src/plugins/Ui/qsui/mainwindow.h
+++ b/src/plugins/Ui/qsui/mainwindow.h
@@ -44,6 +44,7 @@ class QSUiTabWidget;
class QSUiQuickSearch;
class QSUiWaveformSeekBar;
class QSUiStatusBar;
+class DockWidgetList;
/**
@@ -123,6 +124,7 @@ private:
bool m_update = false;
bool m_hideOnClose;
QSUiTabWidget *m_tabWidget;
+ DockWidgetList *m_dockWidgetList;
};
diff --git a/src/plugins/Ui/qsui/qsui.pro b/src/plugins/Ui/qsui/qsui.pro
index d30953175..1ebe9084e 100644
--- a/src/plugins/Ui/qsui/qsui.pro
+++ b/src/plugins/Ui/qsui/qsui.pro
@@ -35,7 +35,8 @@ SOURCES += \
qsuiquicksearch.cpp \
qsuivisualization.cpp \
qsuiwaveformseekbar.cpp \
- qsuistatusbar.cpp
+ qsuistatusbar.cpp \
+ dockwidgetlist.cpp
HEADERS += mainwindow.h \
listwidget.h \
visualmenu.h \
@@ -69,7 +70,8 @@ HEADERS += mainwindow.h \
qsuiquicksearch.h \
qsuivisualization.h \
qsuiwaveformseekbar.h \
- qsuistatusbar.h
+ qsuistatusbar.h \
+ dockwidgetlist.h
FORMS += forms/mainwindow.ui \
forms/shortcutdialog.ui \
diff --git a/src/qmmpui/general.cpp b/src/qmmpui/general.cpp
index a9c0a766f..8015dfb8c 100644
--- a/src/qmmpui/general.cpp
+++ b/src/qmmpui/general.cpp
@@ -22,6 +22,7 @@
#include <QDir>
#include <QDialog>
#include <qmmp/qmmp.h>
+#include "uihelper.h"
#include "qmmpuiplugincache_p.h"
#include "general.h"
@@ -98,6 +99,46 @@ QList<GeneralFactory *> General::enabledFactories()
return list;
}
+QStringList General::enabledWidgets()
+{
+ QStringList out;
+ for(const GeneralFactory *f : General::enabledFactories())
+ {
+ for(const WidgetDescription &desc : f->properties().widgets)
+ out << QString("%1_%2").arg(f->properties().shortName).arg(desc.id);
+ }
+
+ return out;
+}
+
+WidgetDescription General::widgetDescription(const QString &id)
+{
+ for(const GeneralFactory *f : General::enabledFactories())
+ {
+ for(const WidgetDescription &desc : f->properties().widgets)
+ {
+ if(id == QString("%1_%2").arg(f->properties().shortName).arg(desc.id))
+ return desc;
+ }
+ }
+
+ return { -1, QString(), Qt::NoDockWidgetArea };
+}
+
+QWidget *General::createWidget(const QString &id, QWidget *parent)
+{
+ for(GeneralFactory *f : General::enabledFactories())
+ {
+ for(const WidgetDescription &desc : f->properties().widgets)
+ {
+ if(id == QString("%1_%2").arg(f->properties().shortName).arg(desc.id))
+ return f->createWidget(desc.id, parent);
+ }
+ }
+
+ return nullptr;
+}
+
QString General::file(const GeneralFactory *factory)
{
loadPlugins();
@@ -106,7 +147,7 @@ QString General::file(const GeneralFactory *factory)
return it == m_cache->cend() ? QString() : (*it)->file();
}
-void General::setEnabled(GeneralFactory* factory, bool enable)
+void General::setEnabled(GeneralFactory *factory, bool enable)
{
loadPlugins();
if (!factories().contains(factory))
@@ -129,30 +170,43 @@ void General::setEnabled(GeneralFactory* factory, bool enable)
if (enable == m_generals->keys().contains(factory))
return;
+
if (enable)
{
QObject *general = factory->create(m_parent);
if(general)
m_generals->insert(factory, general);
+
+ for(const WidgetDescription &d : factory->properties().widgets)
+ UiHelper::instance()->addWidget(QString("%1_%2").arg(factory->properties().shortName).arg(d.id));
}
- else if(m_generals->value(factory))
+ else
{
- delete m_generals->take(factory);
+ for(const WidgetDescription &d : factory->properties().widgets)
+ UiHelper::instance()->removeWidget(QString("%1_%2").arg(factory->properties().shortName).arg(d.id));
+
+ if(m_generals->value(factory))
+ delete m_generals->take(factory);
}
}
-void General::showSettings(GeneralFactory* factory, QWidget* parentWidget)
+void General::showSettings(GeneralFactory *factory, QWidget *parentWidget)
{
QDialog *dialog = factory->createConfigDialog(parentWidget);
if (!dialog)
return;
- if (m_generals && dialog->exec() == QDialog::Accepted && m_generals->keys().contains(factory))
+ if (m_generals && dialog->exec() == QDialog::Accepted)
{
- delete m_generals->take(factory);
+ if(m_generals->keys().contains(factory))
+ delete m_generals->take(factory);
+
QObject *general = factory->create(m_parent);
if(general)
m_generals->insert(factory, general);
+
+ for(const WidgetDescription &d : factory->properties().widgets)
+ UiHelper::instance()->updateWidget(QString("%1_%2").arg(factory->properties().shortName).arg(d.id));
}
dialog->deleteLater();
}
diff --git a/src/qmmpui/general.h b/src/qmmpui/general.h
index 14b1af26a..9e4bc0d01 100644
--- a/src/qmmpui/general.h
+++ b/src/qmmpui/general.h
@@ -47,6 +47,9 @@ public:
* Returns a list of the enabled general plugin factories.
*/
static QList<GeneralFactory *> enabledFactories();
+ static QStringList enabledWidgets();
+ static WidgetDescription widgetDescription(const QString &id);
+ static QWidget *createWidget(const QString &id, QWidget *parent);
/*!
* Returns plugin file path.
* @param factory General plugin factory.
@@ -57,13 +60,13 @@ public:
* @param factory General plugin factory.
* @param enable Plugin enable state (\b true - enable, \b false - disable)
*/
- static void setEnabled(GeneralFactory* factory, bool enable = true);
+ static void setEnabled(GeneralFactory *factory, bool enable = true);
/*!
* Shows configuration dialog and updates settings automatically.
* @param factory General plugin factory.
* @param parentWidget Parent widget.
*/
- static void showSettings(GeneralFactory* factory, QWidget* parentWidget);
+ static void showSettings(GeneralFactory *factory, QWidget *parentWidget);
/*!
* Returns \b true if general plugin is enabled, otherwise returns \b false
* @param factory General plugin factory.
@@ -71,6 +74,8 @@ public:
static bool isEnabled(const GeneralFactory* factory);
private:
+ General() {}
+ ~General() {}
static void loadPlugins();
static QHash <GeneralFactory*, QObject*> *m_generals;
static QObject *m_parent;
diff --git a/src/qmmpui/generalfactory.cpp b/src/qmmpui/generalfactory.cpp
new file mode 100644
index 000000000..d657dab64
--- /dev/null
+++ b/src/qmmpui/generalfactory.cpp
@@ -0,0 +1,10 @@
+#include <QString>
+#include <QList>
+#include <QtGlobal>
+#include <QWidget>
+#include "generalfactory.h"
+
+QWidget *GeneralFactory::createWidget(int, QWidget *)
+{
+ return nullptr;
+}
diff --git a/src/qmmpui/generalfactory.h b/src/qmmpui/generalfactory.h
index 63a8a80fc..404663792 100644
--- a/src/qmmpui/generalfactory.h
+++ b/src/qmmpui/generalfactory.h
@@ -29,6 +29,14 @@ class QWidget;
class Control;
class General;
+struct WidgetDescription
+{
+ int id;
+ QString name;
+ Qt::DockWidgetAreas allowedAreas;
+};
+
+
/*! @brief Structure to store general plugin properies.
*/
struct GeneralProperties
@@ -39,11 +47,13 @@ struct GeneralProperties
bool hasSettings = false; /*!< Should be \b true if plugin has settings dialog, and \b false otherwise */
bool visibilityControl = false; /*!< Should be \b true if plugin can show/hide main window of the player,
* and \b false otherwise */
+ QList<WidgetDescription> widgets;
};
+
/*! @brief %General plugin interface.
* @author Ilya Kotov <forkotov02@ya.ru>
*/
-class GeneralFactory
+class QMMPUI_EXPORT GeneralFactory
{
public:
/*!
@@ -58,6 +68,7 @@ public:
* Creates object of the General class.
*/
virtual QObject *create(QObject *parent) = 0;
+ virtual QWidget *createWidget(int id, QWidget *parent);
/*!
* Creates configuration dialog.
* @param parent Parent widget.
diff --git a/src/qmmpui/qmmpui.pro b/src/qmmpui/qmmpui.pro
index 7ed777761..41f2a2a03 100644
--- a/src/qmmpui/qmmpui.pro
+++ b/src/qmmpui/qmmpui.pro
@@ -115,7 +115,8 @@ SOURCES += general.cpp \
coverviewer.cpp \
metadataformattermenu.cpp \
covereditor.cpp \
- commandlinehandler.cpp
+ commandlinehandler.cpp \
+ generalfactory.cpp
FORMS += forms/detailsdialog.ui \
forms/tageditor.ui \
diff --git a/src/qmmpui/uihelper.cpp b/src/qmmpui/uihelper.cpp
index 6e800b831..c01ff17bb 100644
--- a/src/qmmpui/uihelper.cpp
+++ b/src/qmmpui/uihelper.cpp
@@ -129,7 +129,22 @@ void UiHelper::registerMenu(UiHelper::MenuType type, QMenu *menu, bool autoHide,
m_menus[type].menu->insertActions(before, m_menus[type].actions);
else
m_menus[type].menu->addActions(m_menus[type].actions);
- m_menus[type].menu->menuAction()->setVisible(!autoHide || !m_menus[type].actions.isEmpty());
+ m_menus[type].menu->menuAction()->setVisible(!autoHide || !m_menus[type].actions.isEmpty());
+}
+
+void UiHelper::addWidget(const QString &id)
+{
+ emit widgetAdded(id);
+}
+
+void UiHelper::removeWidget(const QString &id)
+{
+ emit widgetRemoved(id);
+}
+
+void UiHelper::updateWidget(const QString &id)
+{
+ emit widgetUpdated(id);
}
void UiHelper::addFiles(QWidget *parent, PlayListModel *model)
diff --git a/src/qmmpui/uihelper.h b/src/qmmpui/uihelper.h
index 1b1f76f69..9d31443bf 100644
--- a/src/qmmpui/uihelper.h
+++ b/src/qmmpui/uihelper.h
@@ -98,6 +98,11 @@ public:
* @param before An action, after which the rest are added.
*/
void registerMenu(MenuType type, QMenu *menu, bool autoHide = false, QAction *before = nullptr);
+
+ void addWidget(const QString &id);
+ void removeWidget(const QString &id);
+ void updateWidget(const QString &id);
+
/*!
* Opens 'Add Files' dialog
* @param parent Parent widget
@@ -183,6 +188,10 @@ signals:
*/
void showMainWindowCalled();
+ void widgetAdded(const QString &id);
+ void widgetRemoved(const QString &id);
+ void widgetUpdated(const QString &id);
+
private slots:
void removeAction(QObject *action);
void addSelectedFiles(const QStringList &files, bool play);