Crates.io | undo_stack |
lib.rs | undo_stack |
version | |
source | src |
created_at | 2024-07-12 21:41:13.149306 |
updated_at | 2024-07-15 00:32:36.241314 |
description | A minimal undo stack for user defined types |
homepage | |
repository | https://github.com/chipmusic/undo_stack |
max_upload_size | |
id | 1301579 |
size | 0 |
Work in Progress. Currently does not work outside project it was created for. A Minimalistic Undo/Redo library created for personal projects. Use at your own risk!
Whenever your application data changes to a new value, you can push the old value into the UndoStack using the UndoStack::push
method. Calling UndoStack::undo
will walk through the stack returning past_stack values, but possible values above the current position are still available via the UndoStack::redo
method, which will cause the stack to walk back into the present.
Calling undo and then pushing a new value clears the redo stack, since history was rewritten and now the future_stack state will be different.
When calling undo and redo, the restored values are automatically restored to an associated Project type (the struct containing the data) via the Undoable
trait, which simply contains a "restore" method where you must provide a way for the restored value to be re-applied to the Project type.
A common case in applications with GUIs is a value that needs to be udpdated continuously on the screen while the user interacts with it (i.e. dragging a slider), but only its initial state and final will be used for undo purposes.
You can easily achieve this using the UndoStack::start_buffer
and UndoStack::commit_buffer
methods at the beginning and end of the user interaction, instead of "push". The final state is only used to compare with the initial state, and nothing is actually stored if they're the same.
I created this crate for personal use, and to satisfy a few requirements I wished for:
Please download the repo and run "cargo run -p example" at the project root for a simple demonstration. The example is located under the "example" subfolder.