Selaa lähdekoodia

ENH: PluginBrowser: adding support for explicitly starting and stopping plugins

Sascha Zelzer 15 vuotta sitten
vanhempi
commit
26007d1670

+ 1 - 0
Applications/ctkPluginBrowser/CMakeLists.txt

@@ -17,6 +17,7 @@ SET(KIT_SRCS
 SET(KIT_MOC_SRCS
   ctkPluginBrowser.h
   ctkPluginBrowserEditors.h
+  ctkPluginTableModel.h
   )
 
 # UI files

+ 32 - 4
Applications/ctkPluginBrowser/ctkPluginBrowser.cpp

@@ -42,7 +42,19 @@
 ctkPluginBrowser::ctkPluginBrowser(ctkPluginFramework* framework)
   : framework(framework)
 {
+  pluginEventTypeToString[ctkPluginEvent::INSTALLED] = "Installed";
+  pluginEventTypeToString[ctkPluginEvent::LAZY_ACTIVATION] = "Lazy Activation";
+  pluginEventTypeToString[ctkPluginEvent::RESOLVED] = "Resolved";
+  pluginEventTypeToString[ctkPluginEvent::STARTED] = "Started";
+  pluginEventTypeToString[ctkPluginEvent::STARTING] = "Starting";
+  pluginEventTypeToString[ctkPluginEvent::STOPPED] = "Stopped";
+  pluginEventTypeToString[ctkPluginEvent::STOPPING] = "Stopping";
+  pluginEventTypeToString[ctkPluginEvent::UNINSTALLED] = "Uninstalled";
+  pluginEventTypeToString[ctkPluginEvent::UNRESOLVED] = "Unresolved";
+  pluginEventTypeToString[ctkPluginEvent::UPDATED] = "Updated";
+
   framework->getPluginContext()->connectFrameworkListener(this, SLOT(frameworkEvent(ctkPluginFrameworkEvent)));
+  framework->getPluginContext()->connectPluginListener(this, SLOT(pluginEvent(ctkPluginEvent)));
 
   QStringList pluginDirs;
 #ifdef CMAKE_INTDIR
@@ -108,7 +120,15 @@ void ctkPluginBrowser::pluginSelected(const QModelIndex &index)
   QVariant v = index.data(Qt::UserRole);
 
   ctkPlugin* plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
+  updatePluginToolbar(plugin);
 
+  QAbstractItemModel* oldModel = ui.pluginResourcesTreeView->model();
+  ui.pluginResourcesTreeView->setModel(new ctkPluginResourcesTreeModel(plugin, this));
+  if (oldModel) oldModel->deleteLater();;
+}
+
+void ctkPluginBrowser::updatePluginToolbar(ctkPlugin* plugin)
+{
   startPluginAction->setEnabled(false);
   stopPluginAction->setEnabled(false);
 
@@ -125,10 +145,6 @@ void ctkPluginBrowser::pluginSelected(const QModelIndex &index)
   {
     stopPluginAction->setEnabled(true);
   }
-
-  QAbstractItemModel* oldModel = ui.pluginResourcesTreeView->model();
-  ui.pluginResourcesTreeView->setModel(new ctkPluginResourcesTreeModel(plugin, this));
-  if (oldModel) oldModel->deleteLater();;
 }
 
 void ctkPluginBrowser::pluginDoubleClicked(const QModelIndex& index)
@@ -190,6 +206,18 @@ void ctkPluginBrowser::frameworkEvent(const ctkPluginFrameworkEvent& event)
   qDebug() << "FrameworkEvent: [" << event.getPlugin()->getSymbolicName() << "]" << event.getErrorString();
 }
 
+void ctkPluginBrowser::pluginEvent(const ctkPluginEvent& event)
+{
+  qDebug() << "PluginEvent: [" << event.getPlugin()->getSymbolicName() << "]" << pluginEventTypeToString[event.getType()];
+
+  ctkPlugin* plugin = event.getPlugin();
+  QModelIndexList selection = ui.pluginsTableView->selectionModel()->selectedIndexes();
+  if (!selection.isEmpty() && selection.first().data(Qt::UserRole).toLongLong() == plugin->getPluginId())
+  {
+    updatePluginToolbar(plugin);
+  }
+}
+
 void ctkPluginBrowser::startPlugin()
 {
   QModelIndex selection = ui.pluginsTableView->selectionModel()->currentIndex();

+ 6 - 0
Applications/ctkPluginBrowser/ctkPluginBrowser.h

@@ -28,6 +28,7 @@
 
 #include "ctkPluginBrowserEditors.h"
 
+#include <ctkPluginEvent.h>
 #include <ctkPluginFrameworkEvent.h>
 
 
@@ -49,12 +50,17 @@ private slots:
   void dbResourceDoubleClicked(const QModelIndex& index);
 
   void frameworkEvent(const ctkPluginFrameworkEvent& event);
+  void pluginEvent(const ctkPluginEvent& event);
 
   void startPlugin();
   void stopPlugin();
 
 private:
 
+  void updatePluginToolbar(ctkPlugin* plugin);
+
+  QMap<ctkPluginEvent::Type, QString> pluginEventTypeToString;
+
   ctkPluginFramework* framework;
 
   Ui::ctkPluginBrowserWindow ui;

+ 8 - 0
Applications/ctkPluginBrowser/ctkPluginTableModel.cpp

@@ -28,6 +28,7 @@ ctkPluginTableModel::ctkPluginTableModel(ctkPluginContext* pc, QObject* parent)
   : QAbstractTableModel(parent)
 {
   plugins = pc->getPlugins();
+  pc->connectPluginListener(this, SLOT(pluginChanged(ctkPluginEvent)));
 }
 
 QVariant ctkPluginTableModel::data(const QModelIndex& index, int role) const
@@ -114,3 +115,10 @@ QString ctkPluginTableModel::getStringForState(const ctkPlugin::State state) con
   default: return QString("unknown");
   }
 }
+
+void ctkPluginTableModel::pluginChanged(const ctkPluginEvent& event)
+{
+  QModelIndex topLeftIndex = createIndex(plugins.indexOf(event.getPlugin()), 0, 0);
+  QModelIndex bottomRightIndex = createIndex(topLeftIndex.row(), columnCount()-1, 0);
+  emit dataChanged(topLeftIndex, bottomRightIndex);
+}

+ 7 - 0
Applications/ctkPluginBrowser/ctkPluginTableModel.h

@@ -32,6 +32,9 @@ class ctkPluginContext;
 
 class ctkPluginTableModel : public QAbstractTableModel
 {
+
+  Q_OBJECT
+
 public:
 
   ctkPluginTableModel(ctkPluginContext* pc, QObject* parent = 0);
@@ -43,6 +46,10 @@ public:
   int columnCount(const QModelIndex& parent = QModelIndex()) const;
   int rowCount(const QModelIndex& parent = QModelIndex()) const;
 
+protected slots:
+
+  void pluginChanged(const ctkPluginEvent& event);
+
 private:
 
   QString getStringForState(const ctkPlugin::State state) const;