diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-05-05 12:57:46 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2020-05-05 13:41:02 +0000 |
commit | 8d9d1d983e52d59e2139d2234acd587805256c9f (patch) | |
tree | 8be1261cb2d8078503c2f805e6bce77a21c9231f /src/plugins/qmldesigner | |
parent | fab5e7290a8b92619d6067b4d259f41d9df9b537 (diff) |
QmlDesigner: Allow simple grouping of items
We already have the GroupItem.
This patch allows to automatically group items in a GroupItem.
The option is not visible if studio components are missing.
Task-number: QDS-1254
Change-Id: I64da7ec574426c9275fd29e131a1b1d761bf4299
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner')
4 files changed, 114 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index c0f7af85c2..aff4b3fc25 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -39,6 +39,7 @@ const char qmlPreviewCategory[] = "QmlPreview"; const char editCategory[] = "Edit"; const char anchorsCategory[] = "Anchors"; const char positionCategory[] = "Position"; +const char groupCategory[] = "Group"; const char layoutCategory[] = "Layout"; const char flowCategory[] = "Flow"; const char flowEffectCategory[] = "FlowEffect"; @@ -78,6 +79,7 @@ const char addTabBarToStackedContainerCommandId[] = "AddTabBarToStackedContainer const char increaseIndexOfStackedContainerCommandId[] = "IncreaseIndexOfStackedContainer"; const char decreaseIndexOfStackedContainerCommandId[] = "DecreaseIndexOfStackedContainer"; const char flowAssignEffectCommandId[] = "AssignFlowEffect"; +const char addToGroupItemCommandId[] = "AddToGroupItem"; const char selectionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Selection"); const char flowConnectionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Connect"); @@ -85,6 +87,7 @@ const char stackCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMen const char editCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit"); const char anchorsCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Anchors"); const char positionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Position"); +const char groupCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Group"); const char layoutCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout"); const char flowCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Flow"); const char flowEffectCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Flow Effects"); @@ -130,6 +133,8 @@ const char createFlowActionAreaDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerCon const char setFlowStartDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Set Flow Start"); const char removeLayoutDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Remove Layout"); +const char addToGroupItemDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Group in GroupItem"); + const char addItemToStackedContainerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add Item"); const char addTabBarToStackedContainerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add Tab Bar"); const char increaseIndexToStackedContainerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Increase Index"); @@ -169,6 +174,7 @@ const int priorityStackCategory = 180; const int priorityEditCategory = 160; const int priorityAnchorsCategory = 140; const int priorityFlowCategory = 240; +const int priorityGroupCategory = 140; const int priorityPositionCategory = 130; const int priorityLayoutCategory = 120; const int priorityStackedContainerCategory = priorityLayoutCategory; diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 95b11c15af..5e7badef6f 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -648,6 +648,12 @@ bool positionOptionVisible(const SelectionContext &context) || isPositioner(context); } +bool studioComponentsAvailable(const SelectionContext &context) +{ + const Import import = Import::createLibraryImport("QtQuick.Studio.Components", "1.0"); + return context.view()->model()->isImportPossible(import, true, true); +} + bool singleSelectedAndUiFile(const SelectionContext &context) { if (!singleSelection(context)) @@ -860,6 +866,13 @@ void DesignerActionManager::createDefaultDesignerActions() &layoutOptionVisible)); addDesignerAction(new ActionGroup( + groupCategoryDisplayName, + groupCategory, + priorityGroupCategory, + &positionOptionVisible, + &studioComponentsAvailable)); + + addDesignerAction(new ActionGroup( flowCategoryDisplayName, flowCategory, priorityFlowCategory, @@ -994,6 +1007,18 @@ void DesignerActionManager::createDefaultDesignerActions() &isLayout, &isLayout)); + addDesignerAction(new ModelNodeContextMenuAction( + addToGroupItemCommandId, + addToGroupItemDisplayName, + {}, + groupCategory, + QKeySequence(), + 110, + &addToGroupItem, + &selectionCanBeLayouted, + &selectionCanBeLayouted)); + + addDesignerAction(new ModelNodeFormEditorAction( addItemToStackedContainerCommandId, addItemToStackedContainerDisplayName, diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 8cd5fd987e..35cc0e8ab1 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1119,6 +1119,88 @@ void setFlowStartItem(const SelectionContext &selectionContext) }); } + +bool static hasStudioComponentsImport(const SelectionContext &context) +{ + if (context.view() && context.view()->model()) { + Import import = Import::createLibraryImport("QtQuick.Studio.Components", "1.0"); + return context.view()->model()->hasImport(import, true, true); + } + + return false; +} + +static inline void setAdjustedPos(const QmlDesigner::ModelNode &modelNode) +{ + if (modelNode.hasParentProperty()) { + ModelNode parentNode = modelNode.parentProperty().parentModelNode(); + + const QPointF instancePos = QmlItemNode(modelNode).instancePosition(); + const int x = instancePos.x() - parentNode.variantProperty("x").value().toInt(); + const int y = instancePos.y() - parentNode.variantProperty("y").value().toInt(); + + modelNode.variantProperty("x").setValue(x); + modelNode.variantProperty("y").setValue(y); + } +} + +void reparentToNodeAndAdjustPosition(const ModelNode &parentModelNode, + const QList<ModelNode> &modelNodeList) +{ + for (ModelNode modelNode : modelNodeList) { + reparentTo(modelNode, parentModelNode); + setAdjustedPos(modelNode); + + for (const VariantProperty &variantProperty : modelNode.variantProperties()) { + if (variantProperty.name().contains("anchors.")) + modelNode.removeProperty(variantProperty.name()); + } + for (const BindingProperty &bindingProperty : modelNode.bindingProperties()) { + if (bindingProperty.name().contains("anchors.")) + modelNode.removeProperty(bindingProperty.name()); + } + } +} + +void addToGroupItem(const SelectionContext &selectionContext) +{ + const TypeName typeName = "QtQuick.Studio.Components.GroupItem"; + + try { + if (!hasStudioComponentsImport(selectionContext)) { + Import studioImport = Import::createLibraryImport("QtQuick.Studio.Components", "1.0"); + selectionContext.view()-> model()->changeImports({studioImport}, {}); + } + + if (!selectionContext.view()) + return; + + if (QmlItemNode::isValidQmlItemNode(selectionContext.firstSelectedModelNode())) { + const QmlItemNode qmlItemNode = QmlItemNode(selectionContext.firstSelectedModelNode()); + + if (qmlItemNode.hasInstanceParentItem()) { + ModelNode groupNode; + selectionContext.view()->executeInTransaction("DesignerActionManager|addToGroupItem1",[=, &groupNode](){ + + QmlItemNode parentNode = qmlItemNode.instanceParentItem(); + NodeMetaInfo metaInfo = selectionContext.view()->model()->metaInfo(typeName); + groupNode = selectionContext.view()->createModelNode(typeName, metaInfo.majorVersion(), metaInfo.minorVersion()); + reparentTo(groupNode, parentNode); + }); + selectionContext.view()->executeInTransaction("DesignerActionManager|addToGroupItem2",[=](){ + + QList<ModelNode> selectedNodes = selectionContext.selectedModelNodes(); + setUpperLeftPostionToNode(groupNode, selectedNodes); + + reparentToNodeAndAdjustPosition(groupNode, selectedNodes); + }); + } + } + } catch (RewritingException &e) { + e.showException(); + } +} + } // namespace Mode } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 57fd0ea12a..ea0b87e198 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -78,6 +78,7 @@ void createFlowActionArea(const SelectionContext &selectionContext); void addTransition(const SelectionContext &selectionState); void addFlowEffect(const SelectionContext &selectionState, const TypeName &typeName); void setFlowStartItem(const SelectionContext &selectionContext); +void addToGroupItem(const SelectionContext &selectionContext); } // namespace ModelNodeOperationso } //QmlDesigner |