123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /*=============================================================================
- Library: CTK
- Copyright (c) German Cancer Research Center,
- Division of Medical and Biological Informatics
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =============================================================================*/
- #ifndef CTKCMDLINEMODULEFRONTEND_H
- #define CTKCMDLINEMODULEFRONTEND_H
- #include "ctkCommandLineModulesCoreExport.h"
- #include <QObject>
- template<class K, class V> class QHash;
- class QUrl;
- class ctkCmdLineModuleFuture;
- class ctkCmdLineModuleReference;
- class ctkCmdLineModuleParameter;
- class ctkCmdLineModuleResult;
- struct ctkCmdLineModuleFrontendPrivate;
- /**
- * \class ctkCmdLineModuleFrontend
- * \brief Abstract base class for all front-end command
- * line module implementations.
- * \ingroup CommandLineModulesCore_API
- *
- * A module front-end represents a set of current parameter values for a specific
- * module. A front-end instance is usually associated with a graphical user interface,
- * accessible via guiHandle(). This allows users to interactively change parameter values
- * of the module.
- *
- * \see ctkCmdLineModuleFrontendQtGui
- * \see ctkCmdLineModuleFrontendQtWebKit
- */
- class CTK_CMDLINEMODULECORE_EXPORT ctkCmdLineModuleFrontend : public QObject
- {
- Q_OBJECT
- Q_ENUMS(ParamterValueRole)
- public:
- enum ParameterValueRole {
- /**
- * Data returned using this role must not 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.
- *
- * This role is usually used by backends for retrieving data and is mainly
- * important for data which acts as a handle to the real data (e.g. a
- * backend usually needs to get the absolute path to a local file for the
- * current value of an input image parameter, instead of the image label
- * displayed in a GUI).
- */
- LocalResourceRole = 0,
- /**
- * Describes data suitable for displaying in a GUI. For many parameter types
- * (e.g. scalar and vector parameters) data returned by this role will be
- * the same as returned by the LocalResourceRole role.
- **/
- DisplayRole = 1,
- /**
- * 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 role can process the data. Or one creates a custom
- * backend which knows how to handle QVariants returned by this role.
- */
- UserRole = 8
- };
- enum ParameterFilter {
- /** Parameters with channel = "input" */
- Input = 0x01,
- /** Parameter with channel = "output" */
- Output = 0x02,
- /** A convenience enum value combining Input and Output. */
- All = Input | Output
- };
- Q_DECLARE_FLAGS(ParameterFilters, ParameterFilter)
- virtual ~ctkCmdLineModuleFrontend();
- /**
- * @brief Returns the GUI representation.
- * @return A GUI handle that can then be embeded in an application window for instance.
- *
- * The returned object is a handle to the real GUI toolkit specific object representing
- * the user interface. For Qt based front-ends, the returned object is usually a QWidget
- * instance pointing to the main container widget for the GUI. See the documentation
- * of the front-end sub-class for specific information.
- */
- virtual QObject* guiHandle() const = 0;
- /**
- * @brief GUIs will need to be able to read parameters,
- * here we retrieve by role.
- *
- * @return QVariant
- * @see ParameterValueRole
- */
- virtual QVariant value(const QString& parameter,
- int role = LocalResourceRole) const = 0;
- /**
- * @brief Set the value of a certain parameter.
- *
- * @param parameter The name of the parameter, as defined in the XML.
- * @param value The value for that parameter.
- * @param role The role for which to set the data.
- *
- * @see ParameterValueRole
- */
- virtual void setValue(const QString& parameter, const QVariant& value,
- int role = DisplayRole) = 0;
- /**
- * @brief Return the ctkCmdLineModuleFuture, derived from QFuture to
- * provide asynchronous processing and interaction with the running frontend.
- *
- * Note that the future returned by this method will be different after the
- * frontend was started. Either use isRunning() to check wether this frontend
- * is currently running or connect to the started() signal.
- *
- * @see ctkCmdLineModuleFuture
- */
- virtual ctkCmdLineModuleFuture future() const;
- /**
- * @brief Returns a QUrl to define the location of the module that is run.
- *
- * For a local process this may be the file location of the command
- * line module. For other implementations, such as a web-service,
- * this could be a web URL.
- *
- * @return QUrl A resource independent URL defining where the module is.
- */
- QUrl location() const;
- /**
- * @brief Returns a ctkCmdLineModuleReference value object that refers
- * and provides access to the module.
- * @return ctkCmdLineModuleReference
- */
- ctkCmdLineModuleReference moduleReference() const;
- /**
- * @brief Returns a list of all valid parameter names.
- */
- virtual QList<QString> parameterNames() const;
- /**
- * @brief Returns a map of parameter names and values.
- */
- virtual QHash<QString,QVariant> values() const;
- /**
- * @brief Enables the parameter values to be set.
- */
- virtual void setValues(const QHash<QString,QVariant>& values);
- /**
- * @brief Indicates if the currently associated ctkCmdLineModuleFuture object
- * is in state "running".
- * @return \c true if running and \c false otherwise.
- */
- bool isRunning() const;
- /**
- * @brief Indicates if the currently associated ctkCmdLineModuleFuture Object
- * is in state "paused".
- * @return \c true if paused and \c false otherwise.
- */
- bool isPaused() const;
- // convenience methods
- /**
- * @brief Useful method to return subsets of parameter objects, searhing
- * by type for example "image" and filter for example "input"/"output".
- * @param type The type of parameter, as defined in the XML element.
- * @param filters flag to define whether we want input/output.
- * @return QList of ctkCmdLineModuleParameter depending on type and filters.
- * @see ParameterFilter
- */
- QList<ctkCmdLineModuleParameter> parameters(
- const QString& type = QString(),
- ParameterFilters filters = All);
- void resetValues();
- Q_SIGNALS:
- /**
- * @brief This signal is emitted whenever a parameter value is changed by using
- * the ctkCmdLineModuleFrontend class.
- * @param parameter The parameter name.
- * @param value The new parameter value.
- *
- * Please note that this signal is not emitted if a parameter value is
- * changed in the generated GUI.
- */
- void valueChanged(const QString& parameter, const QVariant& value);
- /**
- * @brief This signal is emitted when the frontend is run.
- *
- * You can use this signal to get the ctkCmdLineModuleFuture instance
- * from future() to interact with the running frontend.
- */
- void started();
- protected:
- /**
- * @brief Constructor.
- */
- ctkCmdLineModuleFrontend(const ctkCmdLineModuleReference& moduleRef);
- private Q_SLOTS:
- /**
- * @brief Provides results as reported by the running module.
- * @param result
- *
- * This method is called when a running module reports a new
- * result. The default implementation updates the current value
- * of the output parameter in the GUI with the reported value.
- */
- virtual void resultReady(const ctkCmdLineModuleResult& result);
- private:
- /**
- * @brief Sets the ctkCmdLineModuleFuture which effectively
- * contains the backend that is run.
- */
- void setFuture(const ctkCmdLineModuleFuture& future);
- private:
- Q_DISABLE_COPY(ctkCmdLineModuleFrontend)
- friend struct ctkCmdLineModuleFrontendPrivate;
- friend class ctkCmdLineModuleManager;
- friend class ctkCmdLineModulePrivate;
- Q_PRIVATE_SLOT(d, void _q_resultReadyAt(int))
- QScopedPointer<ctkCmdLineModuleFrontendPrivate> d;
- };
- Q_DECLARE_OPERATORS_FOR_FLAGS(ctkCmdLineModuleFrontend::ParameterFilters)
- #endif // CTKCMDLINEMODULEFRONTEND_H
|