Просмотр исходного кода

Added capability of providing different values for parameters using roles.

Sascha Zelzer лет назад: 12
Родитель
Сommit
37c5ca1e8c

+ 29 - 1
Libs/CommandLineModules/Core/ctkCmdLineModuleFrontend.h

@@ -42,11 +42,37 @@ class CTK_CMDLINEMODULECORE_EXPORT ctkCmdLineModuleFrontend : public QObject
 
 public:
 
+  enum ParameterValueRole {
+
+    /* Data returned using this role must no be of any type not supported by
+       QVariant by default. For complex parameter types (like file, image,
+       geometry, etc.) the data must be convertible to a QString pointing
+       to a local resource.
+     */
+    LocalResourceRole = 0,
+
+    /* This role can be used in custom frontends to return a QVariant
+       containing for example an in-memory representation of a complex object.
+       One can then either convert the in-memory representation to a local
+       resource before running a module such that arbitrary backends relying on
+       the LocalResourceRole can process the data. Or one creates a custom
+       backend which knows how to handle QVariants returned by this role.
+     */
+    UserRole = 8
+  };
+
+  enum ParameterFilter {
+    Input = 0x01,
+    Output = 0x02,
+    All = Input | Output
+  };
+  Q_DECLARE_FLAGS(ParameterFilters, ParameterFilter)
+
   ~ctkCmdLineModuleFrontend();
 
   virtual QObject* guiHandle() const = 0;
 
-  virtual QVariant value(const QString& parameter) const = 0;
+  virtual QVariant value(const QString& parameter, int role = LocalResourceRole) const = 0;
   virtual void setValue(const QString& parameter, const QVariant& value) = 0;
 
   virtual ctkCmdLineModuleFuture future() const;
@@ -82,4 +108,6 @@ private:
 
 };
 
+Q_DECLARE_OPERATORS_FOR_FLAGS(ctkCmdLineModuleFrontend::ParameterFilters)
+
 #endif // CTKCMDLINEMODULEFRONTEND_H

+ 30 - 28
Libs/CommandLineModules/Frontend/QtGui/ctkCmdLineModuleFrontendQtGui.cpp

