diff options
author | Katarina Behrens <Katarina.Behrens@cib.de> | 2018-11-30 10:32:11 +0100 |
---|---|---|
committer | Katarina Behrens <Katarina.Behrens@cib.de> | 2018-12-03 10:51:28 +0100 |
commit | 3ac46abde192324fc7e1cbf3f22b7280f15e77df (patch) | |
tree | b88d3c411b09c8fd6bf049b90ff38a38a8e5dd50 /vcl | |
parent | 097da565e03c8bf1fc016d5a797f4e606716a7a3 (diff) |
tdf#120781: Proposed DnD operation is not always 'move'
sometimes drop target doesn't accept drops, dragged objects must not
disappear in such case
Change-Id: I5de3c6c4afc305ea98bd15c7ff55e218364e9475
Reviewed-on: https://gerrit.libreoffice.org/64338
Tested-by: Jenkins
Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/qt5/Qt5DragAndDrop.hxx | 6 | ||||
-rw-r--r-- | vcl/qt5/Qt5DragAndDrop.cxx | 34 | ||||
-rw-r--r-- | vcl/qt5/Qt5Frame.cxx | 7 | ||||
-rw-r--r-- | vcl/qt5/Qt5Widget.cxx | 3 |
4 files changed, 37 insertions, 13 deletions
diff --git a/vcl/inc/qt5/Qt5DragAndDrop.hxx b/vcl/inc/qt5/Qt5DragAndDrop.hxx index 568b64236868..dc5b52678d0a 100644 --- a/vcl/inc/qt5/Qt5DragAndDrop.hxx +++ b/vcl/inc/qt5/Qt5DragAndDrop.hxx @@ -57,7 +57,7 @@ public: css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; void dragFailed(); - void fire_dragEnd(); + void fire_dragEnd(sal_Int8 nAction); css::uno::Reference<css::datatransfer::XTransferable> const& GetTransferable() const { return m_xTrans; @@ -72,6 +72,8 @@ class Qt5DropTarget { osl::Mutex m_aMutex; Qt5Frame* m_pFrame; + sal_Int8 mnDragAction; + sal_Int8 mnDropAction; bool m_bActive; sal_Int8 m_nDefaultActions; std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> m_aListeners; @@ -111,6 +113,8 @@ public: void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde); void fire_dragOver(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde); void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde); + + sal_Int8 proposedDragAction() const { return mnDragAction; } }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qt5/Qt5DragAndDrop.cxx b/vcl/qt5/Qt5DragAndDrop.cxx index 6a68273e23be..280763812b72 100644 --- a/vcl/qt5/Qt5DragAndDrop.cxx +++ b/vcl/qt5/Qt5DragAndDrop.cxx @@ -86,12 +86,12 @@ void Qt5DragSource::dragFailed() } } -void Qt5DragSource::fire_dragEnd() +void Qt5DragSource::fire_dragEnd(sal_Int8 nAction) { if (m_xListener.is()) { datatransfer::dnd::DragSourceDropEvent aEv; - aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_MOVE; + aEv.DropAction = nAction; aEv.DropSuccess = true; // FIXME: what if drop didn't work out? auto xListener = m_xListener; m_xListener.clear(); @@ -168,6 +168,9 @@ void Qt5DropTarget::initialize(const Sequence<Any>& rArguments) static_cast<OWeakObject*>(this)); } + mnDragAction = datatransfer::dnd::DNDConstants::ACTION_NONE; + mnDropAction = datatransfer::dnd::DNDConstants::ACTION_NONE; + m_pFrame = reinterpret_cast<Qt5Frame*>(nFrame); m_pFrame->registerDropTarget(this); m_bActive = true; @@ -240,11 +243,30 @@ void Qt5DropTarget::fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& } } -void Qt5DropTarget::acceptDrag(sal_Int8 /*dragOperation*/) { return; } -void Qt5DropTarget::rejectDrag() { return; } +void Qt5DropTarget::acceptDrag(sal_Int8 dragOperation) +{ + mnDragAction = dragOperation; + return; +} + +void Qt5DropTarget::rejectDrag() +{ + mnDragAction = 0; + return; +} + +void Qt5DropTarget::acceptDrop(sal_Int8 dropOperation) +{ + mnDropAction = dropOperation; + return; +} + +void Qt5DropTarget::rejectDrop() +{ + mnDropAction = 0; + return; +} -void Qt5DropTarget::acceptDrop(sal_Int8 /*dropOperation*/) { return; } -void Qt5DropTarget::rejectDrop() { return; } void Qt5DropTarget::dropComplete(sal_Bool /*success*/) { return; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index ad043ebd3ab8..9304760a47c0 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -1049,7 +1049,7 @@ void Qt5Frame::draggingStarted(const int x, const int y) aEvent.Context = static_cast<css::datatransfer::dnd::XDropTargetDragContext*>(m_pDropTarget); aEvent.LocationX = x; aEvent.LocationY = y; - aEvent.DropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE; //FIXME + aEvent.DropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE; aEvent.SourceActions = css::datatransfer::dnd::DNDConstants::ACTION_MOVE; css::uno::Reference<css::datatransfer::XTransferable> xTransferable; @@ -1077,7 +1077,8 @@ void Qt5Frame::dropping(const int x, const int y) aEvent.Context = static_cast<css::datatransfer::dnd::XDropTargetDropContext*>(m_pDropTarget); aEvent.LocationX = x; aEvent.LocationY = y; - aEvent.DropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE; //FIXME + aEvent.DropAction = m_pDropTarget->proposedDragAction() + | css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT; aEvent.SourceActions = css::datatransfer::dnd::DNDConstants::ACTION_MOVE; css::uno::Reference<css::datatransfer::XTransferable> xTransferable; @@ -1089,7 +1090,7 @@ void Qt5Frame::dropping(const int x, const int y) if (m_pDragSource) { - m_pDragSource->fire_dragEnd(); + m_pDragSource->fire_dragEnd(m_pDropTarget->proposedDragAction()); } } diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx index 1c032e2a75ce..ea0258589ff7 100644 --- a/vcl/qt5/Qt5Widget.cxx +++ b/vcl/qt5/Qt5Widget.cxx @@ -197,7 +197,6 @@ void Qt5Widget::startDrag() void Qt5Widget::dragEnterEvent(QDragEnterEvent* event) { - SAL_WARN("vcl.qt5", "dragenterevent"); if (event->source() == this) event->accept(); } @@ -205,7 +204,6 @@ void Qt5Widget::dragEnterEvent(QDragEnterEvent* event) void Qt5Widget::dragMoveEvent(QDragMoveEvent* event) { QPoint point = event->pos(); - SAL_WARN("vcl.qt5", "dragmoveevent"); m_pFrame->draggingStarted(point.x(), point.y()); QWidget::dragMoveEvent(event); @@ -214,7 +212,6 @@ void Qt5Widget::dragMoveEvent(QDragMoveEvent* event) void Qt5Widget::dropEvent(QDropEvent* event) { QPoint point = event->pos(); - SAL_WARN("vcl.qt5", "dropevent"); m_pFrame->dropping(point.x(), point.y()); QWidget::dropEvent(event); |