diff options
| -rw-r--r-- | src/plugins/General/lyrics/lyricsfactory.cpp | 9 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricsfactory.h | 1 | ||||
| -rw-r--r-- | src/plugins/General/lyrics/lyricswindow.cpp | 10 | ||||
| -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 | ||||
| -rw-r--r-- | src/qmmpui/general.cpp | 66 | ||||
| -rw-r--r-- | src/qmmpui/general.h | 9 | ||||
| -rw-r--r-- | src/qmmpui/generalfactory.cpp | 10 | ||||
| -rw-r--r-- | src/qmmpui/generalfactory.h | 13 | ||||
| -rw-r--r-- | src/qmmpui/qmmpui.pro | 3 | ||||
| -rw-r--r-- | src/qmmpui/uihelper.cpp | 17 | ||||
| -rw-r--r-- | src/qmmpui/uihelper.h | 9 |
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); |
