Skip to content

Commit

Permalink
Change drag/drop between databases to default to COPY
Browse files Browse the repository at this point in the history
* Fixes #172
  • Loading branch information
Olivier ROMAN authored and droidmonkey committed Oct 13, 2024
1 parent d57d167 commit 49a2849
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 10 deletions.
4 changes: 4 additions & 0 deletions src/gui/group/GroupModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
61 changes: 51 additions & 10 deletions src/gui/group/GroupView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,29 @@ void GroupView::changeDatabase(const QSharedPointer<Database>& 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();
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/gui/group/GroupView.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 49a2849

Please sign in to comment.