aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp')
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp211
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);