summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/qmldesigner/core/model/bindingproperty.cpp2
-rw-r--r--src/plugins/qmldesigner/core/model/model.cpp35
-rw-r--r--src/plugins/qmldesigner/core/model/model_p.h22
-rw-r--r--src/plugins/qmldesigner/core/model/modelnode.cpp4
-rw-r--r--src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp1
-rw-r--r--src/plugins/qmldesigner/core/model/nodelistproperty.cpp1
-rw-r--r--src/plugins/qmldesigner/core/model/variantproperty.cpp2
7 files changed, 65 insertions, 2 deletions
diff --git a/src/plugins/qmldesigner/core/model/bindingproperty.cpp b/src/plugins/qmldesigner/core/model/bindingproperty.cpp
index b258bb2cdd..7a73eba08c 100644
--- a/src/plugins/qmldesigner/core/model/bindingproperty.cpp
+++ b/src/plugins/qmldesigner/core/model/bindingproperty.cpp
@@ -58,6 +58,7 @@ BindingProperty::BindingProperty(const QString &propertyName, const Internal::In
void BindingProperty::setExpression(const QString &expression)
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
@@ -161,6 +162,7 @@ AbstractProperty BindingProperty::resolveToProperty() const
void BindingProperty::setDynamicTypeNameAndExpression(const QString &typeName, const QString &expression)
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
diff --git a/src/plugins/qmldesigner/core/model/model.cpp b/src/plugins/qmldesigner/core/model/model.cpp
index 0e8ddb21ea..8c8234403d 100644
--- a/src/plugins/qmldesigner/core/model/model.cpp
+++ b/src/plugins/qmldesigner/core/model/model.cpp
@@ -87,7 +87,8 @@ namespace Internal {
ModelPrivate::ModelPrivate(Model *model) :
m_q(model),
- m_rootInternalNode(createNode("Qt/Rectangle", 4, 6, PropertyListType()))
+ m_rootInternalNode(createNode("Qt/Rectangle", 4, 6, PropertyListType())),
+ m_writeLock(false)
{
}
@@ -884,6 +885,34 @@ QList<InternalNodePointer> ModelPrivate::allNodes() const
return m_nodeSet.toList();
}
+bool ModelPrivate::isWriteLocked() const
+{
+ return m_writeLock;
+}
+
+
+WriteLocker::WriteLocker(ModelPrivate *model)
+ : m_model(model)
+{
+ Q_ASSERT(model);
+ Q_ASSERT(!m_model->m_writeLock);
+ model->m_writeLock = true;
+}
+
+WriteLocker::WriteLocker(Model *model)
+ : m_model(model->m_d)
+{
+ Q_ASSERT(model->m_d);
+ Q_ASSERT(!m_model->m_writeLock);
+ m_model->m_writeLock = true;
+}
+
+WriteLocker::~WriteLocker()
+{
+ Q_ASSERT(m_model->m_writeLock);
+ m_model->m_writeLock = false;
+}
+
//static QString anchorLinePropertyValue(const InternalNode::Pointer &sourceNode, const InternalNode::Pointer &targetNode, const AnchorLine::Type &targetType)
//{
// if (targetNode.isNull() || !targetNode->isValid())
@@ -1029,6 +1058,7 @@ QUrl Model::fileUrl() const
*/
void Model::setFileUrl(const QUrl &url)
{
+ Internal::WriteLocker locker(m_d);
m_d->setFileUrl(url);
}
@@ -1045,6 +1075,7 @@ const MetaInfo Model::metaInfo() const
*/
void Model::setMetaInfo(const MetaInfo &metaInfo)
{
+ Internal::WriteLocker locker(m_d);
m_d->setMetaInfo(metaInfo);
}
@@ -1077,6 +1108,7 @@ The view is informed that it has been registered within the model by a call to A
*/
void Model::attachView(AbstractView *view)
{
+ Internal::WriteLocker locker(m_d);
m_d->attachView(view);
}
@@ -1090,6 +1122,7 @@ void Model::attachView(AbstractView *view)
*/
void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify)
{
+ Internal::WriteLocker locker(m_d);
bool emitNotify = (emitDetachNotify == NotifyView);
m_d->detachView(view, emitNotify);
}
diff --git a/src/plugins/qmldesigner/core/model/model_p.h b/src/plugins/qmldesigner/core/model/model_p.h
index 76b56615e3..4f3dd49add 100644
--- a/src/plugins/qmldesigner/core/model/model_p.h
+++ b/src/plugins/qmldesigner/core/model/model_p.h
@@ -67,12 +67,26 @@ typedef QSharedPointer<InternalNodeAbstractProperty> InternalNodeAbstractPropert
typedef QSharedPointer<InternalNodeListProperty> InternalNodeListPropertyPointer;
typedef QPair<InternalNodePointer, QString> PropertyPair;
-class ModelPrivate : QObject {
+
+class ModelPrivate;
+
+class WriteLocker
+{
+public:
+ ~WriteLocker();
+ WriteLocker(ModelPrivate *model);
+ WriteLocker(Model *model);
+private: // variables
+ QWeakPointer<ModelPrivate> m_model;
+};
+
+class ModelPrivate : public QObject {
Q_OBJECT
Q_DISABLE_COPY(ModelPrivate)
friend class QmlDesigner::Model;
+ friend class QmlDesigner::Internal::WriteLocker;
public:
ModelPrivate(Model *model);
@@ -168,6 +182,10 @@ public:
QList<InternalNodePointer> allNodes() const;
+ bool isWriteLocked() const;
+
+ WriteLocker createWriteLocker() const;
+
private: //functions
void removePropertyWithoutNotification(const InternalPropertyPointer &property);
void removeAllSubNodes(const InternalNodePointer &node);
@@ -190,6 +208,8 @@ private:
QUrl m_fileUrl;
QWeakPointer<Model> m_masterModel;
+
+ bool m_writeLock;
};
}
diff --git a/src/plugins/qmldesigner/core/model/modelnode.cpp b/src/plugins/qmldesigner/core/model/modelnode.cpp
index 6fb91ea9b9..30b290a4ad 100644
--- a/src/plugins/qmldesigner/core/model/modelnode.cpp
+++ b/src/plugins/qmldesigner/core/model/modelnode.cpp
@@ -174,6 +174,7 @@ bool ModelNode::isValidId(const QString &id)
void ModelNode::setId(const QString& id)
{
+ //Internal::WriteLocker locker(m_model.data());
if (!isValid()) {
Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid");
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
@@ -207,6 +208,7 @@ QString ModelNode::type() const
*/
void ModelNode::changeType(const QString &type, int majorVersion, int minorVersion)
{
+ //Internal::WriteLocker locker(m_model.data());
if (!isValid()) {
Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid");
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
@@ -581,6 +583,7 @@ void ModelNode::removeProperty(const QString &name)
*/
ModelNode ModelNode::addChildNode(const QString &nodeTypeString, int majorVersion, int minorVersion, const QString &propertyName, const PropertyListType &propertyList)
{
+ Internal::WriteLocker locker(m_model.data());
if (!isValid()) {
Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid");
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
@@ -928,6 +931,7 @@ QVariant ModelNode::auxiliaryData(const QString &name) const
void ModelNode::setAuxiliaryData(const QString &name, const QVariant &data)
{
+ Internal::WriteLocker locker(m_model.data());
m_model.data()->m_d->setAuxiliaryData(internalNode(), name, data);
}
diff --git a/src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp
index 69c9fd6429..4f2408bf6c 100644
--- a/src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp
+++ b/src/plugins/qmldesigner/core/model/nodeabstractproperty.cpp
@@ -68,6 +68,7 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode)
void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNodeList)
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
diff --git a/src/plugins/qmldesigner/core/model/nodelistproperty.cpp b/src/plugins/qmldesigner/core/model/nodelistproperty.cpp
index 53bc1dc2f3..a8dca7ee16 100644
--- a/src/plugins/qmldesigner/core/model/nodelistproperty.cpp
+++ b/src/plugins/qmldesigner/core/model/nodelistproperty.cpp
@@ -101,6 +101,7 @@ const QList<QmlObjectNode> NodeListProperty::toQmlObjectNodeList() const
void NodeListProperty::slide(int from, int to) const
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, "<invalid node list property>");
if (to > toModelNodeList().count() - 1)
diff --git a/src/plugins/qmldesigner/core/model/variantproperty.cpp b/src/plugins/qmldesigner/core/model/variantproperty.cpp
index 051b6fddf7..e91a1f4025 100644
--- a/src/plugins/qmldesigner/core/model/variantproperty.cpp
+++ b/src/plugins/qmldesigner/core/model/variantproperty.cpp
@@ -57,6 +57,7 @@ VariantProperty::VariantProperty(const QString &propertyName, const Internal::In
void VariantProperty::setValue(const QVariant &value)
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
@@ -96,6 +97,7 @@ VariantProperty& VariantProperty::operator= (const QVariant &value)
void VariantProperty::setDynamicTypeNameAndValue(const QString &type, const QVariant &value)
{
+ //Internal::WriteLocker locker(model());
if (!isValid())
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);