mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Set previous parent group during a move or a deletion
This commit is contained in:
@@ -31,41 +31,47 @@ class DeleteNodesRunnable(context: Context,
|
||||
afterActionNodesFinish: AfterActionNodesFinish)
|
||||
: ActionNodeDatabaseRunnable(context, database, afterActionNodesFinish, save) {
|
||||
|
||||
private var mParent: Group? = null
|
||||
private var mOldParent: Group? = null
|
||||
private var mCanRecycle: Boolean = false
|
||||
|
||||
private var mNodesToDeleteBackup = ArrayList<Node>()
|
||||
|
||||
override fun nodeAction() {
|
||||
|
||||
foreachNode@ for(currentNode in mNodesToDelete) {
|
||||
mParent = currentNode.parent
|
||||
mParent?.touch(modified = false, touchParents = true)
|
||||
foreachNode@ for(nodeToDelete in mNodesToDelete) {
|
||||
mOldParent = nodeToDelete.parent
|
||||
mOldParent?.touch(modified = false, touchParents = true)
|
||||
|
||||
when (currentNode.type) {
|
||||
when (nodeToDelete.type) {
|
||||
Type.GROUP -> {
|
||||
val groupToDelete = nodeToDelete as Group
|
||||
// Create a copy to keep the old ref and remove it visually
|
||||
mNodesToDeleteBackup.add(Group(currentNode as Group))
|
||||
mNodesToDeleteBackup.add(Group(groupToDelete))
|
||||
// Remove Node from parent
|
||||
mCanRecycle = database.canRecycle(currentNode)
|
||||
mCanRecycle = database.canRecycle(groupToDelete)
|
||||
if (mCanRecycle) {
|
||||
database.recycle(currentNode, context.resources)
|
||||
groupToDelete.touch(modified = false, touchParents = true)
|
||||
database.recycle(groupToDelete, context.resources)
|
||||
groupToDelete.setPreviousParentGroup(mOldParent)
|
||||
} else {
|
||||
database.deleteGroup(currentNode)
|
||||
database.deleteGroup(groupToDelete)
|
||||
}
|
||||
}
|
||||
Type.ENTRY -> {
|
||||
val entryToDelete = nodeToDelete as Entry
|
||||
// Create a copy to keep the old ref and remove it visually
|
||||
mNodesToDeleteBackup.add(Entry(currentNode as Entry))
|
||||
mNodesToDeleteBackup.add(Entry(entryToDelete))
|
||||
// Remove Node from parent
|
||||
mCanRecycle = database.canRecycle(currentNode)
|
||||
mCanRecycle = database.canRecycle(entryToDelete)
|
||||
if (mCanRecycle) {
|
||||
database.recycle(currentNode, context.resources)
|
||||
entryToDelete.touch(modified = false, touchParents = true)
|
||||
database.recycle(entryToDelete, context.resources)
|
||||
entryToDelete.setPreviousParentGroup(mOldParent)
|
||||
} else {
|
||||
database.deleteEntry(currentNode)
|
||||
database.deleteEntry(entryToDelete)
|
||||
}
|
||||
// Remove the oldest attachments
|
||||
currentNode.getAttachments(database.attachmentPool).forEach {
|
||||
entryToDelete.getAttachments(database.attachmentPool).forEach {
|
||||
database.removeAttachmentIfNotUsed(it)
|
||||
}
|
||||
}
|
||||
@@ -76,7 +82,7 @@ class DeleteNodesRunnable(context: Context,
|
||||
override fun nodeFinish(): ActionNodesValues {
|
||||
if (!result.isSuccess) {
|
||||
if (mCanRecycle) {
|
||||
mParent?.let {
|
||||
mOldParent?.let {
|
||||
mNodesToDeleteBackup.forEach { backupNode ->
|
||||
when (backupNode.type) {
|
||||
Type.GROUP -> {
|
||||
|
||||
@@ -52,8 +52,9 @@ class MoveNodesRunnable constructor(
|
||||
// and if not in the current group
|
||||
&& groupToMove != mNewParent
|
||||
&& !mNewParent.isContainedIn(groupToMove)) {
|
||||
nodeToMove.touch(modified = true, touchParents = true)
|
||||
groupToMove.touch(modified = true, touchParents = true)
|
||||
database.moveGroupTo(groupToMove, mNewParent)
|
||||
groupToMove.setPreviousParentGroup(mOldParent)
|
||||
} else {
|
||||
// Only finish thread
|
||||
setError(MoveGroupDatabaseException())
|
||||
@@ -66,8 +67,9 @@ class MoveNodesRunnable constructor(
|
||||
if (mOldParent != mNewParent
|
||||
// and root can contains entry
|
||||
&& (mNewParent != database.rootGroup || database.rootCanContainsEntry())) {
|
||||
nodeToMove.touch(modified = true, touchParents = true)
|
||||
entryToMove.touch(modified = true, touchParents = true)
|
||||
database.moveEntryTo(entryToMove, mNewParent)
|
||||
entryToMove.setPreviousParentGroup(mOldParent)
|
||||
} else {
|
||||
// Only finish thread
|
||||
setError(MoveEntryDatabaseException())
|
||||
|
||||
@@ -121,11 +121,13 @@ class Entry : Node, EntryVersionedInterface<Group> {
|
||||
entryKDBX?.tags = value
|
||||
}
|
||||
|
||||
var previousParentGroup: UUID
|
||||
var previousParentGroup: UUID = DatabaseVersioned.UUID_ZERO
|
||||
get() = entryKDBX?.previousParentGroup ?: DatabaseVersioned.UUID_ZERO
|
||||
set(value) {
|
||||
entryKDBX?.previousParentGroup = value
|
||||
}
|
||||
private set
|
||||
|
||||
fun setPreviousParentGroup(previousParent: Group?) {
|
||||
entryKDBX?.previousParentGroup = previousParent?.groupKDBX?.id ?: DatabaseVersioned.UUID_ZERO
|
||||
}
|
||||
|
||||
override val type: Type
|
||||
get() = Type.ENTRY
|
||||
|
||||
@@ -141,11 +141,13 @@ class Group : Node, GroupVersionedInterface<Group, Entry> {
|
||||
groupKDBX?.tags = value
|
||||
}
|
||||
|
||||
var previousParentGroup: UUID
|
||||
var previousParentGroup: UUID = DatabaseVersioned.UUID_ZERO
|
||||
get() = groupKDBX?.previousParentGroup ?: DatabaseVersioned.UUID_ZERO
|
||||
set(value) {
|
||||
groupKDBX?.previousParentGroup = value
|
||||
}
|
||||
private set
|
||||
|
||||
fun setPreviousParentGroup(previousParent: Group?) {
|
||||
groupKDBX?.previousParentGroup = previousParent?.groupKDBX?.id ?: DatabaseVersioned.UUID_ZERO
|
||||
}
|
||||
|
||||
override val type: Type
|
||||
get() = Type.GROUP
|
||||
|
||||
Reference in New Issue
Block a user