diff --git a/src/plugins/qmldesigner/components/componentcore/abstractactiongroup.cpp b/src/plugins/qmldesigner/components/componentcore/abstractactiongroup.cpp
index 2f96aee99b5..c946c34e925 100644
--- a/src/plugins/qmldesigner/components/componentcore/abstractactiongroup.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/abstractactiongroup.cpp
@@ -39,7 +39,7 @@ AbstractActionGroup::AbstractActionGroup(const QString &displayName) :
ActionInterface::Type AbstractActionGroup::type() const
{
- return ActionInterface::Menu;
+ return ActionInterface::ContextMenu;
}
QAction *AbstractActionGroup::action() const
diff --git a/src/plugins/qmldesigner/components/componentcore/actioninterface.h b/src/plugins/qmldesigner/components/componentcore/actioninterface.h
index d3d23ca43a0..668438218ac 100644
--- a/src/plugins/qmldesigner/components/componentcore/actioninterface.h
+++ b/src/plugins/qmldesigner/components/componentcore/actioninterface.h
@@ -38,7 +38,8 @@ class QMLDESIGNERCORE_EXPORT ActionInterface
{
public:
enum Type {
- Menu,
+ ContextMenu,
+ ContextMenuAction,
Action
};
diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore.pri b/src/plugins/qmldesigner/components/componentcore/componentcore.pri
index ac29fb61e03..5372ef7d36b 100644
--- a/src/plugins/qmldesigner/components/componentcore/componentcore.pri
+++ b/src/plugins/qmldesigner/components/componentcore/componentcore.pri
@@ -35,3 +35,6 @@ HEADERS += qmldesignericonprovider.h
FORMS += \
$$PWD/addsignalhandlerdialog.ui
+RESOURCES += \
+ $$PWD/componentcore.qrc
+
diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore.qrc b/src/plugins/qmldesigner/components/componentcore/componentcore.qrc
new file mode 100644
index 00000000000..c2e0eab905c
--- /dev/null
+++ b/src/plugins/qmldesigner/components/componentcore/componentcore.qrc
@@ -0,0 +1,13 @@
+
+
+ images/cancel.png
+ images/column.png
+ images/fill.png
+ images/grid.png
+ images/lower.png
+ images/move.png
+ images/raise.png
+ images/row.png
+ images/size.png
+
+
diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h
index cac7462d75f..484a6bb1e83 100644
--- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h
+++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h
@@ -40,6 +40,32 @@ const char anchorsCategory[] = "Anchors";
const char positionCategory[] = "Position";
const char layoutCategory[] = "Layout";
+const char toFrontCommandId[] = "ToFront";
+const char toBackCommandId[] = "ToBack";
+const char raiseCommandId[] = "Raise";
+const char lowerCommandId[] = "Lower";
+const char resetZCommandId[] = "ResetZ";
+const char resetSizeCommandId[] = "ResetSize";
+const char resetPositionCommandId[] = "ResetPosition";
+const char visiblityCommandId[] = "ToggleVisiblity";
+const char anchorsFillCommandId[] = "AnchorsFill";
+const char anchorsResetCommandId[] = "AnchorsReset";
+const char removePositionerCommandId[] = "RemovePositioner";
+const char layoutRowPositionerCommandId[] = "LayoutRowPositioner";
+const char layoutColumnPositionerCommandId[] = "LayoutColumnPositioner";
+const char layoutGridPositionerCommandId[] = "LayoutGridPositioner";
+const char layoutFlowPositionerCommandId[] = "LayoutFlowPositioner";
+const char removeLayoutCommandId[] = "RemoveLayout";
+const char layoutRowLayoutCommandId[] = "LayoutRowLayout";
+const char layoutColumnLayoutCommandId[] = "LayoutColumnLayout";
+const char layoutGridLayoutCommandId[] = "LayoutGridLayout";
+const char layoutFillWidthCommandId[] = "LayoutFillWidth";
+const char layoutFillHeightCommandId[] = "LayoutFillHeight";
+const char goIntoComponentCommandId[] = "GoIntoComponent";
+const char goToImplementationCommandId[] = "GoToImplementation";
+const char addSignalHandlerCommandId[] = "AddSignalHandler";
+const char moveToComponentCommandId[] = "MoveToComponent";
+
const char selectionCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Selection");
const char stackCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Stack (z)");
const char editCategoryDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit");
@@ -73,7 +99,7 @@ const char resetPositionDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMen
const char goIntoComponentDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Go into Component");
const char goToImplementationDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Go to Implementation");
const char addSignalHandlerDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add New Signal Handler");
-const char moveToComponentDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Move to Component");
+const char moveToComponentDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Move to Component into separate file");
const char setIdDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Set Id");
@@ -96,6 +122,19 @@ const char layoutGridLayoutDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContext
const char layoutFillWidthDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill Width");
const char layoutFillHeightDisplayName[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill Height");
+const char raiseToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Raise selected item.");
+const char lowerToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Lower selected item.");
+
+const char resetSizeToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset size and use implcit size.");
+const char resetPositionTooltip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset position and use implicit position.");
+
+const char anchorsFillToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill selected item to parent. ");
+const char anchorsResetToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset achors for selected item.");
+
+const char layoutColumnLayoutToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout selected items in ColumnLayout.");
+const char layoutRowLayoutToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout selected items in RowLayout.");
+const char layoutGridLayoutToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout selected items in GridLayout.");
+
const int priorityFirst = 220;
const int prioritySelectionCategory = 200;
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
index ea79b5c62e8..76099e5b8e0 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
@@ -28,10 +28,17 @@
#include
#include
#include "designeractionmanagerview.h"
+#include "qmldesignerconstants.h"
#include
#include
+#include
+
+#include
+#include
+#include
+
namespace QmlDesigner {
static inline QString captionForModelNode(const ModelNode &modelNode)
@@ -47,20 +54,89 @@ static inline bool contains(const QmlItemNode &node, const QPointF &position)
return node.isValid() && node.instanceSceneTransform().mapRect(node.instanceBoundingRect()).contains(position);
}
-AbstractView *DesignerActionManager::view()
+DesignerActionManagerView *DesignerActionManager::view()
{
return m_designerActionManagerView;
}
-class VisiblityModelNodeAction : public ModelNodeAction
+DesignerActionToolBar *DesignerActionManager::createToolBar(QWidget *parent) const
+{
+ DesignerActionToolBar *toolBar = new DesignerActionToolBar(parent);
+
+ QList categories = Utils::filtered(designerActions(),
+ [](ActionInterface *action) { return action->type() == ActionInterface::ContextMenu; });
+
+ Utils::sort(categories, [](ActionInterface *l, ActionInterface *r) {
+ return l->priority() > r->priority();
+ });
+
+ for (auto *categoryAction : categories) {
+ QList actions = Utils::filtered(designerActions(), [categoryAction](ActionInterface *action) {
+ return action->category() == categoryAction->menuId();
+ });
+
+ Utils::sort(actions, [](ActionInterface *l, ActionInterface *r) {
+ return l->priority() > r->priority();
+ });
+
+ bool addSeparator = false;
+ bool lastWasSeparator = false;
+
+ for (auto *action : actions) {
+ if (action->type() == ActionInterface::Action
+ && action->action()
+ && !action->action()->icon().isNull()) {
+ toolBar->registerAction(action);
+ addSeparator = true;
+ lastWasSeparator = false;
+ } else if (addSeparator && action->action()->isSeparator()) {
+ toolBar->registerAction(action);
+ lastWasSeparator = true;
+ }
+ }
+
+ if (addSeparator && !lastWasSeparator) {
+ toolBar->addSeparator();
+ }
+ }
+
+ return toolBar;
+}
+
+void DesignerActionManager::polishActions() const
+{
+ QList actions = Utils::filtered(designerActions(),
+ [](ActionInterface *action) { return action->type() != ActionInterface::ContextMenu; });
+
+ Core::Context qmlDesignerFormEditorContext(Constants::C_QMLFORMEDITOR);
+
+ for (auto *action : actions) {
+ if (!action->menuId().isEmpty()) {
+ const QString id =
+ QString("QmlDesigner.FormEditor.%1.%2").arg(QString::fromLatin1(action->category())).arg(QString::fromLatin1(action->menuId()));
+
+ Core::Command *cmd = Core::ActionManager::registerAction(action->action(), id.toLatin1().constData(), qmlDesignerFormEditorContext);
+
+ cmd->setDefaultKeySequence(action->action()->shortcut());
+ cmd->setDescription(action->action()->toolTip());
+
+ action->action()->setToolTip(cmd->action()->toolTip());
+ action->action()->setShortcut(cmd->action()->shortcut());
+ action->action()->setShortcutContext(Qt::WidgetShortcut); //Hack to avoid conflicting shortcuts. We use the Core::Command for the shortcut.
+ }
+ }
+}
+
+class VisiblityModelNodeAction : public ModelNodeContextMenuAction
{
public:
- VisiblityModelNodeAction(const QString &description, const QByteArray &category, int priority,
- ModelNodeOperations::SelectionAction action,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
- ModelNodeAction(description, category, priority, action, enabled, visibility)
+ VisiblityModelNodeAction(const QByteArray &id, const QString &description, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation action,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
+ ModelNodeContextMenuAction(id, description, category, key, priority, action, enabled, visibility)
{}
+
virtual void updateContext()
{
defaultAction()->setSelectionContext(selectionContext());
@@ -78,14 +154,14 @@ public:
}
};
-class FillLayoutModelNodeAction : public ModelNodeAction
+class FillLayoutModelNodeAction : public ModelNodeContextMenuAction
{
public:
- FillLayoutModelNodeAction(const QString &description, const QByteArray &category, int priority,
- ModelNodeOperations::SelectionAction action,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
- ModelNodeAction(description, category, priority, action, enabled, visibility)
+ FillLayoutModelNodeAction(const QByteArray &id, const QString &description, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation action,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
+ ModelNodeContextMenuAction(id, description, category, key, priority, action, enabled, visibility)
{}
virtual void updateContext()
{
@@ -115,11 +191,11 @@ protected:
class FillWidthModelNodeAction : public FillLayoutModelNodeAction
{
public:
- FillWidthModelNodeAction(const QString &description, const QByteArray &category, int priority,
- ModelNodeOperations::SelectionAction action,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
- FillLayoutModelNodeAction(description, category, priority, action, enabled, visibility)
+ FillWidthModelNodeAction(const QByteArray &id, const QString &description, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation action,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
+ FillLayoutModelNodeAction(id, description, category, key, priority, action, enabled, visibility)
{
m_propertyName = "Layout.fillWidth";
}
@@ -128,11 +204,11 @@ public:
class FillHeightModelNodeAction : public FillLayoutModelNodeAction
{
public:
- FillHeightModelNodeAction(const QString &description, const QByteArray &category, int priority,
- ModelNodeOperations::SelectionAction action,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
- FillLayoutModelNodeAction(description, category, priority, action, enabled, visibility)
+ FillHeightModelNodeAction(const QByteArray &id, const QString &description, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation action,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
+ FillLayoutModelNodeAction(id, description, category, key, priority, action, enabled, visibility)
{
m_propertyName = "Layout.fillHeight";
}
@@ -380,140 +456,293 @@ void DesignerActionManager::createDefaultDesignerActions()
using namespace ComponentCoreConstants;
using namespace ModelNodeOperations;
- addDesignerAction(new SelectionModelNodeAction(selectionCategoryDisplayName, selectionCategory, prioritySelectionCategory));
+ addDesignerAction(new SelectionModelNodeAction(
+ selectionCategoryDisplayName,
+ selectionCategory,
+ prioritySelectionCategory));
- addDesignerAction(new ActionGroup(stackCategoryDisplayName, stackCategory, priorityStackCategory, &selectionNotEmpty));
- addDesignerAction(new ModelNodeAction
- (toFrontDisplayName, stackCategory, 200, &toFront, &singleSelection));
- addDesignerAction(new ModelNodeAction
- (toBackDisplayName, stackCategory, 180, &toBack, &singleSelection));
- addDesignerAction(new ModelNodeAction
- (raiseDisplayName, stackCategory, 160, &raise, &selectionNotEmpty));
- addDesignerAction(new ModelNodeAction
- (lowerDisplayName, stackCategory, 140, &lower, &selectionNotEmpty));
- addDesignerAction(new SeperatorDesignerAction(stackCategory, 120));
- addDesignerAction(new ModelNodeAction
- (resetZDisplayName, stackCategory, 100, &resetZ, &selectionNotEmptyAndHasZProperty));
+ addDesignerAction(new ActionGroup(
+ stackCategoryDisplayName,
+ stackCategory,
+ priorityStackCategory,
+ &selectionNotEmpty));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ toFrontCommandId,
+ toFrontDisplayName,
+ stackCategory,
+ QKeySequence(),
+ 200,
+ &toFront,
+ &singleSelection));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ toBackCommandId,
+ toBackDisplayName,
+ stackCategory,
+ QKeySequence(),
+ 180,
+ &toBack,
+ &singleSelection));
+
+ addDesignerAction(new ModelNodeAction(
+ raiseCommandId, raiseDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/lower.png").icon(),
+ raiseToolTip,
+ stackCategory,
+ QKeySequence("Ctrl+Up"),
+ 160,
+ &raise,
+ &selectionNotEmpty));
+
+ addDesignerAction(new ModelNodeAction(
+ lowerCommandId,
+ lowerDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/raise.png").icon(),
+ lowerToolTip,
+ stackCategory,
+ QKeySequence("Ctrl+Down"),
+ 140,
+ &lower,
+ &selectionNotEmpty));
+
+ addDesignerAction(new SeperatorDesignerAction(stackCategory, 120));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ resetZCommandId,
+ resetZDisplayName,
+ stackCategory,
+ QKeySequence(),
+ 100,
+ &resetZ,
+ &selectionNotEmptyAndHasZProperty));
addDesignerAction(new ActionGroup(editCategoryDisplayName, editCategory, priorityEditCategory, &selectionNotEmpty));
- addDesignerAction(new ModelNodeAction
- (resetPositionDisplayName, editCategory, 200, &resetPosition, &selectionNotEmptyAndHasXorYProperty));
- addDesignerAction(new ModelNodeAction
- (resetSizeDisplayName, editCategory, 180, &resetSize, &selectionNotEmptyAndHasWidthOrHeightProperty));
- addDesignerAction(new VisiblityModelNodeAction
- (visibilityDisplayName, editCategory, 160, &setVisible, &singleSelectedItem));
- addDesignerAction(new ActionGroup(anchorsCategoryDisplayName, anchorsCategory,
- priorityAnchorsCategory, &singleSelectionAndInBaseState));
- addDesignerAction(new ModelNodeAction
- (anchorsFillDisplayName, anchorsCategory, 200, &anchorsFill, &singleSelectionItemIsNotAnchoredAndSingleSelectionNotRoot));
- addDesignerAction(new ModelNodeAction
- (anchorsResetDisplayName, anchorsCategory, 180, &anchorsReset, &singleSelectionItemIsAnchored));
+ addDesignerAction(new SeperatorDesignerAction(editCategory, 220));
- addDesignerAction(new ActionGroup(positionCategoryDisplayName, positionCategory,
- priorityPositionCategory, &positionOptionVisible));
- addDesignerAction(new ActionGroup(layoutCategoryDisplayName, layoutCategory,
- priorityLayoutCategory, &layoutOptionVisible));
+ addDesignerAction(new ModelNodeAction(
+ resetPositionCommandId,
+ resetPositionDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/move.png").icon(),
+ resetPositionTooltip, editCategory, QKeySequence("Ctrl+d"),
+ 200,
+ &resetPosition,
+ &selectionNotEmptyAndHasXorYProperty));
- addDesignerAction(new ModelNodeAction
- (removePositionerDisplayName,
- positionCategory,
- 210,
- &removePositioner,
- &isPositioner,
- &isPositioner));
+ addDesignerAction(new ModelNodeAction(
+ resetSizeCommandId,
+ resetSizeDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/size.png").icon(),
+ resetSizeToolTip,
+ editCategory,
+ QKeySequence("Ctrl+f"),
+ 180,
+ &resetSize,
+ &selectionNotEmptyAndHasWidthOrHeightProperty));
- addDesignerAction(new ModelNodeAction
- (layoutRowPositionerDisplayName,
- positionCategory,
- 200,
- &layoutRowPositioner,
- &selectionCanBeLayouted,
- &selectionCanBeLayouted));
+ addDesignerAction(new VisiblityModelNodeAction(
+ visiblityCommandId,
+ visibilityDisplayName,
+ editCategory,
+ QKeySequence("Ctrl+g"),
+ 160,
+ &setVisible,
+ &singleSelectedItem));
- addDesignerAction(new ModelNodeAction
- (layoutColumnPositionerDisplayName,
- positionCategory,
- 180,
- &layoutColumnPositioner,
- &selectionCanBeLayouted,
- &selectionCanBeLayouted));
+ addDesignerAction(new ActionGroup(
+ anchorsCategoryDisplayName,
+ anchorsCategory,
+ priorityAnchorsCategory,
+ &singleSelectionAndInBaseState));
- addDesignerAction(new ModelNodeAction
- (layoutGridPositionerDisplayName,
- positionCategory,
- 160,
- &layoutGridPositioner,
- &selectionCanBeLayouted,
- &selectionCanBeLayouted));
+ addDesignerAction(new ModelNodeAction(
+ anchorsFillCommandId,
+ anchorsFillDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/fill.png").icon(),
+ anchorsFillToolTip,
+ anchorsCategory,
+ QKeySequence(QKeySequence("Ctrl+f")),
+ 200,
+ &anchorsFill,
+ &singleSelectionItemIsNotAnchoredAndSingleSelectionNotRoot));
- addDesignerAction(new ModelNodeAction
- (layoutFlowPositionerDisplayName,
- positionCategory,
- 140,
- &layoutFlowPositioner,
- &selectionCanBeLayouted,
- &selectionCanBeLayouted));
+ addDesignerAction(new ModelNodeAction(
+ anchorsResetCommandId,
+ anchorsResetDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/fill.png").icon(),
+ anchorsResetToolTip,
+ anchorsCategory,
+ QKeySequence(QKeySequence("Ctrl+Shift+f")),
+ 180,
+ &anchorsReset,
+ &singleSelectionItemIsAnchored));
- addDesignerAction(new SeperatorDesignerAction(layoutCategory, 120));
+ addDesignerAction(new ActionGroup(
+ positionCategoryDisplayName,
+ positionCategory,
+ priorityPositionCategory,
+ &positionOptionVisible));
- addDesignerAction(new ModelNodeAction
- (removeLayoutDisplayName,
- layoutCategory,
- 110,
- &removeLayout,
- &isLayout,
- &isLayout));
+ addDesignerAction(new ActionGroup(
+ layoutCategoryDisplayName,
+ layoutCategory,
+ priorityLayoutCategory,
+ &layoutOptionVisible));
- addDesignerAction(new ModelNodeAction
- (layoutRowLayoutDisplayName,
- layoutCategory,
- 100,
- &layoutRowLayout,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+ addDesignerAction(new ModelNodeContextMenuAction(
+ removePositionerCommandId,
+ removePositionerDisplayName,
+ positionCategory,
+ QKeySequence("Ctrl+Shift+p"),
+ 210,
+ &removePositioner,
+ &isPositioner,
+ &isPositioner));
- addDesignerAction(new ModelNodeAction
- (layoutColumnLayoutDisplayName,
- layoutCategory,
- 80,
- &layoutColumnLayout,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+ addDesignerAction(new ModelNodeContextMenuAction(
+ layoutRowPositionerCommandId,
+ layoutRowPositionerDisplayName,
+ positionCategory,
+ QKeySequence(),
+ 200,
+ &layoutRowPositioner,
+ &selectionCanBeLayouted,
+ &selectionCanBeLayouted));
- addDesignerAction(new ModelNodeAction
- (layoutGridLayoutDisplayName,
- layoutCategory,
- 60,
- &layoutGridLayout,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible,
- &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+ addDesignerAction(new ModelNodeContextMenuAction(
+ layoutColumnPositionerCommandId,
+ layoutColumnPositionerDisplayName,
+ positionCategory,
+ QKeySequence(),
+ 180,
+ &layoutColumnPositioner,
+ &selectionCanBeLayouted,
+ &selectionCanBeLayouted));
- addDesignerAction(new FillWidthModelNodeAction
- (layoutFillWidthDisplayName,
- layoutCategory,
- 40,
- &setFillWidth,
- &singleSelectionAndInQtQuickLayout,
- &singleSelectionAndInQtQuickLayout));
+ addDesignerAction(new ModelNodeContextMenuAction(
+ layoutGridPositionerCommandId,
+ layoutGridPositionerDisplayName,
+ positionCategory,
+ QKeySequence(),
+ 160,
+ &layoutGridPositioner,
+ &selectionCanBeLayouted,
+ &selectionCanBeLayouted));
- addDesignerAction(new FillHeightModelNodeAction
- (layoutFillHeightDisplayName,
- layoutCategory,
- 20,
- &setFillHeight,
- &singleSelectionAndInQtQuickLayout,
- &singleSelectionAndInQtQuickLayout));
+ addDesignerAction(new ModelNodeContextMenuAction(
+ layoutFlowPositionerCommandId,
+ layoutFlowPositionerDisplayName,
+ positionCategory,
+ QKeySequence("Ctrl+m"),
+ 140,
+ &layoutFlowPositioner,
+ &selectionCanBeLayouted,
+ &selectionCanBeLayouted));
+
+ addDesignerAction(new SeperatorDesignerAction(layoutCategory, 120));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ removeLayoutCommandId,
+ removeLayoutDisplayName,
+ layoutCategory,
+ QKeySequence("Ctrl+Shift+u"),
+ 110,
+ &removeLayout,
+ &isLayout,
+ &isLayout));
+
+ addDesignerAction(new ModelNodeAction(
+ layoutRowLayoutCommandId,
+ layoutRowLayoutDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/row.png").icon(),
+ layoutRowLayoutToolTip,
+ layoutCategory,
+ QKeySequence("Ctrl+u"),
+ 100,
+ &layoutRowLayout,
+ &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+
+ addDesignerAction(new ModelNodeAction(
+ layoutColumnLayoutCommandId,
+ layoutColumnLayoutDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/column.png").icon(),
+ layoutColumnLayoutToolTip,
+ layoutCategory,
+ QKeySequence("Ctrl+i"),
+ 80,
+ &layoutColumnLayout,
+ &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+
+ addDesignerAction(new ModelNodeAction(
+ layoutGridLayoutCommandId,
+ layoutGridLayoutDisplayName,
+ Utils::Icon(":/qmldesigner/icon/designeractions/images/grid.png").icon(),
+ layoutGridLayoutToolTip,
+ layoutCategory,
+ QKeySequence("Ctrl+h"),
+ 60,
+ &layoutGridLayout,
+ &selectionCanBeLayoutedAndQtQuickLayoutPossible));
+
+ addDesignerAction(new FillWidthModelNodeAction(
+ layoutFillWidthCommandId,
+ layoutFillWidthDisplayName,
+ layoutCategory,
+ QKeySequence(),
+ 40,
+ &setFillWidth,
+ &singleSelectionAndInQtQuickLayout,
+ &singleSelectionAndInQtQuickLayout));
+
+ addDesignerAction(new FillHeightModelNodeAction(
+ layoutFillHeightCommandId,
+ layoutFillHeightDisplayName,
+ layoutCategory,
+ QKeySequence(),
+ 20,
+ &setFillHeight,
+ &singleSelectionAndInQtQuickLayout,
+ &singleSelectionAndInQtQuickLayout));
addDesignerAction(new SeperatorDesignerAction(rootCategory, priorityTopLevelSeperator));
- addDesignerAction(new ModelNodeAction
- (goIntoComponentDisplayName, rootCategory, priorityGoIntoComponent, &goIntoComponent, &selectionIsComponent));
- addDesignerAction(new ModelNodeAction
- (goToImplementationDisplayName, rootCategory, 42, &goImplementation, &singleSelectedAndUiFile, &singleSelectedAndUiFile));
- addDesignerAction(new ModelNodeAction
- (addSignalHandlerDisplayName, rootCategory, 42, &addNewSignalHandler, &singleSelectedAndUiFile, &singleSelectedAndUiFile));
- addDesignerAction(new ModelNodeAction
- (moveToComponentDisplayName, rootCategory, 44, &moveToComponent, &singleSelection, &singleSelection));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ goIntoComponentCommandId,
+ goIntoComponentDisplayName,
+ rootCategory,
+ QKeySequence(),
+ priorityGoIntoComponent,
+ &goIntoComponentOperation,
+ &selectionIsComponent));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ goToImplementationCommandId,
+ goToImplementationDisplayName,
+ rootCategory,
+ QKeySequence(),
+ 42,
+ &goImplementation,
+ &singleSelectedAndUiFile,
+ &singleSelectedAndUiFile));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ addSignalHandlerCommandId,
+ addSignalHandlerDisplayName,
+ rootCategory, QKeySequence(),
+ 42, &addNewSignalHandler,
+ &singleSelectedAndUiFile,
+ &singleSelectedAndUiFile));
+
+ addDesignerAction(new ModelNodeContextMenuAction(
+ moveToComponentCommandId,
+ moveToComponentDisplayName,
+ rootCategory,
+ QKeySequence(),
+ 44,
+ &moveToComponent,
+ &singleSelection,
+ &singleSelection));
}
void DesignerActionManager::addDesignerAction(ActionInterface *newAction)
@@ -522,6 +751,12 @@ void DesignerActionManager::addDesignerAction(ActionInterface *newAction)
m_designerActionManagerView->setDesignerActionList(designerActions());
}
+void DesignerActionManager::addCreatorCommand(Core::Command *command, const QByteArray &category, int priority,
+ const QIcon &overrideIcon)
+{
+ addDesignerAction(new CommandAction(command, category, priority, overrideIcon));
+}
+
QList DesignerActionManager::designerActions() const
{
QList list;
@@ -541,4 +776,35 @@ DesignerActionManager::~DesignerActionManager()
{
}
+DesignerActionToolBar::DesignerActionToolBar(QWidget *parentWidget) : Utils::StyledBar(parentWidget),
+ m_toolBar(new QToolBar("ActionToolBar", this))
+{
+ m_toolBar->setContentsMargins(0, 0, 0, 0);
+ m_toolBar->setFloatable(true);
+ m_toolBar->setMovable(true);
+ m_toolBar->setOrientation(Qt::Horizontal);
+
+ QHBoxLayout *horizontalLayout = new QHBoxLayout(this);
+
+ horizontalLayout->setMargin(0);
+ horizontalLayout->setSpacing(0);
+
+ horizontalLayout->setMargin(0);
+ horizontalLayout->setSpacing(0);
+
+ horizontalLayout->addWidget(m_toolBar);
+}
+
+void DesignerActionToolBar::registerAction(ActionInterface *action)
+{
+ m_toolBar->addAction(action->action());
+}
+
+void DesignerActionToolBar::addSeparator()
+{
+ QAction *separatorAction = new QAction(m_toolBar);
+ separatorAction->setSeparator(true);
+ m_toolBar->addAction(separatorAction);
+}
+
} //QmlDesigner
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h
index fca668b679a..d0c72b67a52 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h
@@ -27,22 +27,42 @@
#include
#include "actioninterface.h"
-#include "abstractview.h"
+
+#include
+#include
+
+#include
namespace QmlDesigner {
class DesignerActionManagerView;
+class DesignerActionToolBar : public Utils::StyledBar
+{
+public:
+ DesignerActionToolBar(QWidget *parentWidget);
+ void registerAction(ActionInterface *action);
+ void addSeparator();
+
+private:
+ QToolBar *m_toolBar;
+};
+
class QMLDESIGNERCORE_EXPORT DesignerActionManager {
public:
DesignerActionManager(DesignerActionManagerView *designerActionManagerView);
~DesignerActionManager();
void addDesignerAction(ActionInterface *newAction);
+ void addCreatorCommand(Core::Command *command, const QByteArray &category, int priority,
+ const QIcon &overrideIcon = QIcon());
QList designerActions() const;
void createDefaultDesignerActions();
- AbstractView *view();
+ DesignerActionManagerView *view();
+
+ DesignerActionToolBar *createToolBar(QWidget *parent = 0) const;
+ void polishActions() const;
private:
QList > m_designerActions;
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
index 67ba2e7a763..0702508e10d 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp
@@ -99,9 +99,15 @@ void DesignerActionManagerView::currentStateChanged(const ModelNode &)
setupContext();
}
-void DesignerActionManagerView::selectedNodesChanged(const QList &, const QList &)
+void DesignerActionManagerView::selectedNodesChanged(const QList &selectedNodes, const QList &)
{
setupContext();
+
+ /* This breaks encapsulation, but the selection state is a very minor information.
+ * Without this signal the ShortcutManager would have to be refactored completely.
+ * This signal is only used to update the state of the cut/copy/delete actions.
+ */
+ emit selectionChanged(!selectedNodes.isEmpty());
}
void DesignerActionManagerView::nodeOrderChanged(const NodeListProperty &, const ModelNode &, int)
@@ -124,6 +130,18 @@ void DesignerActionManagerView::signalHandlerPropertiesChanged(const QVector &, AbstractView::PropertyChangeFlags propertyChangeFlag)
+{
+ if (propertyChangeFlag == AbstractView::PropertiesAdded)
+ setupContext();
+}
+
+void DesignerActionManagerView::bindingPropertiesChanged(const QList &, AbstractView::PropertyChangeFlags propertyChangeFlag)
+{
+ if (propertyChangeFlag == AbstractView::PropertiesAdded)
+ setupContext();
+}
+
DesignerActionManager &DesignerActionManagerView::designerActionManager()
{
return m_designerActionManager;
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
index b33d65f41ba..3037a4c2510 100644
--- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
+++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.h
@@ -60,11 +60,16 @@ public:
void nodeOrderChanged(const NodeListProperty &, const ModelNode &, int ) override;
void importsChanged(const QList &, const QList &) override;
void signalHandlerPropertiesChanged(const QVector &/*propertyList*/, PropertyChangeFlags /*propertyChange*/) override;
+ void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChangeFlag) override;
+ void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChangeFlag) override;
void setDesignerActionList(const QList &designerActionList);
DesignerActionManager &designerActionManager();
const DesignerActionManager &designerActionManager() const;
+signals:
+ void selectionChanged(bool itemsSelected);
+
protected:
void setupContext();
diff --git a/src/plugins/qmldesigner/components/componentcore/images/cancel.png b/src/plugins/qmldesigner/components/componentcore/images/cancel.png
new file mode 100644
index 00000000000..2ef2ea9b5fb
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/cancel.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/column.png b/src/plugins/qmldesigner/components/componentcore/images/column.png
new file mode 100644
index 00000000000..b43f468db18
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/column.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/fill.png b/src/plugins/qmldesigner/components/componentcore/images/fill.png
new file mode 100644
index 00000000000..fa4a51ecefc
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/fill.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/grid.png b/src/plugins/qmldesigner/components/componentcore/images/grid.png
new file mode 100644
index 00000000000..0297e6c902d
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/grid.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower.png b/src/plugins/qmldesigner/components/componentcore/images/lower.png
new file mode 100644
index 00000000000..c25eb781355
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/lower.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/move.png b/src/plugins/qmldesigner/components/componentcore/images/move.png
new file mode 100644
index 00000000000..5d0297a199b
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/move.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise.png b/src/plugins/qmldesigner/components/componentcore/images/raise.png
new file mode 100644
index 00000000000..2ae3fe6718f
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/raise.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/row.png b/src/plugins/qmldesigner/components/componentcore/images/row.png
new file mode 100644
index 00000000000..508bf5b6ecf
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/row.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/size.png b/src/plugins/qmldesigner/components/componentcore/images/size.png
new file mode 100644
index 00000000000..13329dadc9f
Binary files /dev/null and b/src/plugins/qmldesigner/components/componentcore/images/size.png differ
diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp
index 7e9423c2dfd..4139dd677fe 100644
--- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp
@@ -69,7 +69,7 @@ void populateMenu(QSet &actionInterfaces,
});
foreach (ActionInterface* actionInterface, matchingFactoriesList) {
- if (actionInterface->type() == ActionInterface::Menu) {
+ if (actionInterface->type() == ActionInterface::ContextMenu) {
actionInterface->currentContextChanged(selectionContext);
QMenu *newMenu = actionInterface->action()->menu();
menu->addMenu(newMenu);
@@ -77,9 +77,11 @@ void populateMenu(QSet &actionInterfaces,
//recurse
populateMenu(actionInterfaces, actionInterface->menuId(), newMenu, selectionContext);
- } else if (actionInterface->type() == ActionInterface::Action) {
+ } else if (actionInterface->type() == ActionInterface::ContextMenuAction
+ || actionInterface->type() == ActionInterface::Action) {
QAction* action = actionInterface->action();
actionInterface->currentContextChanged(selectionContext);
+ action->setIconVisibleInMenu(false);
menu->addAction(action);
}
}
diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h
index 233e5c5649c..6d1097b351a 100644
--- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h
+++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h
@@ -30,12 +30,19 @@
#include "abstractactiongroup.h"
#include "qmlitemnode.h"
+#include
+
+#include
+
#include
#include
+#include
+
namespace QmlDesigner {
-typedef bool (*SelectionContextFunction)(const SelectionContext &);
+typedef std::function SelectionContextPredicate;
+typedef std::function SelectionContextOperation;
namespace SelectionContextFunctors {
@@ -96,7 +103,7 @@ class ActionTemplate : public DefaultAction
{
public:
- ActionTemplate(const QString &description, ModelNodeOperations::SelectionAction action)
+ ActionTemplate(const QString &description, SelectionContextOperation action)
: DefaultAction(description), m_action(action)
{ }
@@ -104,17 +111,18 @@ public /*slots*/:
virtual void actionTriggered(bool b)
{
m_selectionContext.setToggled(b);
- return m_action(m_selectionContext);
+ m_action(m_selectionContext);
}
- ModelNodeOperations::SelectionAction m_action;
+
+ SelectionContextOperation m_action;
};
class ActionGroup : public AbstractActionGroup
{
public:
ActionGroup(const QString &displayName, const QByteArray &menuId, int priority,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
AbstractActionGroup(displayName),
m_menuId(menuId),
m_priority(priority),
@@ -128,13 +136,13 @@ public:
QByteArray category() const { return QByteArray(); }
QByteArray menuId() const { return m_menuId; }
int priority() const { return m_priority; }
- Type type() const { return Menu; }
+ Type type() const { return ContextMenu; }
private:
const QByteArray m_menuId;
const int m_priority;
- SelectionContextFunction m_enabled;
- SelectionContextFunction m_visibility;
+ SelectionContextPredicate m_enabled;
+ SelectionContextPredicate m_visibility;
};
class SeperatorDesignerAction : public AbstractAction
@@ -151,41 +159,82 @@ public:
QByteArray category() const { return m_category; }
QByteArray menuId() const { return QByteArray(); }
int priority() const { return m_priority; }
- Type type() const { return Action; }
+ Type type() const { return ContextMenuAction; }
void currentContextChanged(const SelectionContext &) {}
private:
const QByteArray m_category;
const int m_priority;
- SelectionContextFunction m_visibility;
+ SelectionContextPredicate m_visibility;
};
-class ModelNodeAction : public AbstractAction
+class CommandAction : public ActionInterface
{
public:
- ModelNodeAction(const QString &description, const QByteArray &category, int priority,
- ModelNodeOperations::SelectionAction selectionAction,
- SelectionContextFunction enabled = &SelectionContextFunctors::always,
- SelectionContextFunction visibility = &SelectionContextFunctors::always) :
+ CommandAction(Core::Command *command, const QByteArray &category, int priority, const QIcon &overrideIcon) :
+ m_action(overrideIcon.isNull() ? command->action() : Utils::ProxyAction::proxyActionWithIcon(command->action(), overrideIcon)),
+ m_category(category),
+ m_priority(priority)
+ {}
+
+ QAction *action() const override { return m_action; }
+ QByteArray category() const override { return m_category; }
+ QByteArray menuId() const override { return QByteArray(); }
+ int priority() const override { return m_priority; }
+ Type type() const override { return Action; }
+ void currentContextChanged(const SelectionContext &) override {}
+
+private:
+ QAction *m_action;
+ const QByteArray m_category;
+ const int m_priority;
+};
+
+class ModelNodeContextMenuAction : public AbstractAction
+{
+public:
+ ModelNodeContextMenuAction(const QByteArray &id, const QString &description, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation selectionAction,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always,
+ SelectionContextPredicate visibility = &SelectionContextFunctors::always) :
AbstractAction(new ActionTemplate(description, selectionAction)),
+ m_id(id),
m_category(category),
m_priority(priority),
m_enabled(enabled),
m_visibility(visibility)
- {}
+ {
+ action()->setShortcut(key);
+ }
- bool isVisible(const SelectionContext &selectionState) const { return m_visibility(selectionState); }
- bool isEnabled(const SelectionContext &selectionState) const { return m_enabled(selectionState); }
- QByteArray category() const { return m_category; }
- QByteArray menuId() const { return QByteArray(); }
- int priority() const { return m_priority; }
- Type type() const { return Action; }
+ bool isVisible(const SelectionContext &selectionState) const override { return m_visibility(selectionState); }
+ bool isEnabled(const SelectionContext &selectionState) const override { return m_enabled(selectionState); }
+ QByteArray category() const override { return m_category; }
+ QByteArray menuId() const override { return m_id; }
+ int priority() const override { return m_priority; }
+ Type type() const override { return ContextMenuAction; }
private:
+ const QByteArray m_id;
const QByteArray m_category;
const int m_priority;
- const SelectionContextFunction m_enabled;
- const SelectionContextFunction m_visibility;
+ const SelectionContextPredicate m_enabled;
+ const SelectionContextPredicate m_visibility;
+};
+
+class ModelNodeAction : public ModelNodeContextMenuAction
+{
+public:
+ ModelNodeAction(const QByteArray &id, const QString &description, const QIcon &icon, const QString &tooltip, const QByteArray &category, const QKeySequence &key, int priority,
+ SelectionContextOperation selectionAction,
+ SelectionContextPredicate enabled = &SelectionContextFunctors::always) :
+ ModelNodeContextMenuAction(id, description, category, key, priority, selectionAction, enabled, &SelectionContextFunctors::always)
+ {
+ action()->setIcon(icon);
+ action()->setToolTip(tooltip);
+ }
+
+ Type type() const override { return Action; }
};
diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp
index 04cb420a035..6050bf85899 100644
--- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp
@@ -341,7 +341,7 @@ void resetPosition(const SelectionContext &selectionState)
}
}
-void goIntoComponent(const SelectionContext &selectionState)
+void goIntoComponentOperation(const SelectionContext &selectionState)
{
goIntoComponent(selectionState.currentSingleSelectedNode());
}
diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h
index 4c447cef23b..fc7ea105fcc 100644
--- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h
+++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h
@@ -32,8 +32,6 @@ namespace ModelNodeOperations {
void goIntoComponent(const ModelNode &modelNode);
-typedef void (*SelectionAction)(const SelectionContext &);
-
void select(const SelectionContext &selectionState);
void deSelect(const SelectionContext &selectionState);
void cut(const SelectionContext &selectionState);
@@ -51,7 +49,7 @@ void setFillWidth(const SelectionContext &selectionState);
void setFillHeight(const SelectionContext &selectionState);
void resetSize(const SelectionContext &selectionState);
void resetPosition(const SelectionContext &selectionState);
-void goIntoComponent(const SelectionContext &selectionState);
+void goIntoComponentOperation(const SelectionContext &selectionState);
void setId(const SelectionContext &selectionState);
void resetZ(const SelectionContext &selectionState);
void anchorsFill(const SelectionContext &selectionState);
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 42efada60de..e56a695c6e8 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -51,20 +51,9 @@ namespace QmlDesigner {
FormEditorView::FormEditorView(QObject *parent)
: AbstractView(parent),
- m_formEditorWidget(new FormEditorWidget(this)),
- m_scene(new FormEditorScene(m_formEditorWidget.data(), this)),
- m_moveTool(new MoveTool(this)),
- m_selectionTool(new SelectionTool(this)),
- m_resizeTool(new ResizeTool(this)),
- m_dragTool(new DragTool(this)),
- m_currentTool(m_selectionTool.get()),
m_transactionCounter(0)
{
- Internal::FormEditorContext *formEditorContext = new Internal::FormEditorContext(m_formEditorWidget.data());
- Core::ICore::addContextObject(formEditorContext);
- connect(formEditorWidget()->zoomAction(), SIGNAL(zoomLevelChanged(double)), SLOT(updateGraphicsIndicators()));
- connect(formEditorWidget()->showBoundingRectAction(), SIGNAL(toggled(bool)), scene(), SLOT(setShowBoundingRects(bool)));
}
FormEditorScene* FormEditorView::scene() const
@@ -148,6 +137,25 @@ void FormEditorView::hideNodeFromScene(const QmlItemNode &qmlItemNode)
}
}
+void FormEditorView::createFormEditorWidget()
+{
+ m_formEditorWidget = QPointer(new FormEditorWidget(this));
+ m_scene = QPointer(new FormEditorScene(m_formEditorWidget.data(), this));
+
+ m_moveTool.reset(new MoveTool(this));
+ m_selectionTool.reset(new SelectionTool(this));
+ m_resizeTool.reset(new ResizeTool(this));
+ m_dragTool.reset(new DragTool(this));
+
+ m_currentTool = m_selectionTool.get();
+
+ Internal::FormEditorContext *formEditorContext = new Internal::FormEditorContext(m_formEditorWidget.data());
+ Core::ICore::addContextObject(formEditorContext);
+
+ connect(formEditorWidget()->zoomAction(), SIGNAL(zoomLevelChanged(double)), SLOT(updateGraphicsIndicators()));
+ connect(formEditorWidget()->showBoundingRectAction(), SIGNAL(toggled(bool)), scene(), SLOT(setShowBoundingRects(bool)));
+}
+
void FormEditorView::nodeCreated(const ModelNode &node)
{
//If the node has source for components/custom parsers we ignore it.
@@ -246,6 +254,10 @@ void FormEditorView::nodeReparented(const ModelNode &node, const NodeAbstractPro
WidgetInfo FormEditorView::widgetInfo()
{
+
+ if (!m_formEditorWidget)
+ createFormEditorWidget();
+
return createWidgetInfo(m_formEditorWidget.data(), 0, "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor"));
}
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index e98cf772c3e..00b4e637a07 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -123,6 +123,7 @@ private: //functions
void setupFormEditorItemTree(const QmlItemNode &qmlItemNode);
void removeNodeFromScene(const QmlItemNode &qmlItemNode);
void hideNodeFromScene(const QmlItemNode &qmlItemNode);
+ void createFormEditorWidget();
private: //variables
QPointer m_formEditorWidget;
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index c6ab6354410..d4053e5ae53 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -23,11 +23,13 @@
**
****************************************************************************/
+#include "designeractionmanager.h"
#include "formeditorwidget.h"
#include "qmldesignerplugin.h"
#include "designersettings.h"
#include "qmldesignerconstants.h"
#include "qmldesignericons.h"
+#include "viewmanager.h"
#include
#include
@@ -121,8 +123,17 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view)
addAction(m_rootHeightAction.data());
upperActions.append(m_rootHeightAction.data());
+ static const QList icon = {
+ Utils::Icon({{":/baremetal/images/baremetaldevicesmall.png",
+ Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint),
+ Utils::Icon({{":/baremetal/images/baremetaldevice.png",
+ Utils::Theme::IconsBaseColor}})};
+
+
m_toolBox = new ToolBox(this);
fillLayout->addWidget(m_toolBox.data());
+
+
m_toolBox->setLeftSideActions(upperActions);
m_backgroundAction = new BackgroundAction(m_toolActionGroup.data());
diff --git a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp
index 665b7983b7f..7adf0676274 100644
--- a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp
@@ -27,6 +27,7 @@
#include
#include
+#include
#include
#include
diff --git a/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.cpp b/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.cpp
index 43b9230b1e0..eef455ecb8c 100644
--- a/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.cpp
+++ b/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.cpp
@@ -77,7 +77,7 @@ int AddTabDesignerAction::priority() const
ActionInterface::Type AddTabDesignerAction::type() const
{
- return Action;
+ return ContextMenuAction;
}
bool AddTabDesignerAction::isVisible(const SelectionContext &selectionContext) const
diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
index e66549832fd..c0ce8759a39 100644
--- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
@@ -54,6 +54,8 @@ class ViewManagerData
public:
QmlModelState savedState;
Internal::DebugView debugView;
+ DesignerActionManagerView designerActionManagerView;
+ NodeInstanceView nodeInstanceView;
ComponentView componentView;
FormEditorView formEditorView;
TextEditorView textEditorView;
@@ -61,8 +63,6 @@ public:
NavigatorView navigatorView;
PropertyEditorView propertyEditorView;
StatesEditorView statesEditorView;
- NodeInstanceView nodeInstanceView;
- DesignerActionManagerView designerActionManagerView;
QList > additionalViews;
};
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index 6a5c5c8c6a3..39d78ab0223 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -25,6 +25,8 @@
#include "designmodewidget.h"
+#include
+
#include
#include "qmldesignerplugin.h"
#include "crumblebar.h"
@@ -299,7 +301,14 @@ void DesignModeWidget::setup()
QToolBar *toolBar = new QToolBar;
toolBar->addAction(viewManager().componentViewAction());
toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
- m_toolBar->addCenterToolBar(toolBar);
+ DesignerActionToolBar *designerToolBar = QmlDesignerPlugin::instance()->viewManager().designerActionManager().createToolBar(m_toolBar);
+
+ QmlDesignerPlugin::instance()->viewManager().designerActionManager().polishActions();
+ designerToolBar->layout()->addWidget(toolBar);
+
+ m_toolBar->addCenterToolBar(designerToolBar);
+
+ m_toolBar->setMinimumWidth(320);
m_mainSplitter = new MiniSplitter(this);
m_mainSplitter->setObjectName("mainSplitter");
diff --git a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp
index 9c8ecbb40fe..30a6ae78709 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp
@@ -70,7 +70,7 @@ public:
Type type() const
{
- return Action;
+ return ContextMenuAction;
}
protected:
diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp
index 4b73ee59ba6..a30390e345a 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp
@@ -118,7 +118,7 @@ public:
Type type() const
{
- return Action;
+ return ContextMenuAction;
}
protected:
diff --git a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp
index 0de73d0744b..31e57503505 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp
@@ -89,7 +89,7 @@ public:
Type type() const
{
- return Action;
+ return ContextMenuAction;
}
protected:
diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp
index 2798502e2f3..20ae2ab03d2 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp
@@ -71,7 +71,7 @@ public:
Type type() const
{
- return Action;
+ return ContextMenuAction;
}
protected:
diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp
index 0dde203732b..bf44d8ab211 100644
--- a/src/plugins/qmldesigner/shortcutmanager.cpp
+++ b/src/plugins/qmldesigner/shortcutmanager.cpp
@@ -27,6 +27,10 @@
#include "designersettings.h"
+#include
+#include
+#include
+
#include
#include
#include
@@ -39,6 +43,8 @@
#include
#include
+#include
+#include
#include
#include
@@ -47,6 +53,14 @@
#include "qmldesignerplugin.h"
#include "designmodewidget.h"
+#include
+#include
+
+static void updateClipboard(QAction *action)
+{
+ const bool dataInClipboard = !QApplication::clipboard()->text().isEmpty();
+ action->setEnabled(dataInClipboard);
+}
namespace QmlDesigner {
@@ -139,6 +153,8 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
+ Core::Command *command = nullptr;
+
//Save As
Core::ActionManager::registerAction(&m_saveAsAction, Core::Constants::SAVEAS, qmlDesignerMainContext);
connect(&m_saveAsAction, SIGNAL(triggered()), em, SLOT(saveDocumentAs()));
@@ -147,6 +163,8 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
Core::ActionManager::registerAction(&m_closeCurrentEditorAction, Core::Constants::CLOSE, qmlDesignerMainContext);
connect(&m_closeCurrentEditorAction, SIGNAL(triggered()), em, SLOT(slotCloseCurrentEditorOrDocument()));
+ DesignerActionManager &designerActionManager = QmlDesignerPlugin::instance()->viewManager().designerActionManager();
+
//Close All
Core::ActionManager::registerAction(&m_closeAllEditorsAction, Core::Constants::CLOSEALL, qmlDesignerMainContext);
connect(&m_closeAllEditorsAction, SIGNAL(triggered()), em, SLOT(closeAllEditors()));
@@ -156,10 +174,11 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
connect(&m_closeOtherEditorsAction, SIGNAL(triggered()), em, SLOT(closeOtherDocuments()));
// Undo / Redo
- Core::ActionManager::registerAction(&m_undoAction, Core::Constants::UNDO, qmlDesignerMainContext);
- Core::ActionManager::registerAction(&m_redoAction, Core::Constants::REDO, qmlDesignerMainContext);
+ command = Core::ActionManager::registerAction(&m_undoAction, Core::Constants::UNDO, qmlDesignerMainContext);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 310, Utils::Icons::UNDO_TOOLBAR.icon());
+ command = Core::ActionManager::registerAction(&m_redoAction, Core::Constants::REDO, qmlDesignerMainContext);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 300, Utils::Icons::REDO_TOOLBAR.icon());
- Core::Command *command;
//GoIntoComponent
command = Core::ActionManager::registerAction(&m_goIntoComponentAction,
@@ -168,6 +187,8 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
//Edit Menu
+ m_deleteAction.setIcon(QIcon::fromTheme(QLatin1String("edit-cut"), Utils::Icons::EDIT_CLEAR_TOOLBAR.icon()));
+
Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_BACKSPACE, qmlDesignerFormEditorContext);
command = Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_BACKSPACE, qmlDesignerNavigatorContext);
command->setDefaultKeySequence(QKeySequence(Qt::Key_Backspace));
@@ -181,21 +202,25 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
command->setAttribute(Core::Command::CA_Hide); // don't show delete in other modes
if (!Utils::HostOsInfo::isMacHost())
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 280);
Core::ActionManager::registerAction(&m_cutAction, Core::Constants::CUT, qmlDesignerFormEditorContext);
command = Core::ActionManager::registerAction(&m_cutAction, Core::Constants::CUT, qmlDesignerNavigatorContext);
command->setDefaultKeySequence(QKeySequence::Cut);
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 260, Utils::Icons::CUT_TOOLBAR.icon());
Core::ActionManager::registerAction(&m_copyAction, Core::Constants::COPY, qmlDesignerFormEditorContext);
command = Core::ActionManager::registerAction(&m_copyAction, Core::Constants::COPY, qmlDesignerNavigatorContext);
command->setDefaultKeySequence(QKeySequence::Copy);
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 250, Utils::Icons::COPY_TOOLBAR.icon());
Core::ActionManager::registerAction(&m_pasteAction, Core::Constants::PASTE, qmlDesignerFormEditorContext);
command = Core::ActionManager::registerAction(&m_pasteAction, Core::Constants::PASTE, qmlDesignerNavigatorContext);
command->setDefaultKeySequence(QKeySequence::Paste);
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
+ designerActionManager.addCreatorCommand(command, ComponentCoreConstants::editCategory, 240, Utils::Icons::PASTE_TOOLBAR.icon());
Core::ActionManager::registerAction(&m_selectAllAction, Core::Constants::SELECTALL, qmlDesignerFormEditorContext);
command = Core::ActionManager::registerAction(&m_selectAllAction, Core::Constants::SELECTALL, qmlDesignerNavigatorContext);
@@ -225,6 +250,17 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
m_escapeAction.setEnabled(false);
Core::ActionManager::registerAction(&m_hideSidebarsAction, Core::Constants::TOGGLE_SIDEBAR, qmlDesignerMainContext);
+
+ connect(designerActionManager.view(), &DesignerActionManagerView::selectionChanged, this, [this](bool itemsSelected) {
+ m_deleteAction.setEnabled(itemsSelected);
+ m_cutAction.setEnabled(itemsSelected);
+ m_copyAction.setEnabled(itemsSelected);
+ });
+
+ updateClipboard(&m_pasteAction);
+ connect(QApplication::clipboard(), &QClipboard::QClipboard::changed, this, [this]() {
+ updateClipboard(&m_pasteAction);
+ });
}
void ShortCutManager::updateActions(Core::IEditor* currentEditor)