summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2018-09-26 17:28:35 +0300
committerTomi Korpipää <tomi.korpipaa@qt.io>2018-09-27 03:42:54 +0000
commiteda406902e1d7a08d482d05a9c715609f93ff7b2 (patch)
treef666fb429198703a73c80834f75f835f40d75c9d
parentbc944ad74073362672dba0335785b4557ce65626 (diff)
Fix dragging binding loops and the subpresentation drag dialog issues
Binding loops while dragging were caused by QML drag implementation that was unneeded since the drag is actually handled by C++ QDrag. Removed the superfluous QML drag things. This also seemed to fix the duplicate drag layer/texture/cancel dialog that sometimes happened. Additially, the layer/texture/cancel dialog was modified to use explicit layer and texture buttons instead of renamed standard buttons. Task-number: QT3DS-2397 Change-Id: I86c8ab61e4450b4aff3ef4bb9cae3776aa47959a Reviewed-by: Mats Honkamaa <mats.honkamaa@qt.io> Reviewed-by: Kimmo Leppälä <kimmo.leppala@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/Authoring/Studio/DragAndDrop/SceneDropTarget.cpp13
-rw-r--r--src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp1
-rw-r--r--src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml23
-rw-r--r--src/Authoring/Studio/Palettes/Project/ProjectView.cpp3
-rw-r--r--src/Authoring/Studio/Palettes/Project/ProjectView.qml63
5 files changed, 51 insertions, 52 deletions
diff --git a/src/Authoring/Studio/DragAndDrop/SceneDropTarget.cpp b/src/Authoring/Studio/DragAndDrop/SceneDropTarget.cpp
index 3bd3b704..1170ed15 100644
--- a/src/Authoring/Studio/DragAndDrop/SceneDropTarget.cpp
+++ b/src/Authoring/Studio/DragAndDrop/SceneDropTarget.cpp
@@ -44,6 +44,7 @@
#include "Qt3DSDMSlides.h"
#include "PresentationFile.h"
#include "QtWidgets/qmessagebox.h"
+#include "QtWidgets/qpushbutton.h"
// Sceneview stuff
//===============================================================================
@@ -147,15 +148,15 @@ bool CSceneViewDropTarget::Drop(CDropSource &inSource)
QMessageBox msgBox;
msgBox.setWindowTitle(QObject::tr("Set Sub-presentation"));
msgBox.setText(QObject::tr("Set as sub-presentation to"));
- msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
- msgBox.setButtonText(QMessageBox::Yes, QObject::tr("Layer"));
- msgBox.setButtonText(QMessageBox::No, QObject::tr("Texture"));
+ QPushButton *layerButton = msgBox.addButton(QObject::tr("Layer"), QMessageBox::YesRole);
+ QPushButton *textureButton = msgBox.addButton(QObject::tr("Texture"), QMessageBox::NoRole);
+ msgBox.addButton(QMessageBox::Cancel);
- int choice = msgBox.exec();
- if (choice == QMessageBox::Yes) { // layer
+ msgBox.exec();
+ if (msgBox.clickedButton() == layerButton) {
instance = doc->GetActiveLayer();
// The GenerateAssetCommand below will take care of setting the subpresentation
- } else if (choice == QMessageBox::No) { // texture
+ } else if (msgBox.clickedButton() == textureButton) { // texture
instance = doc->GetActiveRootInstance();
// The GenerateAssetCommand below will take care of setting the subpresentation
} else {
diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp
index 3b0b3ef7..e3b35963 100644
--- a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp
+++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.cpp
@@ -57,6 +57,7 @@ QSize BasicObjectsView::sizeHint() const
void BasicObjectsView::startDrag(QQuickItem *item, int row)
{
+ item->grabMouse(); // Grab to make sure we can ungrab after the drag
const auto index = m_ObjectsModel->index(row);
QDrag drag(this);
diff --git a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml
index 02080167..5f469a5a 100644
--- a/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml
+++ b/src/Authoring/Studio/Palettes/BasicObjects/BasicObjectsView.qml
@@ -53,19 +53,24 @@ Rectangle {
id: dragItem
anchors.fill: parent
- Drag.active: dragArea.drag.active
- Drag.hotSpot.x: width / 2
- Drag.hotSpot.y: height / 2
- Drag.dragType: Drag.Automatic
- Drag.supportedActions: Qt.CopyAction
-
MouseArea {
id: dragArea
+ property bool dragStarted: false
+ property point pressPoint
+
anchors.fill: parent
- drag.target: dragItem
+ onPressed: {
+ pressPoint = Qt.point(mouse.x, mouse.y);
+ dragStarted = false;
+ }
+ onPositionChanged: {
+ if (!dragStarted && (Math.abs(mouse.x - pressPoint.x) > 4
+ || Math.abs(mouse.y - pressPoint.y) > 4)) {
+ dragStarted = true;
+ _basicObjectsView.startDrag(dragItem, index);
+ }
+ }
}
-
- Drag.onDragStarted: _basicObjectsView.startDrag(dragArea, model.index)
}
Row {
id: contentRow
diff --git a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
index 05c68ecd..6b7a5a49 100644
--- a/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
+++ b/src/Authoring/Studio/Palettes/Project/ProjectView.cpp
@@ -271,6 +271,7 @@ void ProjectView::mousePressEvent(QMouseEvent *event)
void ProjectView::startDrag(QQuickItem *item, int row)
{
+ item->grabMouse(); // Grab to make sure we can ungrab after the drag
const auto index = m_ProjectModel->index(row);
QDrag drag(this);
@@ -281,6 +282,8 @@ void ProjectView::startDrag(QQuickItem *item, int row)
drag.exec(Qt::IgnoreAction);
else
drag.exec(Qt::CopyAction);
+
+ // Ungrab to trigger mouse release on the originating item
QTimer::singleShot(0, item, &QQuickItem::ungrabMouse);
}
diff --git a/src/Authoring/Studio/Palettes/Project/ProjectView.qml b/src/Authoring/Studio/Palettes/Project/ProjectView.qml
index f7d9c56f..0144144b 100644
--- a/src/Authoring/Studio/Palettes/Project/ProjectView.qml
+++ b/src/Authoring/Studio/Palettes/Project/ProjectView.qml
@@ -71,10 +71,26 @@ Rectangle {
delegate: Rectangle {
id: delegateItem
property bool dragging: false
+ property bool dragStarted: false
+ property point pressPoint
width: parent.width
height: 20
color: (index == projectTree.currentIndex || dragging) ? _selectionColor
: "transparent"
+ function handlePress(mouse) {
+ if (_isDraggable) {
+ pressPoint = Qt.point(mouse.x, mouse.y);
+ dragStarted = false;
+ }
+ }
+ function handlePositionChange(mouse, item) {
+ if (_isDraggable && !dragStarted
+ && (Math.abs(mouse.x - pressPoint.x) > 4
+ || Math.abs(mouse.y - pressPoint.y) > 4)) {
+ dragStarted = true;
+ _parentView.startDrag(item, index);
+ }
+ }
Row {
x: _depth*28
@@ -98,54 +114,27 @@ Rectangle {
}
Image {
+ id: fileIconImage
source: fileIcon
-
- Item {
- id: dragItemIcon
-
- visible: _isDraggable
+ MouseArea {
anchors.fill: parent
-
- Drag.active: dragAreaIcon.drag.active
- Drag.hotSpot.x: width / 2
- Drag.hotSpot.y: height / 2
- Drag.dragType: Drag.Automatic
- Drag.supportedActions: Qt.CopyAction
-
- MouseArea {
- id: dragAreaIcon
- anchors.fill: parent
- drag.target: dragItemIcon
- }
-
- Drag.onDragStarted: _parentView.startDrag(dragAreaIcon, index)
+ onPressed: delegateItem.handlePress(mouse)
+ onPositionChanged: delegateItem.handlePositionChange(mouse,
+ fileIconImage)
}
}
StyledLabel {
+ id: fileNameLabel
text: fileName
color: _isReferenced ? _textColor : _disabledColor
leftPadding: 2
- Item {
- id: dragItem
-
- visible: _isDraggable
+ MouseArea {
anchors.fill: parent
-
- Drag.active: dragArea.drag.active
- Drag.hotSpot.x: width / 2
- Drag.hotSpot.y: height / 2
- Drag.dragType: Drag.Automatic
- Drag.supportedActions: Qt.CopyAction
-
- MouseArea {
- id: dragArea
- anchors.fill: parent
- drag.target: dragItem
- }
-
- Drag.onDragStarted: _parentView.startDrag(dragArea, index)
+ onPressed: delegateItem.handlePress(mouse)
+ onPositionChanged: delegateItem.handlePositionChange(mouse,
+ fileNameLabel)
}
}
}