Skip to content

Undo and History

In this example, we will show you how to use the CreativeEditor SDK’s CreativeEngine to undo and redo steps in the editor API.

Functions

public func createHistory() -> History

Create a history which consists of an undo/redo stack for editing operations. There can be multiple. But only one can be active at a time.

  • Returns: The handle to the created history.
public func destroyHistory(_ history: History)

Destroy the given history, returns an error if the handle doesn’t refer to a history.

  • history:: The history to be destroyed.
public func setActiveHistory(_ history: History)

Mark the given history as active, returns an error if the handle doesn’t refer to a history. All other histories get cleared from the active state. Undo/redo operations only apply to the active history.

  • history:: The history to be marked as active.
public func getActiveHistory() -> History

Get the handle to the currently active history. If there’s none it will be created.

  • Returns: The handle to the active history.
public func addUndoStep() throws

Adds a new history state to the stack, if undoable changes were made.

public func undo() throws

Undo one step in the history if an undo step is available.

public func canUndo() throws -> Bool

If an undo step is available.

  • Returns: true if an undo step is available.
public func redo() throws

Redo one step in the history if a redo step is available.

public func canRedo() throws -> Bool

If a redo step is available.

  • Returns: true if a redo step is available.
public var onHistoryUpdated: AsyncStream<Void> { get }

Subscribe to changes to the undo/redo history.

Full Code

Here’s the full code:

// Manage history stacks
let newHistory = engine.editor.createHistory()
let oldHistory = engine.editor.getActiveHistory()
engine.editor.setActiveHistory(newHistory)
engine.editor.destroyHistory(oldHistory)
let historyTask = Task {
for await _ in engine.editor.onHistoryUpdated {
let canUndo = try engine.editor.canUndo()
let canRedo = try engine.editor.canRedo()
print("History updated: \(canUndo) \(canRedo)")
}
}
// Push a new state to the undo stack
try engine.editor.addUndoStep()
// Perform an undo, if possible.
if try engine.editor.canUndo() {
try engine.editor.undo()
}
// Perform a redo, if possible.
if try engine.editor.canRedo() {
try engine.editor.redo()
}