diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-10-19 20:36:51 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-10-19 20:36:51 +0000 |
| commit | 6baa843a2a0bdf143617df269129d81dae0a3a38 (patch) | |
| tree | 9a650b4349c1129c8c20b4536228bb838eb9ee67 /src/plugins/Ui | |
| parent | b0ab8e75df1bb8c5752ebf3ed60334f1134b04f3 (diff) | |
| download | qmmp-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
Diffstat (limited to 'src/plugins/Ui')
| -rw-r--r-- | src/plugins/Ui/qsui/dockwidgetlist.cpp | 114 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/dockwidgetlist.h | 32 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.cpp | 8 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.h | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsui.pro | 6 |
5 files changed, 158 insertions, 4 deletions
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 \ |
