From 8fd70b1dc2cd009aad673254f65fccc0db7d9b1d Mon Sep 17 00:00:00 2001 From: LoganDark Date: Mon, 16 Oct 2023 18:05:26 -0700 Subject: [PATCH] add methods to manipulate TextEditState undoer This feels awful, @emilk why does this have to be an Arc? Should the Arc be replaced with a new one when set_undoer is called, or should it just replace the undoer inside the Arc? Closes #3436 --- crates/egui/src/widgets/text_edit/state.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/egui/src/widgets/text_edit/state.rs b/crates/egui/src/widgets/text_edit/state.rs index b4c408619f9..ef863eded2e 100644 --- a/crates/egui/src/widgets/text_edit/state.rs +++ b/crates/egui/src/widgets/text_edit/state.rs @@ -6,7 +6,7 @@ use crate::*; use super::{CCursorRange, CursorRange}; -type Undoer = crate::util::undoer::Undoer<(CCursorRange, String)>; +pub type TextEditUndoer = crate::util::undoer::Undoer<(CCursorRange, String)>; /// The text edit state stored between frames. /// @@ -42,7 +42,7 @@ pub struct TextEditState { /// Wrapped in Arc for cheaper clones. #[cfg_attr(feature = "serde", serde(skip))] - pub(crate) undoer: Arc>, + pub(crate) undoer: Arc>, // If IME candidate window is shown on this text edit. #[cfg_attr(feature = "serde", serde(skip))] @@ -81,6 +81,18 @@ impl TextEditState { self.ccursor_range = None; } + pub fn undoer(&self) -> TextEditUndoer { + self.undoer.lock().clone() + } + + pub fn set_undoer(&mut self, undoer: TextEditUndoer) { + *self.undoer.lock() = undoer; + } + + pub fn clear_undoer(&mut self) { + self.set_undoer(TextEditUndoer::default()); + } + pub fn cursor_range(&mut self, galley: &Galley) -> Option { self.cursor_range .map(|cursor_range| {