Sfoglia il codice sorgente

Support executing a module via a ctkCmdLineModuleInstance object.

Sascha Zelzer 13 anni fa
parent
commit
099af96647

+ 15 - 11
Applications/ctkCommandLineModuleExplorer/ctkCLModuleExplorerMainWindow.cpp

@@ -51,7 +51,7 @@ void ctkCLModuleExplorerMainWindow::addModuleTab(const ctkCmdLineModuleReference
 
   QWidget* widget = qobject_cast<QWidget*>(guiHandle);
   int tabIndex = ui->mainTabWidget->addTab(widget, widget->objectName());
-  mapTabToModuleRef[tabIndex] = moduleRef;
+  mapTabToModuleRef[tabIndex] = moduleInstance;
 }
 
 void ctkCLModuleExplorerMainWindow::addModule(const QString &location)
@@ -70,12 +70,16 @@ void ctkCLModuleExplorerMainWindow::on_actionRun_triggered()
 //  QStringList cmdLineArgs = ctkCmdLineModuleManager::createCommandLineArgs(ui->mainTabWidget->currentWidget());
 //  qDebug() << cmdLineArgs;
 
-//  ctkCmdLineModuleReference moduleRef = mapTabToModuleRef[ui->mainTabWidget->currentIndex()];
-//  if (!moduleRef.isValid())
-//  {
-//    qWarning() << "Invalid module reference";
-//    return;
-//  }
+  ctkCmdLineModuleInstance* moduleInstance = mapTabToModuleRef[ui->mainTabWidget->currentIndex()];
+  if (!moduleInstance)
+  {
+    qWarning() << "Invalid module instance";
+    return;
+  }
+
+  ctkCmdLineModuleProcessFuture future = moduleInstance->run();
+  //future.waitForFinished();
+  //qDebug() << future.standardOutput();
 
 //  connect(&futureWatcher, SIGNAL(finished()), this, SLOT(futureFinished()));
 //  ctkCmdLineModuleProcessFuture future = moduleManager.run(moduleRef);
@@ -89,7 +93,7 @@ void ctkCLModuleExplorerMainWindow::futureFinished()
   qDebug() << "stderr:" << futureWatcher.future().standardError();
 }
 
-ctkCmdLineModuleReference ctkCLModuleExplorerMainWindow::moduleReference(int tabIndex)
-{
-  return mapTabToModuleRef[tabIndex];
-}
+//ctkCmdLineModuleReference ctkCLModuleExplorerMainWindow::moduleReference(int tabIndex)
+//{
+//  return mapTabToModuleRef[tabIndex];
+//}

+ 3 - 2
Applications/ctkCommandLineModuleExplorer/ctkCLModuleExplorerMainWindow.h

@@ -55,14 +55,15 @@ protected:
 
   void addModuleTab(const ctkCmdLineModuleReference& moduleRef);
 
-  ctkCmdLineModuleReference moduleReference(int tabIndex);
+  //ctkCmdLineModuleReference moduleReference(int tabIndex);
   
 private:
+
   Ui::ctkCLModuleExplorerMainWindow *ui;
 
   ctkCmdLineModuleManager moduleManager;
 
-  QHash<int, ctkCmdLineModuleReference> mapTabToModuleRef;
+  QHash<int, ctkCmdLineModuleInstance*> mapTabToModuleRef;
 
   ctkCmdLineModuleProcessFutureWatcher futureWatcher;
 };

+ 8 - 3
Libs/CommandLineModules/Core/Testing/CLIModules/Blur2dImage/ctkCLIModuleBlur2dImage.cpp

@@ -42,12 +42,15 @@ int main(int argc, char* argv[])
   parser.addArgument("help", "h", QVariant::Bool, "Show this help text");
   parser.addArgument("xml", "", QVariant::Bool, "Print a XML description of this modules command line interface");
 
