From 51a4e3fa7d980349516100184e455d4449e59435 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Mar 2016 10:56:54 +0100 Subject: [PATCH] properly abort drags from outside the worldspace widget (code was leaving unclean dragging flags behind) --- apps/opencs/view/render/instancemode.cpp | 8 ++------ apps/opencs/view/render/worldspacewidget.cpp | 19 ++++++++++++------- apps/opencs/view/render/worldspacewidget.hpp | 6 ++++++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/apps/opencs/view/render/instancemode.cpp b/apps/opencs/view/render/instancemode.cpp index 0c4da4963..80529d80d 100644 --- a/apps/opencs/view/render/instancemode.cpp +++ b/apps/opencs/view/render/instancemode.cpp @@ -97,10 +97,7 @@ void CSVRender::InstanceMode::setEditLock (bool locked) mLocked = locked; if (mLocked) - { - mDragMode = DragMode_None; - getWorldspaceWidget().reset (Mask_Reference); - } + getWorldspaceWidget().abortDrag(); } void CSVRender::InstanceMode::primaryEditPressed (osg::ref_ptr tag) @@ -457,7 +454,6 @@ int CSVRender::InstanceMode::getSubMode() const void CSVRender::InstanceMode::subModeChanged (const std::string& id) { - mDragMode = DragMode_None; - getWorldspaceWidget().reset (Mask_Reference); + getWorldspaceWidget().abortDrag(); getWorldspaceWidget().setSubMode (getSubModeFromId (id), Mask_Reference); } diff --git a/apps/opencs/view/render/worldspacewidget.cpp b/apps/opencs/view/render/worldspacewidget.cpp index 83feb0be3..aea23ba7e 100644 --- a/apps/opencs/view/render/worldspacewidget.cpp +++ b/apps/opencs/view/render/worldspacewidget.cpp @@ -364,6 +364,17 @@ osg::Vec3f CSVRender::WorldspaceWidget::getIntersectionPoint (const QPoint& loca return start + direction * CSMPrefs::get()["Scene Drops"]["distance"].toInt(); } +void CSVRender::WorldspaceWidget::abortDrag() +{ + if (mDragging) + { + EditMode& editMode = dynamic_cast (*mEditMode->getCurrent()); + + editMode.dragAborted(); + mDragging = false; + } +} + void CSVRender::WorldspaceWidget::dragEnterEvent (QDragEnterEvent* event) { const CSMWorld::TableMimeData* mime = dynamic_cast (event->mimeData()); @@ -736,13 +747,7 @@ void CSVRender::WorldspaceWidget::keyPressEvent (QKeyEvent *event) { if(event->key() == Qt::Key_Escape) { - if (mDragging) - { - EditMode& editMode = dynamic_cast (*mEditMode->getCurrent()); - - editMode.dragAborted(); - mDragging = false; - } + abortDrag(); } else RenderWidget::keyPressEvent(event); diff --git a/apps/opencs/view/render/worldspacewidget.hpp b/apps/opencs/view/render/worldspacewidget.hpp index 55b0f1f55..4c9c0c31e 100644 --- a/apps/opencs/view/render/worldspacewidget.hpp +++ b/apps/opencs/view/render/worldspacewidget.hpp @@ -161,6 +161,12 @@ namespace CSVRender /// Erase all overrides and restore the visual representation to its true state. virtual void reset (unsigned int elementMask) = 0; + /// \note Drags will be automatically aborted when the aborting is triggered + /// (either explicitly or implicitly) from within this class. This function only + /// needs to be called, when the drag abort is triggered externally (e.g. from + /// an edit mode). + void abortDrag(); + protected: /// Visual elements in a scene