use std::sync::Arc;
use crate::mutex::Mutex;
use crate::{
Context, Id,
text_selection::{CCursorRange, TextCursorState},
};
pub type TextEditUndoer = crate::util::undoer::Undoer<(CCursorRange, String)>;
#[derive(Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct TextEditState {
pub cursor: TextCursorState,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) undoer: Arc<Mutex<TextEditUndoer>>,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) ime_enabled: bool,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) ime_cursor_range: CCursorRange,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) singleline_offset: f32,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) last_interaction_time: f64,
}
impl TextEditState {
pub fn load(ctx: &Context, id: Id) -> Option<Self> {
ctx.data_mut(|d| d.get_persisted(id))
}
pub fn store(self, ctx: &Context, id: Id) {
ctx.data_mut(|d| d.insert_persisted(id, self));
}
pub fn undoer(&self) -> TextEditUndoer {
self.undoer.lock().clone()
}
#[expect(clippy::needless_pass_by_ref_mut)] pub fn set_undoer(&mut self, undoer: TextEditUndoer) {
*self.undoer.lock() = undoer;
}
pub fn clear_undoer(&mut self) {
self.set_undoer(TextEditUndoer::default());
}
}