diff options
author | valadaptive <79560998+valadaptive@users.noreply.github.com> | 2024-04-21 06:23:59 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-21 12:23:59 +0200 |
commit | d68c8d70aa1dd5c44bd1a83a9f6aa8247e7c5c3b (patch) | |
tree | f1b9978098052e560dca29401c158bb54764028e | |
parent | d2c426924039fbd8b73be51dea01a5db0911238c (diff) |
Add a way to specify Undoer settings and construct Undoers more easily (#4357)
<!--
Please read the "Making a PR" section of
[`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md)
before opening a Pull Request!
* Keep your PR:s small and focused.
* The PR title is what ends up in the changelog, so make it descriptive!
* If applicable, add a screenshot or gif.
* If it is a non-trivial addition, consider adding a demo for it to
`egui_demo_lib`, or a new example.
* Do NOT open PR:s from your `master` branch, as that makes it hard for
maintainers to add commits to your PR.
* Remember to run `cargo fmt` and `cargo cranky`.
* Open the PR as a draft until you have self-reviewed it and run
`./scripts/check.sh`.
* When you have addressed a PR comment, mark it as resolved.
Please be patient! I will review your PR, but my time is limited!
-->
* Closes https://github.com/emilk/egui/issues/4356
- Add `Undoer::new()`
- This is necessary to construct an `Undoer` whose `State` parameter
doesn't implement `Default`.
- Add `Undoer::with_settings(...)`
- This is necessary to actually pass settings into the `Undoer`. Without
this, API consumers could construct their own `Settings` but not
actually do anything with it.
I've refrained from adding any kind of builder API for `Settings`
because there are only three options and I don't want to duplicate or
move all the documentation onto the builder methods.
-rw-r--r-- | crates/egui/src/util/undoer.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/crates/egui/src/util/undoer.rs b/crates/egui/src/util/undoer.rs index de6d2716..d5f004f8 100644 --- a/crates/egui/src/util/undoer.rs +++ b/crates/egui/src/util/undoer.rs @@ -47,7 +47,7 @@ impl Default for Settings { /// /// Rule 1) will make sure an undo point is not created until you _stop_ dragging that slider. /// Rule 2) will make sure that you will get some undo points even if you are constantly changing the state. -#[derive(Clone, Default)] +#[derive(Clone)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct Undoer<State> { settings: Settings, @@ -77,6 +77,21 @@ impl<State> std::fmt::Debug for Undoer<State> { } } +impl<State> Default for Undoer<State> +where + State: Clone + PartialEq, +{ + #[inline] + fn default() -> Self { + Self { + settings: Settings::default(), + undos: VecDeque::new(), + redos: Vec::new(), + flux: None, + } + } +} + /// Represents how the current state is changing #[derive(Clone)] struct Flux<State> { @@ -89,6 +104,14 @@ impl<State> Undoer<State> where State: Clone + PartialEq, { + /// Create a new [`Undoer`] with the given [`Settings`]. + pub fn with_settings(settings: Settings) -> Self { + Self { + settings, + ..Default::default() + } + } + /// Do we have an undo point different from the given state? pub fn has_undo(&self, current_state: &State) -> bool { match self.undos.len() { |