diff options
Diffstat (limited to 'src/plugins/qmldesigner/components/componentcore/formatoperation.cpp')
-rw-r--r-- | src/plugins/qmldesigner/components/componentcore/formatoperation.cpp | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp b/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp index 2bef024556..a09ca32bcd 100644 --- a/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/formatoperation.cpp @@ -14,6 +14,25 @@ namespace QmlDesigner { namespace FormatOperation{ +namespace { +struct StylePropertyStruct +{ + QString id; + QStringList subclasses; + QStringList properties; +}; + +struct StyleProperties +{ + QmlDesigner::PropertyName propertyName; + QVariant value; +}; + +QList<StylePropertyStruct> copyableProperties = {}; +QList<StyleProperties> applyableProperties = {}; +StylePropertyStruct chosenItem = {}; +} // namespace + void readFormatConfiguration(){ if (copyableProperties.isEmpty()){ @@ -69,10 +88,11 @@ bool propertiesCopyable(const SelectionContext &selectionState) ModelNode modelNode = selectionState.currentSingleSelectedNode(); for (StylePropertyStruct copyable : copyableProperties) - for (QString copyableSubclass : copyable.subclasses) - if (modelNode.metaInfo().isSubclassOf(copyableSubclass.toUtf8())) + for (QString copyableSubclass : copyable.subclasses) { + auto base = modelNode.model()->metaInfo(copyableSubclass.toUtf8()); + if (modelNode.metaInfo().isBasedOn(base)) return true; - + } return false; } @@ -87,8 +107,9 @@ bool propertiesApplyable(const SelectionContext &selectionState) const ModelNode firstSelectedNode = selectionState.firstSelectedModelNode(); bool found = false; - for (QString copyableSubclass : chosenItem.subclasses){ - if (firstSelectedNode.metaInfo().isSubclassOf(copyableSubclass.toUtf8())){ + for (QString copyableSubclass : chosenItem.subclasses) { + auto base = firstSelectedNode.model()->metaInfo(copyableSubclass.toUtf8()); + if (firstSelectedNode.metaInfo().isBasedOn(base)) { found = true; break; } @@ -100,11 +121,13 @@ bool propertiesApplyable(const SelectionContext &selectionState) for (const ModelNode &modelNode : selectionState.selectedModelNodes()){ found = false; - for (QString subclass : chosenItem.subclasses) - if (modelNode.metaInfo().isSubclassOf(subclass.toUtf8())){ + for (QString subclass : chosenItem.subclasses) { + auto base = modelNode.model()->metaInfo(subclass.toUtf8()); + if (modelNode.metaInfo().isBasedOn(base)) { found = true; break; } + } if (found) continue; @@ -120,28 +143,29 @@ void copyFormat(const SelectionContext &selectionState) if (!selectionState.view()) return; - selectionState.view()->executeInTransaction("DesignerActionManager|copyFormat",[selectionState](){ - + selectionState.view()->executeInTransaction("DesignerActionManager|copyFormat", [selectionState]() { applyableProperties.clear(); ModelNode node = selectionState.currentSingleSelectedNode(); QStringList propertyList; for (StylePropertyStruct copyable : copyableProperties){ bool found = false; - for (QString copyableSubclass : copyable.subclasses) - if (node.metaInfo().isSubclassOf(copyableSubclass.toUtf8())){ + for (QString copyableSubclass : copyable.subclasses) { + auto base = node.model()->metaInfo(copyableSubclass.toUtf8()); + if (node.metaInfo().isBasedOn(base)) { propertyList = copyable.properties; chosenItem = copyable; found = true; break; } + } if (found) break; - } + } QmlObjectNode qmlObjectNode(node); - for (auto propertyName : propertyList){ + for (auto propertyName : propertyList) { if (qmlObjectNode.propertyAffectedByCurrentState(propertyName.toUtf8())) { StyleProperties property; property.propertyName = propertyName.toUtf8(); @@ -165,12 +189,14 @@ void applyFormat(const SelectionContext &selectionState) for (StylePropertyStruct copyable : copyableProperties){ bool found = false; - for (QString copyableSubclass : copyable.subclasses) - if (node.metaInfo().isSubclassOf(copyableSubclass.toUtf8())){ + for (QString copyableSubclass : copyable.subclasses) { + auto base = node.model()->metaInfo(copyableSubclass.toUtf8()); + if (node.metaInfo().isBasedOn(base)) { propertyList = copyable.properties; found = true; break; } + } if (found) break; } |