Skip to content

Commit

Permalink
fix issue : copy when drop to another database
Browse files Browse the repository at this point in the history
  • Loading branch information
Olivier ROMAN committed Oct 9, 2024
1 parent ea2e36c commit c94f55f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 10 deletions.
1 change: 1 addition & 0 deletions src/gui/group/GroupModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ 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
60 changes: 50 additions & 10 deletions src/gui/group/GroupView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,21 +96,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 @@ -148,6 +156,38 @@ 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 c94f55f

Please sign in to comment.