diff options
Diffstat (limited to 'src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp')
-rw-r--r-- | src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp | 211 |
1 files changed, 195 insertions, 16 deletions
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 42f95952db..fb7d4ce202 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -41,10 +41,14 @@ #include <qmldesignerplugin.h> #include <viewmanager.h> +#include <listmodeleditor/listmodeleditordialog.h> +#include <listmodeleditor/listmodeleditormodel.h> + #include <QHBoxLayout> #include <QGraphicsLinearLayout> #include <coreplugin/actionmanager/actionmanager.h> +#include <coreplugin/icore.h> #include <utils/algorithm.h> #include <utils/qtcassert.h> #include <utils/utilsicons.h> @@ -335,6 +339,64 @@ public: } }; +class EditListModelAction final : public ModelNodeContextMenuAction +{ +public: + EditListModelAction() + : ModelNodeContextMenuAction("EditListModel", + ComponentCoreConstants::editListModelDisplayName, + {}, + ComponentCoreConstants::rootCategory, + QKeySequence("Alt+e"), + 1001, + &openDialog, + &isListViewInBaseState, + &isListViewInBaseState) + {} + + static bool isListViewInBaseState(const SelectionContext &selectionState) + { + return selectionState.isInBaseState() && selectionState.singleNodeIsSelected() + && selectionState.currentSingleSelectedNode().metaInfo().isSubclassOf( + "QtQuick.ListView"); + } + + bool isEnabled(const SelectionContext &) const override { return true; } + + static ModelNode listModelNode(const ModelNode &listViewNode) + { + if (listViewNode.hasProperty("model")) { + if (listViewNode.hasBindingProperty("model")) + return listViewNode.bindingProperty("model").resolveToModelNode(); + else if (listViewNode.hasNodeProperty("model")) + return listViewNode.nodeProperty("model").modelNode(); + } + + ModelNode newModel = listViewNode.view()->createModelNode("QtQml.Models.ListModel", 2, 15); + listViewNode.nodeProperty("mode").reparentHere(newModel); + + return newModel; + } + + static void openDialog(const SelectionContext &selectionState) + { + ListModelEditorModel model; + + ModelNode targetNode = selectionState.targetNode(); + if (!targetNode.isValid()) + targetNode = selectionState.currentSingleSelectedNode(); + if (!targetNode.isValid()) + return; + + model.setListModel(listModelNode(targetNode)); + + ListModelEditorDialog dialog{Core::ICore::mainWindow()}; + dialog.setModel(&model); + + dialog.exec(); + } +}; + bool flowOptionVisible(const SelectionContext &context) { return QmlFlowViewNode::isValidQmlFlowViewNode(context.rootNode()); @@ -346,12 +408,28 @@ bool isFlowItem(const SelectionContext &context) && QmlFlowItemNode::isValidQmlFlowItemNode(context.currentSingleSelectedNode()); } +bool isFlowTarget(const SelectionContext &context) +{ + return context.singleNodeIsSelected() + && QmlFlowTargetNode::isFlowEditorTarget(context.currentSingleSelectedNode()); +} + bool isFlowTransitionItem(const SelectionContext &context) { return context.singleNodeIsSelected() && QmlFlowItemNode::isFlowTransition(context.currentSingleSelectedNode()); } +bool isFlowTransitionItemWithEffect(const SelectionContext &context) +{ + if (!isFlowTransitionItem(context)) + return false; + + ModelNode node = context.currentSingleSelectedNode(); + + return node.hasNodeProperty("effect"); +} + bool isFlowActionItemItem(const SelectionContext &context) { const ModelNode selectedNode = context.currentSingleSelectedNode(); @@ -362,9 +440,9 @@ bool isFlowActionItemItem(const SelectionContext &context) || QmlVisualNode::isFlowWildcard(selectedNode)); } -bool isFlowItemOrTransition(const SelectionContext &context) +bool isFlowTargetOrTransition(const SelectionContext &context) { - return isFlowItem(context) || isFlowTransitionItem(context); + return isFlowTarget(context) || isFlowTransitionItem(context); } class FlowActionConnectAction : public ActionGroup @@ -642,6 +720,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)) @@ -799,6 +883,27 @@ void DesignerActionManager::createDefaultDesignerActions() &resetSize, &selectionNotEmptyAndHasWidthOrHeightProperty)); + addDesignerAction(new ModelNodeAction( + fitRootToScreenCommandId, + fitRootToScreenDisplayName, + Utils::Icon({{":/utils/images/fittoview.png", Utils::Theme::IconsBaseColor}}).icon(), + fitRootToScreenToolTip, + genericToolBarCategory, + QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_0), + 182, + &fitRootToScreen)); + + addDesignerAction(new ModelNodeAction( + fitSelectionToScreenCommandId, + fitSelectionToScreenDisplayName, + Utils::Icon({{":/utils/images/fittoview.png", Utils::Theme::IconsBaseColor}}).icon(), + fitSelectionToScreenToolTip, + genericToolBarCategory, + QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_I), + 183, + &fitSelectionToScreen, + &selectionNotEmpty)); + addDesignerAction(new SeperatorDesignerAction(editCategory, 170)); addDesignerAction(new VisiblityModelNodeAction( @@ -853,15 +958,31 @@ void DesignerActionManager::createDefaultDesignerActions() priorityLayoutCategory, &layoutOptionVisible)); - //isFlowTransitionItem + addDesignerAction(new ActionGroup( + groupCategoryDisplayName, + groupCategory, + priorityGroupCategory, + &positionOptionVisible, + &studioComponentsAvailable)); addDesignerAction(new ActionGroup( flowCategoryDisplayName, flowCategory, priorityFlowCategory, - &isFlowItemOrTransition, + &isFlowTargetOrTransition, &flowOptionVisible)); + + auto effectMenu = new ActionGroup( + flowEffectCategoryDisplayName, + flowEffectCategory, + priorityFlowCategory, + &isFlowTransitionItem, + &flowOptionVisible); + + effectMenu->setCategory(flowCategory); + addDesignerAction(effectMenu); + addDesignerAction(new ModelNodeFormEditorAction( createFlowActionAreaCommandId, createFlowActionAreaDisplayName, @@ -874,26 +995,43 @@ void DesignerActionManager::createDefaultDesignerActions() &isFlowItem, &flowOptionVisible)); + addDesignerAction(new ModelNodeContextMenuAction( + setFlowStartCommandId, + setFlowStartDisplayName, + {}, + flowCategory, + priorityFirst, + {}, + &setFlowStartItem, + &isFlowItem, + &flowOptionVisible)); + addDesignerAction(new FlowActionConnectAction( flowConnectionCategoryDisplayName, flowConnectionCategory, priorityFlowCategory)); - const QList<TypeName> types = {"FlowActionArea", - "FlowFadeEffect", - "FlowPushRightEffect", - "FlowPushLeftEffect", - "FlowPushUpEffect", - "FlowSlideDownEffect", - "FlowSlideLeftEffect", - "FlowSlideRightEffect", - "FlowSlideUpEffect", + const QList<TypeName> transitionTypes = {"FlowFadeEffect", + "FlowPushEffect", + "FlowMoveEffect", "None"}; - for (const TypeName &typeName : types) + for (const TypeName &typeName : transitionTypes) addTransitionEffectAction(typeName); + addCustomTransitionEffectAction(); + + addDesignerAction(new ModelNodeContextMenuAction( + selectFlowEffectCommandId, + selectEffectDisplayName, + {}, + flowCategory, + {}, + priorityFlowCategory, + &selectFlowEffect, + &isFlowTransitionItemWithEffect)); + addDesignerAction(new ActionGroup( stackedContainerCategoryDisplayName, stackedContainerCategory, @@ -968,6 +1106,18 @@ void DesignerActionManager::createDefaultDesignerActions() &isLayout, &isLayout)); + addDesignerAction(new ModelNodeContextMenuAction( + addToGroupItemCommandId, + addToGroupItemDisplayName, + {}, + groupCategory, + QKeySequence(), + 110, + &addToGroupItem, + &selectionCanBeLayouted, + &selectionCanBeLayouted)); + + addDesignerAction(new ModelNodeFormEditorAction( addItemToStackedContainerCommandId, addItemToStackedContainerDisplayName, @@ -1113,12 +1263,24 @@ void DesignerActionManager::createDefaultDesignerActions() &singleSelection, &singleSelection)); + addDesignerAction(new ModelNodeContextMenuAction( + mergeTemplateCommandId, + mergeTemplateDisplayName, + {}, + rootCategory, + {}, + 30, + &mergeWithTemplate, + &SelectionContextFunctors::always)); + addDesignerAction(new ActionGroup( "", genericToolBarCategory, priorityGenericToolBar)); addDesignerAction(new ChangeStyleAction()); + + addDesignerAction(new EditListModelAction); } void DesignerActionManager::createDefaultAddResourceHandler() @@ -1175,17 +1337,34 @@ void DesignerActionManager::addTransitionEffectAction(const TypeName &typeName) QByteArray(ComponentCoreConstants::flowAssignEffectCommandId) + typeName, QLatin1String(ComponentCoreConstants::flowAssignEffectDisplayName) + typeName, {}, - ComponentCoreConstants::flowCategory, + ComponentCoreConstants::flowEffectCategory, {}, typeName == "None" ? 100 : 140, [typeName](const SelectionContext &context) { ModelNodeOperations::addFlowEffect(context, typeName); }, - &isFlowTransitionItem)); + &isFlowTransitionItem)); +} + +void DesignerActionManager::addCustomTransitionEffectAction() +{ + addDesignerAction(new ModelNodeContextMenuAction( + QByteArray(ComponentCoreConstants::flowAssignEffectCommandId), + ComponentCoreConstants::flowAssignCustomEffectDisplayName, + {}, + ComponentCoreConstants::flowEffectCategory, + {}, + 80, + &ModelNodeOperations::addCustomFlowEffect, + &isFlowTransitionItem)); } DesignerActionToolBar::DesignerActionToolBar(QWidget *parentWidget) : Utils::StyledBar(parentWidget), m_toolBar(new QToolBar("ActionToolBar", this)) { + QWidget* empty = new QWidget(); + empty->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); + m_toolBar->addWidget(empty); + m_toolBar->setContentsMargins(0, 0, 0, 0); m_toolBar->setFloatable(true); m_toolBar->setMovable(true); |