+  QTextStream out(stdout, QIODevice::WriteOnly);
+  QTextStream err(stderr, QIODevice::WriteOnly);
+
   // Parse the command line arguments
   bool ok = false;
   QHash<QString, QVariant> parsedArgs = parser.parseArguments(QCoreApplication::arguments(), &ok);
   if (!ok)
   {
-    QTextStream(stderr, QIODevice::WriteOnly) << "Error parsing arguments: "
+    err << "Error parsing arguments: "
                                               << parser.errorString() << "\n";
     return EXIT_FAILURE;
   }
@@ -55,7 +58,7 @@ int main(int argc, char* argv[])
   // Show a help message
   if (parsedArgs.contains("help") || parsedArgs.contains("h"))
   {
-    QTextStream(stdout, QIODevice::WriteOnly) << parser.helpText();
+    out << parser.helpText();
     return EXIT_SUCCESS;
   }
 
@@ -63,11 +66,13 @@ int main(int argc, char* argv[])
   {
     QFile xmlDescription(":/ctkCLIModuleBlur2dImage.xml");
     xmlDescription.open(QIODevice::ReadOnly);
-    QTextStream(stdout, QIODevice::WriteOnly) << xmlDescription.readAll();
+    out << xmlDescription.readAll();
     return EXIT_SUCCESS;
   }
 
   // Do something
 
+  out << "Got parameter: " << QCoreApplication::arguments();
+
   return EXIT_SUCCESS;
 }

+ 62 - 2
Libs/CommandLineModules/Core/ctkCmdLineModuleInstance.cpp

@@ -20,9 +20,15 @@
 =============================================================================*/
 
 #include "ctkCmdLineModuleInstance.h"
+#include "ctkCmdLineModuleReference.h"
 #include "ctkCmdLineModuleObjectHierarchyReader.h"
+#include "ctkCmdLineModuleObjectHierarchyReader.h"
+#include "ctkCmdLineModuleProcessRunner_p.h"
+
+#include "ctkException.h"
 
 #include <QStringList>