@@ -38,19 +38,12 @@
 struct ctkCmdLineModuleFrontendQtGuiPrivate
 {
   ctkCmdLineModuleFrontendQtGuiPrivate()
-    : Loader(NULL)
-    , Transform(NULL)
-    , Widget(NULL)
+    : Widget(NULL)
   {}
 
-  ~ctkCmdLineModuleFrontendQtGuiPrivate()
-  {
-    delete Loader;
-    delete Transform;
-  }
-
-  mutable QUiLoader* Loader;
-  mutable ctkCmdLineModuleXslTransform* Transform;
+  mutable QScopedPointer<QUiLoader> Loader;
+  mutable QScopedPointer<QIODevice> xslFile;
+  mutable QScopedPointer<ctkCmdLineModuleXslTransform> Transform;
   mutable QWidget* Widget;
 
   // Cache the list of parameter names
@@ -76,9 +69,9 @@ QUiLoader* ctkCmdLineModuleFrontendQtGui::uiLoader() const
 {
   if (d->Loader == NULL)
   {
-    d->Loader = new QUiLoader();
+    d->Loader.reset(new QUiLoader());
   }
-  return d->Loader;
+  return d->Loader.data();
 }
 
 
@@ -87,9 +80,28 @@ ctkCmdLineModuleXslTransform* ctkCmdLineModuleFrontendQtGui::xslTransform() cons
 {
   if (d->Transform == NULL)
   {
-    d->Transform = new ctkCmdLineModuleXslTransform();
+    d->Transform.reset(new ctkCmdLineModuleXslTransform());
+    d->xslFile.reset(new QFile(":/ctkCmdLineModuleXmlToQtUi.xsl"));
+    d->Transform->setXslTransformation(d->xslFile.data());
   }
-  return d->Transform;
+  return d->Transform.data();
+}
+
+
+//-----------------------------------------------------------------------------
+QVariant ctkCmdLineModuleFrontendQtGui::customValue(const QString& parameter, const QString& propertyName) const
+{
+  if (!d->Widget) return QVariant();
+
+  ctkCmdLineModuleObjectTreeWalker reader(d->Widget);
+  while(reader.readNextParameter())
+  {
+    if(reader.name() == parameter)
+    {
+      return reader.value(propertyName);
+    }
+  }
+  return QVariant();
 }
 
 
@@ -108,8 +120,6 @@ QObject* ctkCmdLineModuleFrontendQtGui::guiHandle() const
   xslTransform->setInput(&input);
   xslTransform->setOutput(&uiForm);
 
-  QFile qtGuiTransformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
-  xslTransform->setXslTransformation(&qtGuiTransformation);
   if (!xslTransform->transform())
   {
     // maybe throw an exception
@@ -131,19 +141,11 @@ QObject* ctkCmdLineModuleFrontendQtGui::guiHandle() const
 
 
 //-----------------------------------------------------------------------------
-QVariant ctkCmdLineModuleFrontendQtGui::value(const QString &parameter) const
+QVariant ctkCmdLineModuleFrontendQtGui::value(const QString &parameter, int role) const
 {
-  if (!d->Widget) return QVariant();
+  Q_UNUSED(role)
 
-  ctkCmdLineModuleObjectTreeWalker reader(d->Widget);
-  while(reader.readNextParameter())
-  {
-    if(reader.name() == parameter)
-    {
-      return reader.value();
-    }
-  }
-  return QVariant();
+  return customValue(parameter);
 }
 
 

+ 3 - 1
Libs/CommandLineModules/Frontend/QtGui/ctkCmdLineModuleFrontendQtGui.h

@@ -46,7 +46,7 @@ public:
 
   virtual QObject* guiHandle() const;
 
-  virtual QVariant value(const QString& parameter) const;
+  virtual QVariant value(const QString& parameter, int role = LocalResourceRole) const;
   virtual void setValue(const QString& parameter, const QVariant& value);
 
   virtual QList<QString> parameterNames() const;
@@ -56,6 +56,8 @@ protected:
   virtual QUiLoader* uiLoader() const;
   virtual ctkCmdLineModuleXslTransform* xslTransform() const;
 
+  QVariant customValue(const QString& parameter, const QString& propertyName = QString()) const;
+
 private:
 
   QScopedPointer<ctkCmdLineModuleFrontendQtGuiPrivate> d;

+ 6 - 2
Libs/CommandLineModules/Frontend/QtGui/ctkCmdLineModuleObjectTreeWalker.cpp

@@ -105,9 +105,13 @@ QString ctkCmdLineModuleObjectTreeWalker::label() const
 }
 
 //----------------------------------------------------------------------------
-QVariant ctkCmdLineModuleObjectTreeWalker::value() const
+QVariant ctkCmdLineModuleObjectTreeWalker::value(const QString &propertyName) const
 {
-  QString valProp = property("valueProperty").toString();
+  QString valProp = propertyName;
+  if (valProp.isEmpty())
+  {
+    valProp = property("valueProperty").toString();
+  }
   return property(valProp);
 }
 

+ 2 - 1
Libs/CommandLineModules/Frontend/QtGui/ctkCmdLineModuleObjectTreeWalker_p.h

@@ -23,6 +23,7 @@
 #define CTKCMDLINEMODULEOBJECTTREEWALKER_H
 
 #include <QStack>
+#include <QString>
 
 class QObject;
 class QVariant;
@@ -57,7 +58,7 @@ public:
 
   QString name() const;
   QString label() const;
-  QVariant value() const;
+  QVariant value(const QString& propertyName = QString()) const;
 
   void setValue(const QVariant& value);
 

+ 2 - 1
Libs/CommandLineModules/Testing/Cpp/ctkCmdLineModuleFutureTest.cpp

@@ -53,8 +53,9 @@ public:
 
       virtual QObject* guiHandle() const { return NULL; }
 
-      virtual QVariant value(const QString& parameter) const
+      virtual QVariant value(const QString& parameter, int role) const
       {
+        Q_UNUSED(role)
         QVariant value = currentValues[parameter];
         if (!value.isValid())
           return this->moduleReference().description().parameter(parameter).defaultValue();