[Editor] Create basic undo/redo system

This commit is contained in:
2021-02-04 09:22:41 +01:00
parent db55743aed
commit d94e810977
5 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
package com.bartlomiejpluta.base.editor.command.model
interface Command {
fun execute()
}

View File

@@ -0,0 +1,21 @@
package com.bartlomiejpluta.base.editor.command.model
class SimpleCommand<T>(
override val commandName: String,
private val formerValue: T,
private val value: T,
private val execute: (T) -> Unit
) : Undoable, Command {
override fun undo() {
execute(formerValue)
}
override fun redo() {
execute()
}
override fun execute() {
execute(value)
}
}

View File

@@ -0,0 +1,7 @@
package com.bartlomiejpluta.base.editor.command.model
interface Undoable {
fun undo()
fun redo()
val commandName: String
}

View File

@@ -0,0 +1,61 @@
package com.bartlomiejpluta.base.editor.command.service
import com.bartlomiejpluta.base.editor.command.model.Undoable
import org.springframework.stereotype.Service
import java.util.*
@Service
class DefaultUndoRedoService : UndoRedoService {
private val undo: Deque<Undoable> = ArrayDeque()
private val redo: Deque<Undoable> = ArrayDeque()
override var sizeMax = 30
set(value) {
if(value >= 0) {
for(i in 0 until undo.size - value) {
undo.removeLast()
}
field = value
}
}
override fun push(undoable: Undoable) {
if(undo.size == sizeMax) {
undo.removeLast()
}
undo.push(undoable)
redo.clear()
}
override fun undo() {
if(undo.isNotEmpty()) {
undo.pop().let {
it.undo()
redo.push(it)
}
}
}
override fun redo() {
if(redo.isNotEmpty()) {
redo.pop().let {
it.redo()
undo.push(it)
}
}
}
override val lastUndoable: Undoable?
get() = undo.last
override val lastRedoable: Undoable?
get() = redo.last
override val undoCommandName: String
get() = undo.last?.commandName ?: ""
override val redoCommandName: String
get() = redo.last?.commandName ?: ""
}

View File

@@ -0,0 +1,15 @@
package com.bartlomiejpluta.base.editor.command.service
import com.bartlomiejpluta.base.editor.command.model.Undoable
interface UndoRedoService {
fun push(undoable: Undoable)
fun undo()
fun redo()
val lastUndoable: Undoable?
val lastRedoable: Undoable?
val undoCommandName: String
val redoCommandName: String
var sizeMax: Int
}