From 49a2849489e4b8e07bcb43699ad0c04779c73e4e Mon Sep 17 00:00:00 2001 From: Olivier ROMAN Date: Wed, 9 Oct 2024 15:53:27 +0200 Subject: [PATCH] Change drag/drop between databases to default to COPY * Fixes #172 --- src/gui/group/GroupModel.h | 4 +++ src/gui/group/GroupView.cpp | 61 +++++++++++++++++++++++++++++++------ src/gui/group/GroupView.h | 2 ++ 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/gui/group/GroupModel.h b/src/gui/group/GroupModel.h index dae2bb9300..ce65291db5 100644 --- a/src/gui/group/GroupModel.h +++ b/src/gui/group/GroupModel.h @@ -29,6 +29,10 @@ class GroupModel : public QAbstractItemModel public: explicit GroupModel(Database* db, QObject* parent = nullptr); + const Database* database() const + { + return m_db; + } void changeDatabase(Database* newDb); QModelIndex index(Group* group) const; Group* groupFromIndex(const QModelIndex& index) const; diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp index 46cc0af6af..50dfafaef4 100644 --- a/src/gui/group/GroupView.cpp +++ b/src/gui/group/GroupView.cpp @@ -98,21 +98,29 @@ void GroupView::changeDatabase(const QSharedPointer& newDb) void GroupView::dragMoveEvent(QDragMoveEvent* event) { - if (event->keyboardModifiers() & Qt::ControlModifier) { - event->setDropAction(Qt::CopyAction); - } else { - event->setDropAction(Qt::MoveAction); - } - QTreeView::dragMoveEvent(event); - // entries may only be dropped on groups - if (event->isAccepted() && event->mimeData()->hasFormat("application/x-keepassx-entry") - && (dropIndicatorPosition() == AboveItem || dropIndicatorPosition() == BelowItem)) { - event->ignore(); + if (event->isAccepted()) { + // we need to fix the drop action to have the correct cursor icon + fixDropAction(event); + if (event->dropAction() != event->proposedAction()) { + event->accept(); + } + + // entries may only be dropped on groups + if (event->mimeData()->hasFormat("application/x-keepassx-entry") + && (dropIndicatorPosition() == AboveItem || dropIndicatorPosition() == BelowItem)) { + event->ignore(); + } } } +void GroupView::dropEvent(QDropEvent* event) +{ + fixDropAction(event); + QTreeView::dropEvent(event); +} + void GroupView::focusInEvent(QFocusEvent* event) { emit groupFocused(); @@ -151,6 +159,39 @@ void GroupView::recInitExpanded(Group* group) } } +void GroupView::fixDropAction(QDropEvent* event) +{ + if (event->keyboardModifiers().testFlag(Qt::ControlModifier) && event->possibleActions().testFlag(Qt::CopyAction)) { + event->setDropAction(Qt::CopyAction); + } else if (event->keyboardModifiers().testFlag(Qt::ShiftModifier) + && event->possibleActions().testFlag(Qt::MoveAction)) { + event->setDropAction(Qt::MoveAction); + } else { + static const QString groupMimeDataType = "application/x-keepassx-group"; + static const QString entryMimeDataType = "application/x-keepassx-entry"; + + bool isGroup = event->mimeData()->hasFormat(groupMimeDataType); + bool isEntry = event->mimeData()->hasFormat(entryMimeDataType); + + if (isGroup || isEntry) { + QByteArray encoded = event->mimeData()->data(isGroup ? groupMimeDataType : entryMimeDataType); + QDataStream stream(&encoded, QIODevice::ReadOnly); + + QUuid dbUuid; + QUuid itemUuid; + stream >> dbUuid >> itemUuid; + + if (dbUuid != m_model->database()->uuid()) { + if (event->possibleActions().testFlag(Qt::CopyAction)) { + event->setDropAction(Qt::CopyAction); + } else if (event->possibleActions().testFlag(Qt::MoveAction)) { + event->setDropAction(Qt::MoveAction); + } + } + } + } +} + void GroupView::expandGroup(Group* group, bool expand) { QModelIndex index = m_model->index(group); diff --git a/src/gui/group/GroupView.h b/src/gui/group/GroupView.h index 15df853ffb..7030b3173c 100644 --- a/src/gui/group/GroupView.h +++ b/src/gui/group/GroupView.h @@ -51,10 +51,12 @@ private slots: protected: void dragMoveEvent(QDragMoveEvent* event) override; + void dropEvent(QDropEvent* event) override; void focusInEvent(QFocusEvent* event) override; private: void recInitExpanded(Group* group); + void fixDropAction(QDropEvent* event); GroupModel* const m_model; bool m_updatingExpanded;