+#include <QDebug>
 
 namespace {
 
@@ -35,9 +41,16 @@ QString normalizeFlag(const QString& flag)
 
 struct ctkCmdLineModuleInstancePrivate
 {
-  QStringList createCommandLineArgs(QObject *hierarchy)
+  ctkCmdLineModuleInstancePrivate(ctkCmdLineModuleInstance* qq,
+                                  const ctkCmdLineModuleReference& moduleRef)
+    : ModuleReference(moduleRef), q(qq)
+  {
+
+  }
+
+  QStringList createCommandLineArgs()
   {
-    ctkCmdLineModuleObjectHierarchyReader reader(hierarchy);
+    ctkCmdLineModuleObjectHierarchyReader reader(q->parameterValueModel());
 
     QStringList cmdLineArgs;
     QHash<int, QString> indexedArgs;
@@ -85,4 +98,51 @@ struct ctkCmdLineModuleInstancePrivate
 
     return cmdLineArgs;
   }
+
+  ctkCmdLineModuleReference ModuleReference;
+
+private:
+
+  ctkCmdLineModuleInstance* q;
+
 };
+
+
+ctkCmdLineModuleInstance::ctkCmdLineModuleInstance(const ctkCmdLineModuleReference& moduleRef)
+  : d(new ctkCmdLineModuleInstancePrivate(this, moduleRef))
+{
+}
+
+ctkCmdLineModuleInstance::~ctkCmdLineModuleInstance()
+{
+}
+
+QObject *ctkCmdLineModuleInstance::parameterValueModel() const
+{
+  return guiHandle();
+}
+
+QVariant ctkCmdLineModuleInstance::value(const QString &parameter) const
+{
+  throw ctkException("not implemented yet");
+}
+
+void ctkCmdLineModuleInstance::setValue(const QString &parameter, const QVariant &value)
+{
+  throw ctkException("not implemented yet");
+}
+
+ctkCmdLineModuleReference ctkCmdLineModuleInstance::moduleReference() const
+{
+  return d->ModuleReference;
+}
+
+ctkCmdLineModuleProcessFuture ctkCmdLineModuleInstance::run() const
+{
+  // TODO: manage memory
+  QStringList args = d->createCommandLineArgs();
+  qDebug() << args;
+  ctkCmdLineModuleProcessRunner* moduleProcess =
+      new ctkCmdLineModuleProcessRunner(d->ModuleReference.location(), args);
+  return moduleProcess->start();
+}

+ 25 - 3
Libs/CommandLineModules/Core/ctkCmdLineModuleInstance.h

@@ -22,23 +22,45 @@
 #ifndef CTKCMDLINEMODULEINSTANCE_H
 #define CTKCMDLINEMODULEINSTANCE_H
 
-#include <ctkCommandLineModulesCoreExport.h>
+#include "ctkCommandLineModulesCoreExport.h"
+#include "ctkCmdLineModuleProcessFuture.h"
 
 #include <QObject>
 
+class ctkCmdLineModuleReference;
+class ctkCmdLineModuleInstancePrivate;
+
 class CTK_CMDLINEMODULECORE_EXPORT ctkCmdLineModuleInstance : public QObject
 {
   Q_OBJECT
 
 public:
 
+  ~ctkCmdLineModuleInstance();
+
   virtual QObject* guiHandle() const = 0;
 
-  virtual QVariant value(const QString& parameter) const = 0;
-  virtual void setValue(const QString& parameter, const QVariant& value) = 0;
+  QVariant value(const QString& parameter) const;
+  void setValue(const QString& parameter, const QVariant& value);
+
+  ctkCmdLineModuleReference moduleReference() const;
+
+  ctkCmdLineModuleProcessFuture run() const;
 
   Q_SIGNAL void valueChanged(const QString& parameter, const QVariant& value);
 
+protected:
+
+  ctkCmdLineModuleInstance(const ctkCmdLineModuleReference& moduleRef);
+
+  virtual QObject* parameterValueModel() const;
+
+private:
+
+  friend class ctkCmdLineModuleInstancePrivate;
+
+  QScopedPointer<ctkCmdLineModuleInstancePrivate> d;
+
 };
 
 #endif // CTKCMDLINEMODULEINSTANCE_H

+ 0 - 8
Libs/CommandLineModules/Core/ctkCmdLineModuleManager.cpp

@@ -121,11 +121,3 @@ ctkCmdLineModuleManager::moduleInstances(const ctkCmdLineModuleReference& module
 {
   throw ctkException("not implemented yet");
 }
-
-//ctkCmdLineModuleProcessFuture ctkCmdLineModuleManager::run(const ctkCmdLineModuleReference& moduleRef)
-//{
-  // TODO: manage memory
-  //QStringList args = createCommandLineArgs(moduleRef.d->objectRepresentation);
-  //ctkCmdLineModuleProcessRunner* moduleProcess = new ctkCmdLineModuleProcessRunner(moduleRef.location(), args);
-  //return moduleProcess->start();
-//}

+ 0 - 4
Libs/CommandLineModules/Core/ctkCmdLineModuleManager.h

@@ -66,10 +66,6 @@ public:
 
   QList<ctkCmdLineModuleInstance*> moduleInstances(const ctkCmdLineModuleReference& moduleRef) const;
 
-  //static QStringList createCommandLineArgs(QObject* hierarchy);
-
-  //static ctkCmdLineModuleProcessFuture run(const ctkCmdLineModuleReference& moduleRef);
-
 private:
 
   QScopedPointer<ctkCmdLineModuleManagerPrivate> d;

+ 2 - 1
Libs/CommandLineModules/QtGui/ctkCmdLineModuleInstanceQtGui.cpp

@@ -31,7 +31,8 @@
 #include <QDebug>
 
 ctkCmdLineModuleInstanceQtGui::ctkCmdLineModuleInstanceQtGui(const ctkCmdLineModuleReference& moduleRef)
-  : WidgetTree(NULL), XmlDescription(moduleRef.rawXmlDescription())
+  : ctkCmdLineModuleInstance(moduleRef),
+    WidgetTree(NULL), XmlDescription(moduleRef.rawXmlDescription())
 {
 }