aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@theqtcompany.com>2015-07-16 13:33:28 +0200
committerThomas Hartmann <Thomas.Hartmann@digia.com>2015-07-17 10:24:56 +0000
commitb927391e5b0a14deeb7e47906639a1c906667bb4 (patch)
tree1ecbe491ef385b1ff85b7c4c8b048d75b9fa43f7
parent31964795d8825f3212f4d13b3b30afe37acf9006 (diff)
QmlDesigner.FormEditor: Change selection behavior
Task-number: QTCREATORBUG-11703 Change-Id: Ief6a7bbbb935b76700e50b60bf234c87a76e7f55 Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
-rw-r--r--src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp61
-rw-r--r--src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h5
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp18
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorwidget.h2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/selectiontool.cpp78
-rw-r--r--src/plugins/qmldesigner/components/formeditor/selectiontool.h3
-rw-r--r--src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp16
-rw-r--r--src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h2
9 files changed, 94 insertions, 93 deletions
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
index 91b6234fe8..dbb32b748e 100644
--- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
@@ -31,6 +31,7 @@
#include "abstractformeditortool.h"
#include "formeditorview.h"
#include "formeditorwidget.h"
+#include "formeditorscene.h"
#include <modelnodecontextmenu.h>
@@ -169,26 +170,22 @@ FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList<QGr
return 0;
}
-FormEditorItem* AbstractFormEditorTool::topFormEditorItem(const QList<QGraphicsItem*> & itemList)
+FormEditorItem* AbstractFormEditorTool::nearestFormEditorItem(const QPointF &point, const QList<QGraphicsItem*> & itemList)
{
+ FormEditorItem* nearestItem = 0;
foreach (QGraphicsItem *item, itemList) {
FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
- if (formEditorItem && !formEditorItem->qmlItemNode().isRootNode())
- return formEditorItem;
- }
- return 0;
-}
+ if (!formEditorItem || !formEditorItem->qmlItemNode().isValid())
+ continue;
-FormEditorItem* AbstractFormEditorTool::topFormEditorItemWithRootItem(const QList<QGraphicsItem*> & itemList)
-{
- foreach (QGraphicsItem *item, itemList) {
- FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
- if (formEditorItem)
- return formEditorItem;
+ if (!nearestItem)
+ nearestItem = formEditorItem;
+ else if (formEditorItem->selectionWeigth(point, 1) < nearestItem->selectionWeigth(point, 0))
+ nearestItem = formEditorItem;
}
- return 0;
+ return nearestItem;
}
QList<FormEditorItem *> AbstractFormEditorTool::filterSelectedModelNodes(const QList<FormEditorItem *> &itemList) const
@@ -225,9 +222,43 @@ void AbstractFormEditorTool::mousePressEvent(const QList<QGraphicsItem*> & /*ite
event->accept();
}
-void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & /*itemList*/, QGraphicsSceneMouseEvent *event)
+static bool containsItemNode(const QList<QGraphicsItem*> & itemList, const QmlItemNode &itemNode)
+{
+ foreach (QGraphicsItem *item, itemList) {
+ FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
+ if (formEditorItem && formEditorItem->qmlItemNode() == itemNode)
+ return true;
+ }
+
+ return false;
+}
+
+void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & itemList, QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
+
+ QmlItemNode currentSelectedNode;
+
+ if (view()->selectedModelNodes().count() == 1) {
+ currentSelectedNode = view()->selectedModelNodes().first();
+
+ if (!containsItemNode(itemList, currentSelectedNode)) {
+ QmlItemNode selectedNode;
+
+ FormEditorItem *formEditorItem = nearestFormEditorItem(event->scenePos(), itemList);
+
+ if (formEditorItem && formEditorItem->qmlItemNode().isValid())
+ selectedNode = formEditorItem->qmlItemNode();
+
+ if (selectedNode.isValid()) {
+ QList<ModelNode> nodeList;
+ nodeList.append(selectedNode);
+
+ view()->setSelectedModelNodes(nodeList);
+ }
+ }
+ }
+
showContextMenu(event);
event->accept();
}
@@ -236,7 +267,7 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList<QGraphicsItem*> & /*i
void AbstractFormEditorTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
- FormEditorItem *formEditorItem = topFormEditorItem(itemList);
+ FormEditorItem *formEditorItem = nearestFormEditorItem(event->pos(), itemList);
if (formEditorItem) {
view()->setSelectedModelNode(formEditorItem->qmlItemNode().modelNode());
view()->changeToCustomTool();
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
index e7e0caef6d..a53259d869 100644
--- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
+++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h
@@ -91,11 +91,10 @@ public:
bool topSelectedItemIsMovable(const QList<QGraphicsItem*> &itemList);
bool topItemIsResizeHandle(const QList<QGraphicsItem*> &itemList);
- static FormEditorItem* topFormEditorItem(const QList<QGraphicsItem*> &itemList);
- static FormEditorItem* topFormEditorItemWithRootItem(const QList<QGraphicsItem*> &itemList);
-
QList<FormEditorItem*> filterSelectedModelNodes(const QList<FormEditorItem*> &itemList) const;
+ FormEditorItem *nearestFormEditorItem(const QPointF &point, const QList<QGraphicsItem *> &itemList);
+
protected:
virtual void selectedItemsChanged(const QList<FormEditorItem*> &itemList) = 0;
virtual void showContextMenu(QGraphicsSceneMouseEvent *event);
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index d2dee99599..69bc70b7e6 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -69,8 +69,6 @@ FormEditorView::FormEditorView(QObject *parent)
connect(formEditorWidget()->zoomAction(), SIGNAL(zoomLevelChanged(double)), SLOT(updateGraphicsIndicators()));
connect(formEditorWidget()->showBoundingRectAction(), SIGNAL(toggled(bool)), scene(), SLOT(setShowBoundingRects(bool)));
- connect(formEditorWidget()->selectOnlyContentItemsAction(), SIGNAL(toggled(bool)), this, SLOT(setSelectOnlyContentItemsAction(bool)));
-
}
FormEditorScene* FormEditorView::scene() const
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index c44938111d..e0b654d5a6 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -105,15 +105,10 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view)
addAction(m_showBoundingRectAction.data());
upperActions.append(m_showBoundingRectAction.data());
- m_selectOnlyContentItemsAction = new QAction(tr("Only select items with content (S)."), this);
- m_selectOnlyContentItemsAction->setShortcut(Qt::Key_S);
- m_selectOnlyContentItemsAction->setShortcutContext(Qt::WidgetWithChildrenShortcut);
- m_selectOnlyContentItemsAction->setCheckable(true);
- m_selectOnlyContentItemsAction->setChecked(false);
- m_selectOnlyContentItemsAction->setIcon(QPixmap(":/icon/selection/selectonlycontentitems.png"));
-
- addAction(m_selectOnlyContentItemsAction.data());
- upperActions.append(m_selectOnlyContentItemsAction.data());
+ separatorAction = new QAction(this);
+ separatorAction->setSeparator(true);
+ addAction(separatorAction);
+ upperActions.append(separatorAction);
m_rootWidthAction = new LineEditAction(tr("Width"), this);
connect(m_rootWidthAction.data(), SIGNAL(textChanged(QString)), this, SLOT(changeRootItemWidth(QString)));
@@ -255,11 +250,6 @@ QAction *FormEditorWidget::showBoundingRectAction() const
return m_showBoundingRectAction.data();
}
-QAction *FormEditorWidget::selectOnlyContentItemsAction() const
-{
- return m_selectOnlyContentItemsAction.data();
-}
-
QAction *FormEditorWidget::snappingAction() const
{
return m_snappingAction.data();
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
index 2265145dfb..4e869ef78b 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
@@ -58,7 +58,6 @@ public:
ZoomAction *zoomAction() const;
QAction *showBoundingRectAction() const;
- QAction *selectOnlyContentItemsAction() const;
QAction *snappingAction() const;
QAction *snappingAndAnchoringAction() const;
@@ -103,7 +102,6 @@ private:
QPointer<QAction> m_snappingAndAnchoringAction;
QPointer<QAction> m_noSnappingAction;
QPointer<QAction> m_showBoundingRectAction;
- QPointer<QAction> m_selectOnlyContentItemsAction;
QPointer<LineEditAction> m_rootWidthAction;
QPointer<LineEditAction> m_rootHeightAction;
QPointer<BackgroundAction> m_backgroundAction;
diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
index 9ce85b71ad..f066d42b1e 100644
--- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
@@ -52,8 +52,7 @@ SelectionTool::SelectionTool(FormEditorView *editorView)
m_resizeIndicator(editorView->scene()->manipulatorLayerItem()),
m_anchorIndicator(editorView->scene()->manipulatorLayerItem()),
m_bindingIndicator(editorView->scene()->manipulatorLayerItem()),
- m_contentNotEditableIndicator(editorView->scene()->manipulatorLayerItem()),
- m_selectOnlyContentItems(false)
+ m_contentNotEditableIndicator(editorView->scene()->manipulatorLayerItem())
{
m_selectionIndicator.setCursor(Qt::ArrowCursor);
}
@@ -68,28 +67,28 @@ void SelectionTool::mousePressEvent(const QList<QGraphicsItem*> &itemList,
{
if (event->button() == Qt::LeftButton) {
m_mousePressTimer.start();
- FormEditorItem* formEditorItem = topFormEditorItem(itemList);
+ FormEditorItem* formEditorItem = nearestFormEditorItem(event->scenePos(), itemList);
if (formEditorItem
&& formEditorItem->qmlItemNode().isValid()
&& !formEditorItem->qmlItemNode().hasChildren()) {
m_singleSelectionManipulator.begin(event->scenePos());
if (event->modifiers().testFlag(Qt::ControlModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection);
else if (event->modifiers().testFlag(Qt::ShiftModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection);
else
- m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection);
} else {
if (event->modifiers().testFlag(Qt::AltModifier)) {
m_singleSelectionManipulator.begin(event->scenePos());
if (event->modifiers().testFlag(Qt::ControlModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection);
else if (event->modifiers().testFlag(Qt::ShiftModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection);
else
- m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection);
m_singleSelectionManipulator.end(event->scenePos());
view()->changeToMoveTool(event->scenePos());
@@ -130,7 +129,7 @@ void SelectionTool::mouseMoveEvent(const QList<QGraphicsItem*> &/*itemList*/,
}
void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList,
- QGraphicsSceneMouseEvent * /*event*/)
+ QGraphicsSceneMouseEvent * event)
{
if (!itemList.isEmpty()) {
@@ -146,7 +145,7 @@ void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList,
}
}
- FormEditorItem *topSelectableItem = topMovableFormEditorItem(itemList, m_selectOnlyContentItems);
+ FormEditorItem *topSelectableItem = nearestFormEditorItem(event->scenePos(), itemList);
scene()->highlightBoundingRect(topSelectableItem);
@@ -156,33 +155,35 @@ void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList,
void SelectionTool::mouseReleaseEvent(const QList<QGraphicsItem*> &itemList,
QGraphicsSceneMouseEvent *event)
{
- if (m_singleSelectionManipulator.isActive()) {
- m_singleSelectionManipulator.end(event->scenePos());
- } else if (m_rubberbandSelectionManipulator.isActive()) {
+ if (event->button() == Qt::LeftButton) {
+ if (m_singleSelectionManipulator.isActive()) {
+ m_singleSelectionManipulator.end(event->scenePos());
+ } else if (m_rubberbandSelectionManipulator.isActive()) {
- QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->scenePos();
- if (mouseMovementVector.toPoint().manhattanLength() < s_startDragDistance) {
- m_singleSelectionManipulator.begin(event->scenePos());
+ QPointF mouseMovementVector = m_rubberbandSelectionManipulator.beginPoint() - event->scenePos();
+ if (mouseMovementVector.toPoint().manhattanLength() < s_startDragDistance) {
+ m_singleSelectionManipulator.begin(event->scenePos());
- if (event->modifiers().testFlag(Qt::ControlModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection, m_selectOnlyContentItems);
- else if (event->modifiers().testFlag(Qt::ShiftModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection, m_selectOnlyContentItems);
- else
- m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection, m_selectOnlyContentItems);
+ if (event->modifiers().testFlag(Qt::ControlModifier))
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection);
+ else if (event->modifiers().testFlag(Qt::ShiftModifier))
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection);
+ else
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection);
- m_singleSelectionManipulator.end(event->scenePos());
- } else {
- m_rubberbandSelectionManipulator.update(event->scenePos());
+ m_singleSelectionManipulator.end(event->scenePos());
+ } else {
+ m_rubberbandSelectionManipulator.update(event->scenePos());
- if (event->modifiers().testFlag(Qt::ControlModifier))
- m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::RemoveFromSelection);
- else if (event->modifiers().testFlag(Qt::ShiftModifier))
- m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::AddToSelection);
- else
- m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::ReplaceSelection);
+ if (event->modifiers().testFlag(Qt::ControlModifier))
+ m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::RemoveFromSelection);
+ else if (event->modifiers().testFlag(Qt::ShiftModifier))
+ m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::AddToSelection);
+ else
+ m_rubberbandSelectionManipulator.select(RubberBandSelectionManipulator::ReplaceSelection);
- m_rubberbandSelectionManipulator.end();
+ m_rubberbandSelectionManipulator.end();
+ }
}
}
@@ -220,11 +221,6 @@ void SelectionTool::dragMoveEvent(const QList<QGraphicsItem*> &/*itemList*/, QGr
{
}
-void SelectionTool::setSelectOnlyContentItems(bool selectOnlyContentItems)
-{
- m_selectOnlyContentItems = selectOnlyContentItems;
-}
-
void SelectionTool::itemsAboutToRemoved(const QList<FormEditorItem*> &/*itemList*/)
{
@@ -294,11 +290,11 @@ void SelectionTool::selectUnderPoint(QGraphicsSceneMouseEvent *event)
m_singleSelectionManipulator.begin(event->scenePos());
if (event->modifiers().testFlag(Qt::ControlModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::RemoveFromSelection);
else if (event->modifiers().testFlag(Qt::ShiftModifier))
- m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::AddToSelection);
else
- m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection, m_selectOnlyContentItems);
+ m_singleSelectionManipulator.select(SingleSelectionManipulator::ReplaceSelection);
m_singleSelectionManipulator.end(event->scenePos());
}
diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.h b/src/plugins/qmldesigner/components/formeditor/selectiontool.h
index 09dfdb1a35..1207a4b7c8 100644
--- a/src/plugins/qmldesigner/components/formeditor/selectiontool.h
+++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.h
@@ -84,8 +84,6 @@ public:
void selectUnderPoint(QGraphicsSceneMouseEvent *event);
- void setSelectOnlyContentItems(bool selectOnlyContentItems);
-
void setCursor(const QCursor &cursor);
private:
@@ -97,7 +95,6 @@ private:
BindingIndicator m_bindingIndicator;
ContentNotEditableIndicator m_contentNotEditableIndicator;
QTime m_mousePressTimer;
- bool m_selectOnlyContentItems;
QCursor m_cursor;
};
diff --git a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
index 17cac1017f..83756b6897 100644
--- a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
@@ -68,24 +68,16 @@ void SingleSelectionManipulator::end(const QPointF &/*updatePoint*/)
m_isActive = false;
}
-void SingleSelectionManipulator::select(SelectionType selectionType, bool selectOnlyContentItems)
+void SingleSelectionManipulator::select(SelectionType selectionType)
{
QList<QGraphicsItem*> itemList = m_editorView->scene()->items(m_beginPoint);
QmlItemNode selectedNode;
- foreach (QGraphicsItem* item, itemList)
- {
- FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
+ FormEditorItem *formEditorItem = m_editorView->currentTool()->nearestFormEditorItem(m_beginPoint, itemList);
- if (formEditorItem
- && formEditorItem->qmlItemNode().isValid()
- && (formEditorItem->qmlItemNode().instanceHasShowContent() || !selectOnlyContentItems))
- {
- selectedNode = formEditorItem->qmlItemNode();
- break;
- }
- }
+ if (formEditorItem && formEditorItem->qmlItemNode().isValid())
+ selectedNode = formEditorItem->qmlItemNode();
QList<QmlItemNode> nodeList;
diff --git a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h
index 9b5a76be11..b03f10917f 100644
--- a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h
+++ b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.h
@@ -55,7 +55,7 @@ public:
void update(const QPointF& updatePoint);
void end(const QPointF& updatePoint);
- void select(SelectionType selectionType, bool selectOnlyContentItems);
+ void select(SelectionType selectionType);
void clear();