diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index a0e74e68c..ae310b6c8 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -28,7 +28,7 @@ EntryModel::EntryModel(QObject* parent) : QAbstractTableModel(parent) , m_group(Q_NULLPTR) { - setSupportedDragActions(Qt::MoveAction); + setSupportedDragActions(Qt::MoveAction | Qt::CopyAction); } Entry* EntryModel::entryFromIndex(const QModelIndex& index) const diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 5cad63de9..243037a21 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -40,6 +40,9 @@ EntryView::EntryView(QWidget* parent) setSortingEnabled(true); setSelectionMode(QAbstractItemView::ExtendedSelection); + // QAbstractItemView::startDrag() uses this property as the default drag action + setDefaultDropAction(Qt::MoveAction); + connect(this, SIGNAL(activated(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(entrySelectionChanged())); connect(m_model, SIGNAL(switchedToEntryListMode()), SLOT(switchToEntryListMode())); diff --git a/src/gui/group/GroupModel.cpp b/src/gui/group/GroupModel.cpp index b2919b39d..6e11e5fd5 100644 --- a/src/gui/group/GroupModel.cpp +++ b/src/gui/group/GroupModel.cpp @@ -182,7 +182,7 @@ Group* GroupModel::groupFromIndex(const QModelIndex& index) const Qt::DropActions GroupModel::supportedDropActions() const { - return Qt::MoveAction; + return Qt::MoveAction | Qt::CopyAction; } Qt::ItemFlags GroupModel::flags(const QModelIndex& modelIndex) const @@ -203,7 +203,7 @@ bool GroupModel::dropMimeData(const QMimeData* data, Qt::DropAction action, { Q_UNUSED(column); - if (!data || (action != Qt::MoveAction) || !parent.isValid()) { + if (!data || (action != Qt::MoveAction && action != Qt::CopyAction) || !parent.isValid()) { return false; } @@ -250,7 +250,15 @@ bool GroupModel::dropMimeData(const QMimeData* data, Qt::DropAction action, row--; } - dragGroup->setParent(parentGroup, row); + Group* group; + if (action == Qt::MoveAction) { + group = dragGroup; + } + else { + group = dragGroup->clone(); + } + + group->setParent(parentGroup, row); } else { if (row != -1) { @@ -272,7 +280,15 @@ bool GroupModel::dropMimeData(const QMimeData* data, Qt::DropAction action, continue; } - dragEntry->setGroup(parentGroup); + Entry* entry; + if (action == Qt::MoveAction) { + entry = dragEntry; + } + else { + entry = dragEntry->clone(); + } + + entry->setGroup(parentGroup); } } diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp index a71ae5436..42a68036e 100644 --- a/src/gui/group/GroupView.cpp +++ b/src/gui/group/GroupView.cpp @@ -45,6 +45,7 @@ GroupView::GroupView(Database* db, QWidget* parent) setDragEnabled(true); viewport()->setAcceptDrops(true); setDropIndicatorShown(true); + setDefaultDropAction(Qt::MoveAction); } void GroupView::changeDatabase(Database* newDb) @@ -54,6 +55,13 @@ void GroupView::changeDatabase(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