The undo/redo module provides support for undo/redo operations.

Enabling the module

To enable the plotting module, you can either hard-code the USE_UNDO_MODULE option in your CMakeLists.txt file by finding the following line:

option(USE_UNDO_MODULE "Use the undo module" OFF)

and modifying the line to look like this

option(USE_UNDO_MODULE "Use the undo module" ON)

Alternatively, you can also generate your project files using CMake options by running the following CMake command:


Finally, update your uvproj.yaml so that the undo_redo key under enabled-modules is set to true like this:

name: "MyProject"
version: ""
engine-version: ""
  undo_redo: true

Next, in your source file, include the Modules.hpp header in your components like this:

#include <Modules/Modules.hpp>

Event safety

The entire module is flagged as event safe at Post-begin.

Using the Undo/Redo module

The module stores data in the Transaction data type, as can be seen below:

struct UIMGUI_PUBLIC_API Transaction
    std::function<void(TransactionPayload&)> undofunc;
    std::function<void(TransactionPayload&)> redofunc;
    TransactionPayload payload;

The 2 functions are the events to be called on undo and redo, respectively.

The payload member is of type TransactionPayload which is a simple struct storing a void* for a buffer and its size like this:

struct UIMGUI_PUBLIC_API TransactionPayload
    void* payload;
    size_t size;

So to push a transaction create a transaction, initialize the events and the payload and push it as an argument to the push function like this:

Transaction transaction = 
    .undofunc = [](TransactionPayload&){ Logger::log("Undo", UVKLog::UVK_LOG_TYPE_NOTE); },
    .redofunc = [](TransactionPayload&){ Logger::log("Redo", UVKLog::UVK_LOG_TYPE_NOTE); },
    .payload = 
        .payload = nullptr,
        .size = 0,


And now you have added an action that can be undone.

To undo or redo an action, simply call the undo or redo member functions of the StateTracker class like this:


and you should get the appropriate output logged to the console.

Checking for the module

To check for the module at compile time, use the UIMGUI_UNDO_MODULE_ENABLED macro.

At runtime, use the undo_redo public boolean constant member of ModulesManager.