diff --git a/src/plugins/qmldesigner/core/core.pri b/src/plugins/qmldesigner/core/core.pri index 128696b67462b7318d74795720c91c370a28b592..03ab20e205d8197a901a5c90261b27bbddfc0eaf 100644 --- a/src/plugins/qmldesigner/core/core.pri +++ b/src/plugins/qmldesigner/core/core.pri @@ -93,7 +93,8 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/model/modelmerger.cpp \ $$PWD/instances/qmltransitionnodeinstance.cpp \ $$PWD/exceptions/rewritingexception.cpp \ - $$PWD/instances/nodeinstancemetaobject.cpp + $$PWD/instances/nodeinstancemetaobject.cpp \ + core/instances/behaviornodeinstance.cpp HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/abstractview.h \ $$PWD/include/nodeinstanceview.h \ @@ -183,7 +184,8 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/instances/qmltransitionnodeinstance.h \ $$PWD/include/customnotifications.h \ $$PWD/include/rewritingexception.h \ - $$PWD/instances/nodeinstancemetaobject.h + $$PWD/instances/nodeinstancemetaobject.h \ + core/instances/behaviornodeinstance.h DISTFILES += $$PWD/metafile/widget.metafile RESOURCES += $$PWD/core.qrc OTHER_FILES += $$PWD/metainfo/gui.metainfo diff --git a/src/plugins/qmldesigner/core/instances/behaviornodeinstance.cpp b/src/plugins/qmldesigner/core/instances/behaviornodeinstance.cpp new file mode 100644 index 0000000000000000000000000000000000000000..766402e56233458db58eee32a3b5ed37fa471c77 --- /dev/null +++ b/src/plugins/qmldesigner/core/instances/behaviornodeinstance.cpp @@ -0,0 +1,74 @@ +#include "behaviornodeinstance.h" + +#include <private/qmlbehavior_p.h> + +#include "invalidnodeinstanceexception.h" + +namespace QmlDesigner { +namespace Internal { + +BehaviorNodeInstance::BehaviorNodeInstance(QObject *object) + : ObjectNodeInstance(object), + m_isEnabled(true) +{ +} + +BehaviorNodeInstance::Pointer BehaviorNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QmlContext *context, QObject *objectToBeWrapped) +{ + QObject *object = 0; + if (objectToBeWrapped) + object = objectToBeWrapped; + else + object = createObject(nodeMetaInfo, context); + + QmlBehavior* behavior = qobject_cast<QmlBehavior*>(object); + if (behavior == 0) + throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__); + + Pointer instance(new BehaviorNodeInstance(behavior)); + + if (objectToBeWrapped) + instance->setDeleteHeldInstance(false); // the object isn't owned + + instance->populateResetValueHash(); + + behavior->setEnabled(false); + + return instance; +} + +void BehaviorNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) +{ + if (name == "enabled") + return; + + ObjectNodeInstance::setPropertyVariant(name, value); +} + +void BehaviorNodeInstance::setPropertyBinding(const QString &name, const QString &expression) +{ + if (name == "enabled") + return; + + ObjectNodeInstance::setPropertyBinding(name, expression); +} + +QVariant BehaviorNodeInstance::property(const QString &name) const +{ + if (name == "enabled") + return QVariant::fromValue(m_isEnabled); + + return ObjectNodeInstance::property(name); +} + +void BehaviorNodeInstance::resetProperty(const QString &name) +{ + if (name == "enabled") + m_isEnabled = true; + + ObjectNodeInstance::resetProperty(name); +} + + +} // namespace Internal +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/core/instances/behaviornodeinstance.h b/src/plugins/qmldesigner/core/instances/behaviornodeinstance.h new file mode 100644 index 0000000000000000000000000000000000000000..2546a309e3d85146f5501a410955db60f51b374e --- /dev/null +++ b/src/plugins/qmldesigner/core/instances/behaviornodeinstance.h @@ -0,0 +1,33 @@ +#ifndef BEHAVIORNODEINSTANCE_H +#define BEHAVIORNODEINSTANCE_H + +#include "objectnodeinstance.h" + +namespace QmlDesigner { +namespace Internal { + +class BehaviorNodeInstance : public ObjectNodeInstance +{ +public: + typedef QSharedPointer<BehaviorNodeInstance> Pointer; + typedef QWeakPointer<BehaviorNodeInstance> WeakPointer; + + BehaviorNodeInstance(QObject *object); + + static Pointer create(const NodeMetaInfo &metaInfo, QmlContext *context, QObject *objectToBeWrapped); + + void setPropertyVariant(const QString &name, const QVariant &value); + void setPropertyBinding(const QString &name, const QString &expression); + + + QVariant property(const QString &name) const; + void resetProperty(const QString &name); + +private: + bool m_isEnabled; +}; + +} // namespace Internal +} // namespace QmlDesigner + +#endif // BEHAVIORNODEINSTANCE_H diff --git a/src/plugins/qmldesigner/core/instances/nodeinstance.cpp b/src/plugins/qmldesigner/core/instances/nodeinstance.cpp index d1ada236e1c2ce4c132a32a63505cfacb56d0637..b3ebbfe7e95c5cc03d40e68002f430f57f09a827 100644 --- a/src/plugins/qmldesigner/core/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/core/instances/nodeinstance.cpp @@ -42,6 +42,7 @@ #include "componentnodeinstance.h" #include "qmltransitionnodeinstance.h" #include "qmlpropertychangesnodeinstance.h" +#include "behaviornodeinstance.h" #include "qmlstatenodeinstance.h" #include "nodeabstractproperty.h" #include "variantproperty.h" @@ -151,6 +152,8 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet instance = Internal::QmlStateNodeInstance::create(metaInfo, context, objectToBeWrapped); else if (metaInfo.isSubclassOf("Qt/Transition", 4, 6)) instance = Internal::QmlTransitionNodeInstance::create(metaInfo, context, objectToBeWrapped); + else if (metaInfo.isSubclassOf("Qt/Behavior", 4, 6)) + instance = Internal::BehaviorNodeInstance::create(metaInfo, context, objectToBeWrapped); else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 6)) instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped); diff --git a/src/plugins/qmldesigner/core/model/modelmerger.cpp b/src/plugins/qmldesigner/core/model/modelmerger.cpp index 4e1efabbc52adf39a59ca01b3e9dae71e845cdb9..42c6ebd669566b048d3925e3c0ed52ee5fa8cf59 100644 --- a/src/plugins/qmldesigner/core/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/core/model/modelmerger.cpp @@ -42,6 +42,8 @@ #include <QSet> #include <QStringList> +#include <QtDebug> + namespace QmlDesigner { static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHash<QString, QString> &idRenamingHash, AbstractView *view); @@ -77,6 +79,20 @@ static void syncId(ModelNode &outputNode, const ModelNode &inputNode, const QHas } } +static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int *number) +{ + QRegExp regularExpression("(.*)(\\d*)"); +// regularExpression.setMinimal(true); + regularExpression.setPatternSyntax(QRegExp::RegExp2); + regularExpression.indexIn(id); + QStringList splitedList = regularExpression.capturedTexts(); + + *baseId = regularExpression.cap(1); + + + qDebug() <<splitedList; +} + static void setupIdRenamingHash(const ModelNode &modelNode, QHash<QString, QString> &idRenamingHash, AbstractView *view) { QList<ModelNode> allNodes(modelNode.allSubModelNodes()); @@ -84,10 +100,14 @@ static void setupIdRenamingHash(const ModelNode &modelNode, QHash<QString, QStri foreach (const ModelNode &node, allNodes) { if (!node.id().isEmpty()) { QString newId = node.id(); - int i = 1; + QString baseId; + int number = 1; + splitIdInBaseNameAndNumber(newId, &baseId, &number); + while (view->hasId(newId) || idRenamingHash.contains(newId)) { - newId = node.id() + QString::number(i).toLower(); - i++; + + newId = baseId + QString::number(number).toLower(); + number++; } idRenamingHash.insert(node.id(), newId); }