Support copying entries and groups using drag'n'drop.

Closes #74
This commit is contained in:
Felix Geyer 2013-04-07 12:36:53 +02:00
parent 701013baab
commit 317f603262
4 changed files with 32 additions and 5 deletions

View File

@ -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

View File

@ -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()));

View File

@ -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);
}
}

View File

@ -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