Browse Source

Further improved module registration error handling.

Sascha Zelzer 12 years ago
parent
commit
fc8d661299

+ 8 - 22
Applications/ctkCommandLineModuleExplorer/ctkCmdLineModuleExplorerMainWindow.cpp

@@ -27,6 +27,7 @@
 #include "ctkCmdLineModuleExplorerTabList.h"
 #include "ctkCmdLineModuleExplorerTabList.h"
 #include "ctkCmdLineModuleExplorerProgressWidget.h"
 #include "ctkCmdLineModuleExplorerProgressWidget.h"
 #include "ctkCmdLineModuleExplorerConstants.h"
 #include "ctkCmdLineModuleExplorerConstants.h"
+#include "ctkCmdLineModuleExplorerUtils.h"
 
 
 #include <ctkCmdLineModuleManager.h>
 #include <ctkCmdLineModuleManager.h>
 #include <ctkCmdLineModuleConcurrentHelpers.h>
 #include <ctkCmdLineModuleConcurrentHelpers.h>
@@ -132,7 +133,10 @@ ctkCLModuleExplorerMainWindow::~ctkCLModuleExplorerMainWindow()
   qDeleteAll(moduleFrontendFactories);
   qDeleteAll(moduleFrontendFactories);
 
 
   settings.saveState(*this, this->objectName());
   settings.saveState(*this, this->objectName());
-  settings.saveState(*settingsDialog, settingsDialog->objectName());
+  if (settingsDialog)
+  {
+    settings.saveState(*settingsDialog, settingsDialog->objectName());
+  }
 }
 }
 
 
 void ctkCLModuleExplorerMainWindow::addModule(const QUrl &location)
 void ctkCLModuleExplorerMainWindow::addModule(const QUrl &location)
