From 7b2b040f41412c735c67e33d90fdd77cdb7a297f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 25 Oct 2019 15:47:43 +0200 Subject: [PATCH] QmlDesigner: Add transaction option to ValuesChangedCommand This option allows to define transactions for ValuesChangedCommand and ValuesModifiedCommand. Change-Id: Ia603027b5c431f1a1912d8959561f92a19fd0243 Reviewed-by: Miikka Heikkinen --- .../commands/valueschangedcommand.cpp | 35 ++++++++++++++----- .../qmlpuppet/commands/valueschangedcommand.h | 7 ++-- .../container/propertyvaluecontainer.cpp | 7 ++++ .../container/propertyvaluecontainer.h | 1 + 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp index c5468bc999b..1ff3bf3320b 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp @@ -95,7 +95,14 @@ QDataStream &operator<<(QDataStream &out, const ValuesChangedCommand &command) { static const bool dontUseSharedMemory = qEnvironmentVariableIsSet("DESIGNER_DONT_USE_SHARED_MEMORY"); - if (!dontUseSharedMemory && command.valueChanges().count() > 5) { + QVector propertyValueContainer = command.valueChanges(); + + if (command.transactionOption != ValuesChangedCommand::TransactionOption::None) { + PropertyValueContainer optionContainer(command.transactionOption); + propertyValueContainer.append(optionContainer); + } + + if (!dontUseSharedMemory && propertyValueContainer.count() > 5) { static quint32 keyCounter = 0; ++keyCounter; command.m_keyNumber = keyCounter; @@ -103,7 +110,7 @@ QDataStream &operator<<(QDataStream &out, const ValuesChangedCommand &command) QDataStream temporaryOutDataStream(&outDataStreamByteArray, QIODevice::WriteOnly); temporaryOutDataStream.setVersion(QDataStream::Qt_4_8); - temporaryOutDataStream << command.valueChanges(); + temporaryOutDataStream << propertyValueContainer; SharedMemory *sharedMemory = createSharedMemory(keyCounter, outDataStreamByteArray.size()); @@ -118,7 +125,7 @@ QDataStream &operator<<(QDataStream &out, const ValuesChangedCommand &command) } out << qint32(0); - out << command.valueChanges(); + out << propertyValueContainer; return out; } @@ -144,17 +151,29 @@ QDataStream &operator>>(QDataStream &in, ValuesChangedCommand &command) { in >> command.m_keyNumber; - if (command.keyNumber() > 0) { - readSharedMemory(command.keyNumber(), &command.m_valueChangeVector); - } else { - in >> command.m_valueChangeVector; + QVector valueChangeVector; + + if (command.keyNumber() > 0) + readSharedMemory(command.keyNumber(), &valueChangeVector); + else + in >> valueChangeVector; + + // '-option-' is not a valid property name and indicates that we store the transaction option. + if (!valueChangeVector.isEmpty() && valueChangeVector.last().name() == "-option-") { + command.transactionOption = + static_cast(valueChangeVector.last().instanceId()); + valueChangeVector.removeLast(); } + + command.m_valueChangeVector = valueChangeVector; + return in; } bool operator ==(const ValuesChangedCommand &first, const ValuesChangedCommand &second) { - return first.m_valueChangeVector == second.m_valueChangeVector; + return first.m_valueChangeVector == second.m_valueChangeVector + && first.transactionOption == second.transactionOption; } QDebug operator <<(QDebug debug, const ValuesChangedCommand &command) diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h index bf7fe1e43d4..5be50903df2 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h @@ -39,6 +39,7 @@ class ValuesChangedCommand friend bool operator ==(const ValuesChangedCommand &first, const ValuesChangedCommand &second); public: + enum TransactionOption { Start, End, None }; ValuesChangedCommand(); explicit ValuesChangedCommand(const QVector &valueChangeVector); @@ -48,6 +49,7 @@ public: static void removeSharedMemorys(const QVector &keyNumberVector); void sort(); + TransactionOption transactionOption = TransactionOption::None; private: QVector m_valueChangeVector; @@ -69,12 +71,11 @@ QDebug operator <<(QDebug debug, const ValuesChangedCommand &instance); class ValuesModifiedCommand : public ValuesChangedCommand { public: - ValuesModifiedCommand() - {} + ValuesModifiedCommand() = default; + explicit ValuesModifiedCommand(const QVector &valueChangeVector) : ValuesChangedCommand(valueChangeVector) {} - }; } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp index cde5957bf5d..19265df0359 100644 --- a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp @@ -42,6 +42,13 @@ PropertyValueContainer::PropertyValueContainer(qint32 instanceId, const Property { } +PropertyValueContainer::PropertyValueContainer(qint32 option) + : m_instanceId(option), + m_name("-option-") +{ +// '-option-' is not a valid property name and indicates that we store the transaction option. +} + qint32 PropertyValueContainer::instanceId() const { return m_instanceId; diff --git a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h index 3423066bc14..4d30f3fb7e4 100644 --- a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h +++ b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h @@ -43,6 +43,7 @@ class PropertyValueContainer public: PropertyValueContainer(); PropertyValueContainer(qint32 instanceId, const PropertyName &name, const QVariant &value, const TypeName &dynamicTypeName); + PropertyValueContainer(qint32 option); qint32 instanceId() const; PropertyName name() const;