diff --git a/crates/egui_demo_lib/src/demo/demo_app_windows.rs b/crates/egui_demo_lib/src/demo/demo_app_windows.rs index b0b8747dff36..8856d695a6f5 100644 --- a/crates/egui_demo_lib/src/demo/demo_app_windows.rs +++ b/crates/egui_demo_lib/src/demo/demo_app_windows.rs @@ -44,6 +44,7 @@ impl Default for Demos { Box::::default(), Box::::default(), Box::::default(), + Box::::default(), Box::::default(), Box::::default(), ]) diff --git a/crates/egui_demo_lib/src/demo/mod.rs b/crates/egui_demo_lib/src/demo/mod.rs index 921a145f5d28..a010f6703055 100644 --- a/crates/egui_demo_lib/src/demo/mod.rs +++ b/crates/egui_demo_lib/src/demo/mod.rs @@ -32,6 +32,7 @@ pub mod text_edit; pub mod text_layout; pub mod toggle_switch; pub mod tooltips; +pub mod undo_redo; pub mod widget_gallery; pub mod window_options; diff --git a/crates/egui_demo_lib/src/demo/undo_redo.rs b/crates/egui_demo_lib/src/demo/undo_redo.rs new file mode 100644 index 000000000000..525e26c6f59f --- /dev/null +++ b/crates/egui_demo_lib/src/demo/undo_redo.rs @@ -0,0 +1,78 @@ +use egui::{util::undoer::Undoer, Button}; + +#[derive(Debug, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", serde(default))] +pub struct State { + pub toggle_value: bool, + pub text: String, +} + +impl Default for State { + fn default() -> Self { + Self { + toggle_value: Default::default(), + text: "Text with undo/redo".to_owned(), + } + } +} + +/// Showcase [`egui::util::undoer::Undoer`] +#[derive(Debug, Default)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", serde(default))] +pub struct UndoRedoDemo { + pub state: State, + pub undoer: Undoer, +} + +impl crate::Demo for UndoRedoDemo { + fn name(&self) -> &'static str { + "⟲ Undo Redo" + } + + fn show(&mut self, ctx: &egui::Context, open: &mut bool) { + egui::Window::new(self.name()) + .open(open) + .resizable(false) + .show(ctx, |ui| { + use crate::View as _; + self.ui(ui); + }); + } +} + +impl crate::View for UndoRedoDemo { + fn ui(&mut self, ui: &mut egui::Ui) { + ui.vertical_centered(|ui| { + ui.add(crate::egui_github_link_file!()); + }); + + ui.checkbox(&mut self.state.toggle_value, "Checkbox with undo/redo"); + ui.text_edit_singleline(&mut self.state.text); + + ui.separator(); + + let can_undo = self.undoer.has_undo(&self.state); + let can_redo = self.undoer.has_redo(&self.state); + + ui.horizontal(|ui| { + let undo = ui.add_enabled(can_undo, Button::new("⟲ Undo")).clicked(); + let redo = ui.add_enabled(can_redo, Button::new("⟳ Redo")).clicked(); + + if undo { + if let Some(undo_text) = self.undoer.undo(&self.state) { + self.state = undo_text.clone(); + } + } + if redo { + if let Some(redo_text) = self.undoer.redo(&self.state) { + self.state = redo_text.clone(); + } + } + }); + + self.undoer + .feed_state(ui.ctx().input(|input| input.time), &self.state); + } +}