aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2020-05-05 12:57:46 +0200
committerTim Jenssen <tim.jenssen@qt.io>2020-05-05 13:41:02 +0000
commit8d9d1d983e52d59e2139d2234acd587805256c9f (patch)
tree8be1261cb2d8078503c2f805e6bce77a21c9231f /src/plugins/qmldesigner
parentfab5e7290a8b92619d6067b4d259f41d9df9b537 (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')
-rw-r--r--src/plugins/qmldesigner/components/componentcore/componentcore_constants.h6
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp25
-rw-r--r--src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp82
-rw-r--r--src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h1
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