QmlDesigner: rotBlock is using it own aux type

rotBlock was using the mechanism to overwrite values but actually it is
only for communication to the puppet. So now there is
NodeInstanceAuxiliary as a generic way. NodeInstance was renamed
NodeInstancePropertyOverwrite to make it clear that it is for
overwriting properties.

Task-number: QDS-7338
Change-Id: Id5ab1f5c4761a184964a347f00d1449ae2d7d77f
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2022-08-09 13:45:50 +02:00
parent 685c3ee4cb
commit ccc8c7c997
11 changed files with 56 additions and 40 deletions

View File

@@ -37,5 +37,11 @@ using PropertyNameList = QList<PropertyName>;
using PropertyNames = std::vector<PropertyName>; using PropertyNames = std::vector<PropertyName>;
using TypeName = QByteArray; using TypeName = QByteArray;
enum class AuxiliaryDataType { None, Temporary, Document, NodeInstance }; enum class AuxiliaryDataType {
None,
Temporary,
Document,
NodeInstancePropertyOverwrite,
NodeInstanceAuxiliary
};
} }

View File

@@ -1009,7 +1009,7 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer
void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer)
{ {
if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::NodeInstance) { if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::NodeInstancePropertyOverwrite) {
if (!auxiliaryContainer.value().isNull()) if (!auxiliaryContainer.value().isNull())
setInstancePropertyVariant(auxiliaryContainer); setInstancePropertyVariant(auxiliaryContainer);
else else

View File

@@ -349,7 +349,8 @@ void Qt5InformationNodeInstanceServer::updateRotationBlocks(
QSet<QQuick3DNode *> unblockedNodes; QSet<QQuick3DNode *> unblockedNodes;
const PropertyName rotBlocked = "rotBlocked"; const PropertyName rotBlocked = "rotBlocked";
for (const auto &container : valueChanges) { for (const auto &container : valueChanges) {
if (container.name() == rotBlocked) { if (container.name() == rotBlocked
&& container.auxiliaryDataType() == AuxiliaryDataType::NodeInstanceAuxiliary) {
ServerNodeInstance instance = instanceForId(container.instanceId()); ServerNodeInstance instance = instanceForId(container.instanceId());
if (instance.isValid()) { if (instance.isValid()) {
auto node = qobject_cast<QQuick3DNode *>(instance.internalObject()); auto node = qobject_cast<QQuick3DNode *>(instance.internalObject());

View File

@@ -250,8 +250,11 @@ QTextStream &operator<<(QTextStream &stream, AuxiliaryDataType type)
case AuxiliaryDataType::None: case AuxiliaryDataType::None:
stream << "None"; stream << "None";
break; break;
case AuxiliaryDataType::NodeInstance: case AuxiliaryDataType::NodeInstancePropertyOverwrite:
stream << "NodeInstance"; stream << "NodeInstancePropertyOverwrite";
break;
case AuxiliaryDataType::NodeInstanceAuxiliary:
stream << "NodeInstanceAuxiliary";
break; break;
case AuxiliaryDataType::Document: case AuxiliaryDataType::Document:
stream << "Permanent"; stream << "Permanent";

View File

@@ -63,7 +63,7 @@
namespace QmlDesigner { namespace QmlDesigner {
namespace { namespace {
constexpr AuxiliaryDataKeyView formeditorZoomProperty{AuxiliaryDataType::NodeInstance, constexpr AuxiliaryDataKeyView formeditorZoomProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite,
"formeditorZoom"}; "formeditorZoom"};
} }

View File

@@ -109,7 +109,7 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
if (is3DRoot) { if (is3DRoot) {
if (auto libIcon = Utils::get_if<ImageCache::LibraryIconAuxiliaryData>(&auxiliaryData)) if (auto libIcon = Utils::get_if<ImageCache::LibraryIconAuxiliaryData>(&auxiliaryData))
rewriterView.rootModelNode().setAuxiliaryData(AuxiliaryDataType::NodeInstance, rewriterView.rootModelNode().setAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite,
"isLibraryIcon", "isLibraryIcon",
libIcon->enable); libIcon->enable);
} }

View File

@@ -60,8 +60,10 @@ public:
inline constexpr AuxiliaryDataKeyDefaultValue customIdProperty{AuxiliaryDataType::Document, inline constexpr AuxiliaryDataKeyDefaultValue customIdProperty{AuxiliaryDataType::Document,
"customId", "customId",
QStringView{}}; QStringView{}};
inline constexpr AuxiliaryDataKeyDefaultValue widthProperty{AuxiliaryDataType::NodeInstance, "width", 4}; inline constexpr AuxiliaryDataKeyDefaultValue widthProperty{
inline constexpr AuxiliaryDataKeyView heightProperty{AuxiliaryDataType::NodeInstance, "height"}; AuxiliaryDataType::NodeInstancePropertyOverwrite, "width", 4};
inline constexpr AuxiliaryDataKeyView heightProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite,
"height"};
inline constexpr AuxiliaryDataKeyDefaultValue breakPointProperty{AuxiliaryDataType::Document, inline constexpr AuxiliaryDataKeyDefaultValue breakPointProperty{AuxiliaryDataType::Document,
"breakPoint", "breakPoint",
50}; 50};
@@ -132,13 +134,16 @@ inline constexpr AuxiliaryDataKeyView transitionDurationProperty{AuxiliaryDataTy
"transitionDuration"}; "transitionDuration"};
inline constexpr AuxiliaryDataKeyView targetProperty{AuxiliaryDataType::Document, "target"}; inline constexpr AuxiliaryDataKeyView targetProperty{AuxiliaryDataType::Document, "target"};
inline constexpr AuxiliaryDataKeyView propertyProperty{AuxiliaryDataType::Document, "property"}; inline constexpr AuxiliaryDataKeyView propertyProperty{AuxiliaryDataType::Document, "property"};
inline constexpr AuxiliaryDataKeyView currentFrameProperty{AuxiliaryDataType::NodeInstance, inline constexpr AuxiliaryDataKeyView currentFrameProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite,
"currentFrame"}; "currentFrame"};
inline constexpr AuxiliaryDataKeyView annotationProperty{AuxiliaryDataType::Document, "annotation"}; inline constexpr AuxiliaryDataKeyView annotationProperty{AuxiliaryDataType::Document, "annotation"};
inline constexpr AuxiliaryDataKeyView globalAnnotationProperty{AuxiliaryDataType::Document, inline constexpr AuxiliaryDataKeyView globalAnnotationProperty{AuxiliaryDataType::Document,
"globalAnnotation"}; "globalAnnotation"};
inline constexpr AuxiliaryDataKeyView globalAnnotationStatus{AuxiliaryDataType::Document, inline constexpr AuxiliaryDataKeyView globalAnnotationStatus{AuxiliaryDataType::Document,
"globalAnnotationStatus"}; "globalAnnotationStatus"};
inline constexpr AuxiliaryDataKeyView rotBlockProperty{AuxiliaryDataType::NodeInstanceAuxiliary,
"rotBlock"};
template<typename Type> template<typename Type>
QVariant getDefaultValueAsQVariant(const Type &key) QVariant getDefaultValueAsQVariant(const Type &key)
{ {

View File

@@ -76,6 +76,7 @@
#include "nanotracecommand.h" #include "nanotracecommand.h"
#include "nanotrace/nanotrace.h" #include "nanotrace/nanotrace.h"
#include <auxiliarydataproperties.h>
#include <designersettings.h> #include <designersettings.h>
#include <metainfo.h> #include <metainfo.h>
#include <model.h> #include <model.h>
@@ -676,7 +677,19 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node,
}; };
break; break;
case AuxiliaryDataType::NodeInstance: case AuxiliaryDataType::NodeInstanceAuxiliary:
if (hasInstanceForModelNode(node)) {
NodeInstance instance = instanceForModelNode(node);
PropertyValueContainer container{instance.instanceId(),
PropertyName{key.name},
value,
TypeName(),
key.type};
m_nodeInstanceServer->changeAuxiliaryValues({{container}});
};
break;
case AuxiliaryDataType::NodeInstancePropertyOverwrite:
if (hasInstanceForModelNode(node)) { if (hasInstanceForModelNode(node)) {
NodeInstance instance = instanceForModelNode(node); NodeInstance instance = instanceForModelNode(node);
if (value.isValid()) { if (value.isValid()) {
@@ -707,18 +720,6 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node,
break; break;
case AuxiliaryDataType::Temporary: case AuxiliaryDataType::Temporary:
if (key.name == "rotBlocked" && hasInstanceForModelNode(node)) {
NodeInstance instance = instanceForModelNode(node);
if (value.isValid()) {
PropertyValueContainer container{instance.instanceId(),
PropertyName{key.name},
value,
TypeName(),
key.type};
m_nodeInstanceServer->changeAuxiliaryValues({{container}});
}
};
if (node.isRootNode()) { if (node.isRootNode()) {
if (key.name == "language") { if (key.name == "language") {
const QString languageAsString = value.toString(); const QString languageAsString = value.toString();
@@ -1037,9 +1038,9 @@ QList<ModelNode> filterNodesForSkipItems(const QList<ModelNode> &nodeList)
namespace { namespace {
bool shouldSendAuxiliary(const AuxiliaryDataKey &key) bool shouldSendAuxiliary(const AuxiliaryDataKey &key)
{ {
return key == invisibleProperty || key == lockedProperty return key.type == AuxiliaryDataType::NodeInstancePropertyOverwrite
|| key.type == AuxiliaryDataType::NodeInstance || key.type == AuxiliaryDataType::NodeInstanceAuxiliary || key == invisibleProperty
|| (key.type == AuxiliaryDataType::Temporary && key.name == "rotBlocked"); || key == lockedProperty;
} }
} // namespace } // namespace
@@ -2237,12 +2238,11 @@ void NodeInstanceView::updateRotationBlocks()
} }
} }
if (!qml3DNodes.isEmpty()) { if (!qml3DNodes.isEmpty()) {
const PropertyName auxDataProp{"rotBlocked"};
for (const auto &node : qAsConst(qml3DNodes)) { for (const auto &node : qAsConst(qml3DNodes)) {
if (rotationKeyframeTargets.contains(node)) if (rotationKeyframeTargets.contains(node))
node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, true); node.setAuxiliaryData(rotBlockProperty, true);
else else
node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, false); node.setAuxiliaryData(rotBlockProperty, false);
} }
} }
} }

View File

@@ -24,15 +24,16 @@
****************************************************************************/ ****************************************************************************/
#include "qml3dnode.h" #include "qml3dnode.h"
#include <metainfo.h> #include "auxiliarydataproperties.h"
#include "qmlchangeset.h"
#include "nodelistproperty.h"
#include "nodehints.h"
#include "variantproperty.h"
#include "bindingproperty.h" #include "bindingproperty.h"
#include "qmlanchors.h"
#include "invalidmodelnodeexception.h" #include "invalidmodelnodeexception.h"
#include "itemlibraryinfo.h" #include "itemlibraryinfo.h"
#include "nodehints.h"
#include "nodelistproperty.h"
#include "qmlanchors.h"
#include "qmlchangeset.h"
#include "variantproperty.h"
#include <metainfo.h>
#include "plaintexteditmodifier.h" #include "plaintexteditmodifier.h"
#include "rewriterview.h" #include "rewriterview.h"
@@ -92,7 +93,7 @@ void Qml3DNode::setBindingProperty(const PropertyName &name, const QString &expr
bool Qml3DNode::isBlocked(const PropertyName &propName) const bool Qml3DNode::isBlocked(const PropertyName &propName) const
{ {
if (modelNode().isValid() && propName.startsWith("eulerRotation")) if (modelNode().isValid() && propName.startsWith("eulerRotation"))
return modelNode().auxiliaryDataWithDefault(AuxiliaryDataType::Temporary, "rotBlocked").toBool(); return modelNode().auxiliaryDataWithDefault(rotBlockProperty).toBool();
return false; return false;
} }

View File

@@ -302,7 +302,7 @@ void QmlTimeline::insertKeyframe(const ModelNode &target, const PropertyName &pr
QTC_ASSERT(timelineFrames.isValid(), return ); QTC_ASSERT(timelineFrames.isValid(), return );
const qreal frame = modelNode().auxiliaryData(currentFrameProperty)->toReal(); const qreal frame = modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal();
const QVariant value = QmlObjectNode(targetNode).instanceValue(propertyName); const QVariant value = QmlObjectNode(targetNode).instanceValue(propertyName);
timelineFrames.setValue(value, frame); timelineFrames.setValue(value, frame);

View File

@@ -93,17 +93,17 @@ static inline QHash<PropertyName, QVariant> getProperties(const ModelNode &node)
static inline void applyProperties(ModelNode &node, const QHash<PropertyName, QVariant> &propertyHash) static inline void applyProperties(ModelNode &node, const QHash<PropertyName, QVariant> &propertyHash)
{ {
const auto auxiliaryData = node.auxiliaryData(AuxiliaryDataType::NodeInstance); const auto auxiliaryData = node.auxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite);
for (const auto &element : auxiliaryData) for (const auto &element : auxiliaryData)
node.removeAuxiliaryData(AuxiliaryDataType::NodeInstance, element.first); node.removeAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite, element.first);
for (auto propertyIterator = propertyHash.cbegin(), end = propertyHash.cend(); for (auto propertyIterator = propertyHash.cbegin(), end = propertyHash.cend();
propertyIterator != end; propertyIterator != end;
++propertyIterator) { ++propertyIterator) {
const PropertyName propertyName = propertyIterator.key(); const PropertyName propertyName = propertyIterator.key();
if (propertyName == "width" || propertyName == "height") { if (propertyName == "width" || propertyName == "height") {
node.setAuxiliaryData(AuxiliaryDataType::NodeInstance, node.setAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite,
propertyIterator.key(), propertyIterator.key(),
propertyIterator.value()); propertyIterator.value());
} }