From 24aff07c12479b93ffa54f7948902a3e179cbcf1 Mon Sep 17 00:00:00 2001 From: "Sandro S. Andrade" Date: Fri, 22 Nov 2013 18:40:58 -0300 Subject: Add initial implementation of DuSE design dimension instances creation Change-Id: I0fad717851329d7664048d51b2992a6654e2650f Reviewed-by: Sandro S. Andrade --- examples/uml/duse-mt/src/app/SADuse.xmi | 6 +- .../duse-mt/src/app/shell/projectcontroller.cpp | 5 ++ .../uml/duse-mt/src/app/shell/projectcontroller.h | 1 + .../src/libs/duseinterfaces/iprojectcontroller.h | 2 + .../designspaceexplorer/designspaceexplorer.pro | 2 +- .../designspaceexplorerplugin.cpp | 84 ++++++++++++++++++++-- src/modeling/qmodelingobject.cpp | 6 ++ src/modeling/qmodelingobject.h | 1 + 8 files changed, 97 insertions(+), 10 deletions(-) diff --git a/examples/uml/duse-mt/src/app/SADuse.xmi b/examples/uml/duse-mt/src/app/SADuse.xmi index 6457c864..8eea2091 100644 --- a/examples/uml/duse-mt/src/app/SADuse.xmi +++ b/examples/uml/duse-mt/src/app/SADuse.xmi @@ -106,7 +106,7 @@ JavaScript - var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected; + var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { selected.push(typeof(input[i])); } selected; @@ -196,7 +196,7 @@ JavaScript - var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected; + var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i].isKindOf("QSADuseProfileProcessComponent")) selected.push(input[i].base_Component); } selected; @@ -238,7 +238,7 @@ JavaScript - var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i] instanceof QSADuseProfileProcessComponent) selected.push(input[i].base_Component); } selected; + var inputLength = input.length; var selected = new Array(); for (var i = 0; i < inputLength; ++i) { if (input[i].isKindOf("QSADuseProfileProcessComponent")) selected.push(input[i].base_Component); } selected; diff --git a/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp b/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp index e95e9855..1718d1ee 100644 --- a/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp +++ b/examples/uml/duse-mt/src/app/shell/projectcontroller.cpp @@ -79,6 +79,11 @@ QList ProjectController::currentModelObjects() const return _currentModelObjects; } +QList ProjectController::currentModelElements() const +{ + return _currentModelElements; +} + bool ProjectController::openModel(const QString &fileName) { qDeleteAll(_currentModelElements); diff --git a/examples/uml/duse-mt/src/app/shell/projectcontroller.h b/examples/uml/duse-mt/src/app/shell/projectcontroller.h index bc161cdd..38bc4c3a 100644 --- a/examples/uml/duse-mt/src/app/shell/projectcontroller.h +++ b/examples/uml/duse-mt/src/app/shell/projectcontroller.h @@ -59,6 +59,7 @@ public: virtual QStringList errorStrings() const; virtual QString currentModelFileName() const; virtual QList currentModelObjects() const; + virtual QList currentModelElements() const; public Q_SLOTS: virtual bool openModel(const QString &fileName); diff --git a/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h b/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h index 551038f8..c48e066c 100644 --- a/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h +++ b/examples/uml/duse-mt/src/libs/duseinterfaces/iprojectcontroller.h @@ -48,6 +48,7 @@ class QWidget; class QModelingObject; +class QModelingElement; class QMetaModelPlugin; namespace DuSE @@ -65,6 +66,7 @@ public: virtual QStringList errorStrings() const = 0; virtual QString currentModelFileName() const = 0; virtual QList currentModelObjects() const = 0; + virtual QList currentModelElements() const = 0; public Q_SLOTS: virtual bool openModel(const QString &fileName) = 0; diff --git a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro index 4e6506c7..ac665d9c 100644 --- a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro +++ b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorer.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += widgets quick modeling script +QT += widgets quick modeling script uml duse saduseprofile-private include(../../duse-mt-plugin.pri) diff --git a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp index 305e164e..a072c233 100644 --- a/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp +++ b/examples/uml/duse-mt/src/plugins/designspaceexplorer/designspaceexplorerplugin.cpp @@ -56,11 +56,63 @@ #include +#include + #include #include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include "private/qsaduseprofileprocesscomponentobject_p.h" + #include "newdusedesigndialog.h" +template +QScriptValue qSetToScriptValue(QScriptEngine *engine, const QSet &elements) +{ + QScriptValue array = engine->newArray(); + foreach (T *element, elements) + array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << engine->newQObject(element)); + return array; +} + +template +void scriptValueToQSet(const QScriptValue &obj, QSet &elements) +{ + QScriptValueIterator it(obj); + while (it.hasNext()) { + it.next(); + elements.insert(qobject_cast(it.value().toQObject())); + } +} + +template +QScriptValue qListToScriptValue(QScriptEngine *engine, const QList &elements) +{ + QScriptValue array = engine->newArray(); + foreach (T *element, elements) + array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << engine->newQObject(element)); + return array; +} + +template +void scriptValueToQList(const QScriptValue &obj, QList &elements) +{ + QScriptValueIterator it(obj); + while (it.hasNext()) { + it.next(); + elements.append(qobject_cast(it.value().toQObject())); + } +} + DesignSpaceExplorerPlugin::DesignSpaceExplorerPlugin(QObject *parent) : DuSE::IPlugin(parent), _currentDesignSpaceLocationQuickView(new QQuickView), @@ -75,6 +127,8 @@ DesignSpaceExplorerPlugin::~DesignSpaceExplorerPlugin() delete _newDuseDesignDialog; } +Q_SCRIPT_DECLARE_QMETAOBJECT(QSADuseProfileProcessComponentObject, QSADuseProfileProcessComponent *); + bool DesignSpaceExplorerPlugin::initialize(DuSE::ICore *core) { _core = core; @@ -134,6 +188,9 @@ bool DesignSpaceExplorerPlugin::initialize(DuSE::ICore *core) connect(_actionFileOpenDuseDesign, &QAction::triggered, this, &DesignSpaceExplorerPlugin::openDuseDesign); core->uiController()->addAction(_actionFileOpenDuseDesign, "menu_File"); + qScriptRegisterMetaType(&_engine, qSetToScriptValue, scriptValueToQSet); + qScriptRegisterMetaType(&_engine, qListToScriptValue, scriptValueToQList); + return true; } @@ -163,9 +220,13 @@ void DesignSpaceExplorerPlugin::newDuseDesign() } bool found = false; - foreach (QObject *profileApplication, _core->projectController()->currentModelObjects().first()->property("profileApplications").value< QSet >()) { - if ((profileApplication->property("appliedProfile").value())->property("name").toString() == _duseInstance.first()->asQModelingObject()->property("requiredProfile")) + QUmlModel *package = dynamic_cast(_core->projectController()->currentModelElements().first()); + QDuseDesignSpace *designSpace = dynamic_cast(_duseInstance.first()); + foreach (QUmlProfileApplication *profileApplication, package->profileApplications()) { + if (profileApplication->appliedProfile()->name() == designSpace->requiredProfile()) { found = true; + break; + } } if (!found) { @@ -178,12 +239,23 @@ void DesignSpaceExplorerPlugin::newDuseDesign() array.property(QString::fromLatin1("push")).call(array, QScriptValueList() << _engine.newQObject(modelingObject)); _engine.globalObject().setProperty("input", array); - foreach (QObject *designDimension, _duseInstance.first()->asQModelingObject()->property("designDimensions").value< QList >()) { - foreach (const QString &body, (designDimension->property("instanceSelectionRule").value())->property("bodies").value< QList >()) { + foreach (QDuseDesignDimension *designDimension, designSpace->designDimensions()) { + foreach (const QString &body, designDimension->instanceSelectionRule()->bodies()) { qDebug() << body; QScriptValue value = _engine.evaluate(body); - if (value.toQObject()) - qDebug() << "result: " << value.toQObject()->objectName(); + if (value.toVariant().canConvert(QMetaType::type("QList"))) { + foreach (QObject *targetInstance, value.toVariant().value< QList >()) { + QDuseDesignDimensionInstance *designDimensionInstance = new QDuseDesignDimensionInstance; + designDimensionInstance->setTargetInstance(qmodelingelementproperty_cast(targetInstance)); + designDimension->addDesignDimensionInstance(designDimensionInstance); + } + } + else if (value.toVariant().canConvert(QMetaType::type("QObject*"))) { + QDuseDesignDimensionInstance *designDimensionInstance = new QDuseDesignDimensionInstance; + designDimensionInstance->setTargetInstance(qmodelingelementproperty_cast(value.toVariant().value())); + designDimension->addDesignDimensionInstance(designDimensionInstance); + } + qDebug() << "result: " << value.toVariant(); } } diff --git a/src/modeling/qmodelingobject.cpp b/src/modeling/qmodelingobject.cpp index 48169ee4..9e7ba5c3 100644 --- a/src/modeling/qmodelingobject.cpp +++ b/src/modeling/qmodelingobject.cpp @@ -106,6 +106,12 @@ QStringList &QModelingObject::modifiedResettableProperties() return d->modifiedResettableProperties; } +bool QModelingObject::isKindOf(QString type) const +{ + Q_D(const QModelingObject); + return d->propertyGroups.contains(type); +} + QModelingObject::QModelingObject() : QObject(*new QModelingObjectPrivate) { diff --git a/src/modeling/qmodelingobject.h b/src/modeling/qmodelingobject.h index 66d365c9..ba8f6aa7 100644 --- a/src/modeling/qmodelingobject.h +++ b/src/modeling/qmodelingobject.h @@ -70,6 +70,7 @@ public: const QStringList &propertyGroups() const; const QMultiHash &groupProperties() const; QStringList &modifiedResettableProperties(); + Q_INVOKABLE bool isKindOf(QString type) const; static QHash< QString, QHash< QString, QHash > > propertyDataHash; -- cgit v1.2.3