Improve cut and paste in Qt Quick GUI
This commit is contained in:
parent
71652bcab3
commit
cc78072ffc
|
@ -453,10 +453,9 @@ bool EntryModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int co
|
||||||
return push(make_unique<EntryModelMoveRowsCommand>(this, sourceParent, sourceRow, count, destinationParent, destinationChild));
|
return push(make_unique<EntryModelMoveRowsCommand>(this, sourceParent, sourceRow, count, destinationParent, destinationChild));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// check validation of specified arguments
|
// check validation of specified arguments: source and destination parent entries need to be node entries
|
||||||
if (!sourceParent.isValid() || !destinationParent.isValid() || sourceRow < 0 || count <= 0
|
if (!sourceParent.isValid() || !destinationParent.isValid() || sourceRow < 0 || count <= 0 || entry(sourceParent)->type() != EntryType::Node //
|
||||||
|| entry(sourceParent)->type() != EntryType::Node // source and destination parent entries
|
|| entry(destinationParent)->type() != EntryType::Node) {
|
||||||
|| entry(destinationParent)->type() != EntryType::Node) { // need to be node entries
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// determine the source parent entry and dest parent entry as node entries
|
// determine the source parent entry and dest parent entry as node entries
|
||||||
|
@ -470,11 +469,12 @@ bool EntryModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int co
|
||||||
}
|
}
|
||||||
// do not move a row to one of its own children! -> check before
|
// do not move a row to one of its own children! -> check before
|
||||||
for (int index = 0; index < count; ++index) {
|
for (int index = 0; index < count; ++index) {
|
||||||
Entry *toMove = srcParentEntry->children()[static_cast<size_t>(sourceRow + index)];
|
Entry *const toMove = srcParentEntry->children()[static_cast<size_t>(sourceRow + index)];
|
||||||
if (toMove->type() == EntryType::Node) {
|
if (toMove->type() != EntryType::Node) {
|
||||||
if (destParentEntry->isIndirectChildOf(static_cast<NodeEntry *>(toMove))) {
|
continue;
|
||||||
return false;
|
}
|
||||||
}
|
if (toMove == destParentEntry || destParentEntry->isIndirectChildOf(static_cast<NodeEntry *>(toMove))) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// actually perform the move operation
|
// actually perform the move operation
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
QModelIndex parent(const QModelIndex &child) const;
|
QModelIndex parent(const QModelIndex &child) const;
|
||||||
bool hasChildren(const QModelIndex &parent) const;
|
bool hasChildren(const QModelIndex &parent) const;
|
||||||
Q_INVOKABLE bool isNode(const QModelIndex &parent) const;
|
Q_INVOKABLE bool isNode(const QModelIndex &parent) const;
|
||||||
QVariant data(const QModelIndex &index, int role) const;
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||||
QMap<int, QVariant> itemData(const QModelIndex &index) const;
|
QMap<int, QVariant> itemData(const QModelIndex &index) const;
|
||||||
bool setData(const QModelIndex &index, const QVariant &value, int role);
|
bool setData(const QModelIndex &index, const QVariant &value, int role);
|
||||||
bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
|
bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
|
||||||
|
|
|
@ -22,7 +22,16 @@ Kirigami.ScrollablePage {
|
||||||
iconName: "edit-paste"
|
iconName: "edit-paste"
|
||||||
text: qsTr("Paste account")
|
text: qsTr("Paste account")
|
||||||
enabled: nativeInterface.canPaste
|
enabled: nativeInterface.canPaste
|
||||||
onTriggered: nativeInterface.pasteEntries(rootIndex)
|
onTriggered: {
|
||||||
|
var pastedEntries = nativeInterface.pasteEntries(rootIndex)
|
||||||
|
if (pastedEntries.length < 1) {
|
||||||
|
showPassiveNotification(
|
||||||
|
qsTr("Unable to paste the entries here"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var joinedEntryNames = pastedEntries.join(", ")
|
||||||
|
showPassiveNotification(qsTr("Pasted ") + joinedEntryNames)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
right: Kirigami.Action {
|
right: Kirigami.Action {
|
||||||
iconName: "folder-add"
|
iconName: "folder-add"
|
||||||
|
|
|
@ -113,28 +113,29 @@ void Controller::save()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Controller::pasteEntries(const QModelIndex &destinationParent, int row)
|
QStringList Controller::pasteEntries(const QModelIndex &destinationParent, int row)
|
||||||
{
|
{
|
||||||
if (m_cutEntries.isEmpty() || !m_entryModel.isNode(destinationParent)) {
|
if (m_cutEntries.isEmpty() || !m_entryModel.isNode(destinationParent)) {
|
||||||
return false;
|
return QStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (row < 0) {
|
if (row < 0) {
|
||||||
row = m_entryModel.rowCount(destinationParent);
|
row = m_entryModel.rowCount(destinationParent);
|
||||||
}
|
}
|
||||||
bool result = true;
|
|
||||||
|
QStringList successfullyMovedEntries;
|
||||||
|
successfullyMovedEntries.reserve(m_cutEntries.size());
|
||||||
for (const QPersistentModelIndex &cutIndex : m_cutEntries) {
|
for (const QPersistentModelIndex &cutIndex : m_cutEntries) {
|
||||||
if (m_entryModel.moveRows(cutIndex.parent(), cutIndex.row(), 1, destinationParent, row)) {
|
if (m_entryModel.moveRows(cutIndex.parent(), cutIndex.row(), 1, destinationParent, row)) {
|
||||||
|
successfullyMovedEntries << m_entryModel.data(m_entryModel.index(row, 0, destinationParent)).toString();
|
||||||
++row;
|
++row;
|
||||||
} else {
|
|
||||||
result = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the cut entries
|
// clear the cut entries
|
||||||
m_cutEntries.clear();
|
m_cutEntries.clear();
|
||||||
emit cutEntriesChanged(m_cutEntries);
|
emit cutEntriesChanged(m_cutEntries);
|
||||||
return true;
|
return successfullyMovedEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::resetFileStatus()
|
void Controller::resetFileStatus()
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
void setCutEntries(const QList<QPersistentModelIndex> &cutEntries);
|
void setCutEntries(const QList<QPersistentModelIndex> &cutEntries);
|
||||||
QString currentAccountName() const;
|
QString currentAccountName() const;
|
||||||
Q_INVOKABLE void cutEntry(const QModelIndex &entryIndex);
|
Q_INVOKABLE void cutEntry(const QModelIndex &entryIndex);
|
||||||
Q_INVOKABLE bool pasteEntries(const QModelIndex &destinationParent, int row = -1);
|
Q_INVOKABLE QStringList pasteEntries(const QModelIndex &destinationParent, int row = -1);
|
||||||
bool canPaste() const;
|
bool canPaste() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
Loading…
Reference in New Issue