@@ -154,7 +158,7 @@ void ctkCLModuleExplorerMainWindow::closeEvent(QCloseEvent *event)
   if (!runningFrontends.empty())
   if (!runningFrontends.empty())
   {
   {
     QMessageBox::StandardButton button =
     QMessageBox::StandardButton button =
-        QMessageBox::warning(QApplication::topLevelWidgets().front(),
+        QMessageBox::warning(QApplication::activeWindow(),
                              QString("Closing %1 running modules").arg(runningFrontends.size()),
                              QString("Closing %1 running modules").arg(runningFrontends.size()),
                              "Some modules are still running.\n"
                              "Some modules are still running.\n"
                              "Closing the application will cancel all current computations.",
                              "Closing the application will cancel all current computations.",
@@ -235,28 +239,10 @@ void ctkCLModuleExplorerMainWindow::on_actionLoad_triggered()
   this->setCursor(Qt::BusyCursor);
   this->setCursor(Qt::BusyCursor);
   QFuture<ctkCmdLineModuleReference> future = QtConcurrent::mapped(fileNames, ctkCmdLineModuleConcurrentRegister(&this->moduleManager));
   QFuture<ctkCmdLineModuleReference> future = QtConcurrent::mapped(fileNames, ctkCmdLineModuleConcurrentRegister(&this->moduleManager));
   future.waitForFinished();
   future.waitForFinished();
-
-  QString errorMsg;
-  QList<ctkCmdLineModuleReference> refs = future.results();
-  for(int i = 0; i < fileNames.size(); ++i)
-  {
-    if (!refs.at(i))
-    {
-      errorMsg += tr("Failed to register ") + fileNames.at(i) + "\n\n";
-    }
-    else if (!refs.at(i).xmlValidationErrorString().isEmpty() &&
-             this->moduleManager.validationMode() == ctkCmdLineModuleManager::STRICT_VALIDATION)
-    {
-      errorMsg += tr("Failed to register ") + fileNames.at(i) + ":\n" + refs.at(i).xmlValidationErrorString() + "\n\n";
-    }
-  }
-
   this->unsetCursor();
   this->unsetCursor();
 
 
-  if (!errorMsg.isEmpty())
-  {
-    QMessageBox::critical(this, "Failed to register modules", errorMsg);
-  }
+  ctkCmdLineModuleExplorerUtils::messageBoxModuleRegistration(fileNames, future.results(),
+                                                              this->moduleManager.validationMode());
 }
 }
 
 
 void ctkCLModuleExplorerMainWindow::on_actionQuit_triggered()
 void ctkCLModuleExplorerMainWindow::on_actionQuit_triggered()

+ 18 - 3
Applications/ctkCommandLineModuleExplorer/ctkCmdLineModuleExplorerModulesSettings.cpp

@@ -23,6 +23,7 @@
 #include "ctkCmdLineModuleExplorerConstants.h"
 #include "ctkCmdLineModuleExplorerConstants.h"
 #include "ctkCmdLineModuleExplorerUtils.h"
 #include "ctkCmdLineModuleExplorerUtils.h"
 #include "ctkCmdLineModuleExplorerShowXmlAction.h"
 #include "ctkCmdLineModuleExplorerShowXmlAction.h"
+#include "ctkCmdLineModuleExplorerUtils.h"
 
 
 #include "ui_ctkCmdLineModuleExplorerModulesSettings.h"
 #include "ui_ctkCmdLineModuleExplorerModulesSettings.h"
 
 
@@ -81,7 +82,7 @@ void ctkCmdLineModuleExplorerModulesSettings::applySettings()
   this->setCursor(Qt::BusyCursor);
   this->setCursor(Qt::BusyCursor);
 
 
   QFuture<void> future1 = QtConcurrent::mapped(removedModules, ctkCmdLineModuleConcurrentUnRegister(this->ModuleManager));
   QFuture<void> future1 = QtConcurrent::mapped(removedModules, ctkCmdLineModuleConcurrentUnRegister(this->ModuleManager));
-  QFuture<void> future2 = QtConcurrent::mapped(addedModules, ctkCmdLineModuleConcurrentRegister(this->ModuleManager));
+  QFuture<ctkCmdLineModuleReference> future2 = QtConcurrent::mapped(addedModules, ctkCmdLineModuleConcurrentRegister(this->ModuleManager));
 
 
   ctkSettingsPanel::applySettings();
   ctkSettingsPanel::applySettings();
 
 
@@ -93,6 +94,10 @@ void ctkCmdLineModuleExplorerModulesSettings::applySettings()
   this->pathsAdded(addedModules);
   this->pathsAdded(addedModules);
 
 
   this->unsetCursor();
   this->unsetCursor();
+
+  ctkCmdLineModuleExplorerUtils::messageBoxModuleRegistration(addedModules, future2.results(),
+                                                              this->ModuleManager->validationMode());
+
 }
 }
 
 
 void ctkCmdLineModuleExplorerModulesSettings::pathSelected(const QString &path)
 void ctkCmdLineModuleExplorerModulesSettings::pathSelected(const QString &path)
@@ -108,10 +113,9 @@ void ctkCmdLineModuleExplorerModulesSettings::pathsAdded(const QStringList &path
   foreach(const QString& path, paths)
   foreach(const QString& path, paths)
   {
   {
     ctkCmdLineModuleReference moduleRef = this->ModuleManager->moduleReference(QUrl::fromLocalFile(path));
     ctkCmdLineModuleReference moduleRef = this->ModuleManager->moduleReference(QUrl::fromLocalFile(path));
-    if (moduleRef && !moduleRef.xmlValidationErrorString().isEmpty())
+    if (!moduleRef || !moduleRef.xmlValidationErrorString().isEmpty())
     {
     {
       QStandardItem* item = ui->PathListWidget->item(path);
       QStandardItem* item = ui->PathListWidget->item(path);
-      item->setToolTip(item->toolTip() + "\n\nWarning:\n\n" + moduleRef.xmlValidationErrorString());
       if (this->WarningIcon.isNull())
       if (this->WarningIcon.isNull())
       {
       {
         this->WarningIcon = ctkCmdLineModuleExplorerUtils::createIconOverlay(
         this->WarningIcon = ctkCmdLineModuleExplorerUtils::createIconOverlay(
@@ -119,6 +123,17 @@ void ctkCmdLineModuleExplorerModulesSettings::pathsAdded(const QStringList &path
               QApplication::style()->standardPixmap(QStyle::SP_MessageBoxWarning));
               QApplication::style()->standardPixmap(QStyle::SP_MessageBoxWarning));
       }
       }
       item->setIcon(this->WarningIcon);
       item->setIcon(this->WarningIcon);
+
+      QString toolTip = path + "\n\n" + tr("Warning") + ":\n\n";
+      if (moduleRef)
+      {
+        toolTip += moduleRef.xmlValidationErrorString();
+      }
+      else
+      {
+        toolTip += tr("No XML output available.");
+      }
+      item->setToolTip(toolTip);
     }
     }
   }
   }
 }
 }

+ 32 - 0
Applications/ctkCommandLineModuleExplorer/ctkCmdLineModuleExplorerUtils.cpp

@@ -22,6 +22,10 @@
 #include "ctkCmdLineModuleExplorerUtils.h"
 #include "ctkCmdLineModuleExplorerUtils.h"
 
 
 #include <QPainter>
 #include <QPainter>
+#include <QObject>
+#include <QWidget>
+#include <QApplication>
+#include <QMessageBox>
 
 
 QPixmap ctkCmdLineModuleExplorerUtils::createIconOverlay(const QPixmap &base, const QPixmap &overlay)
 QPixmap ctkCmdLineModuleExplorerUtils::createIconOverlay(const QPixmap &base, const QPixmap &overlay)
 {
 {
@@ -34,3 +38,31 @@ QPixmap ctkCmdLineModuleExplorerUtils::createIconOverlay(const QPixmap &base, co
                      overlay.scaled(base.width()/2, base.height()/2, Qt::KeepAspectRatio));
                      overlay.scaled(base.width()/2, base.height()/2, Qt::KeepAspectRatio));
   return result;
   return result;
 }
 }
+
+void ctkCmdLineModuleExplorerUtils:: messageBoxModuleRegistration(const QStringList& modulePaths,
+                                                                 const QList<ctkCmdLineModuleReference>& moduleRefs,
+                                                                 ctkCmdLineModuleManager::ValidationMode validationMode)
+{
+  Q_ASSERT(modulePaths.size() == moduleRefs.size());
+
+  QString errorMsg;
+  for(int i = 0; i < modulePaths.size(); ++i)
+  {
+    if (!moduleRefs.at(i))
+    {
+      errorMsg += QObject::tr("Failed to register ") + modulePaths.at(i) + "\n\n";
+    }
+    else if (!moduleRefs.at(i).xmlValidationErrorString().isEmpty() &&
+             validationMode == ctkCmdLineModuleManager::STRICT_VALIDATION)
+    {
+      errorMsg += QObject::tr("Failed to register ") + modulePaths.at(i) + ":\n" + moduleRefs.at(i).xmlValidationErrorString() + "\n\n";
+    }
+  }
+
+  if (!errorMsg.isEmpty())
+  {
+    QWidget* widget = QApplication::activeModalWidget();
+    if (widget == NULL) widget = QApplication::activeWindow();
+    QMessageBox::critical(widget, QObject::tr("Failed to register modules"), errorMsg);
+  }
+}

+ 6 - 0
Applications/ctkCommandLineModuleExplorer/ctkCmdLineModuleExplorerUtils.h

@@ -22,6 +22,8 @@
 #ifndef CTKCOMMANDLINEMODULEEXPLORERUTILS_H
 #ifndef CTKCOMMANDLINEMODULEEXPLORERUTILS_H
 #define CTKCOMMANDLINEMODULEEXPLORERUTILS_H
 #define CTKCOMMANDLINEMODULEEXPLORERUTILS_H
 
 
+#include "ctkCmdLineModuleManager.h"
+
 #include <QPixmap>
 #include <QPixmap>
 
 
 struct ctkCmdLineModuleExplorerUtils
 struct ctkCmdLineModuleExplorerUtils
@@ -29,6 +31,10 @@ struct ctkCmdLineModuleExplorerUtils
 
 
   static QPixmap createIconOverlay(const QPixmap& base, const QPixmap& overlay);
   static QPixmap createIconOverlay(const QPixmap& base, const QPixmap& overlay);
 
 
+  static void messageBoxModuleRegistration(const QStringList& modulePaths,
+                                           const QList<ctkCmdLineModuleReference>& moduleRefs,
+                                           ctkCmdLineModuleManager::ValidationMode validationMode);
+
 };
 };
 
 
 #endif // CTKCOMMANDLINEMODULEEXPLORERUTILS_H
 #endif // CTKCOMMANDLINEMODULEEXPLORERUTILS_H