input: Grouping input history to avoid IME placeholder. (#1375)
This commit is contained in:
parent
e56c7a39bf
commit
889382cba1
2 changed files with 16 additions and 4 deletions
|
|
@ -27,6 +27,7 @@ pub struct History<I: HistoryItem> {
|
||||||
pub(crate) ignore: bool,
|
pub(crate) ignore: bool,
|
||||||
max_undo: usize,
|
max_undo: usize,
|
||||||
group_interval: Option<Duration>,
|
group_interval: Option<Duration>,
|
||||||
|
grouping: bool,
|
||||||
unique: bool,
|
unique: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,6 +44,7 @@ where
|
||||||
version: 0,
|
version: 0,
|
||||||
max_undo: 1000,
|
max_undo: 1000,
|
||||||
group_interval: None,
|
group_interval: None,
|
||||||
|
grouping: false,
|
||||||
unique: false,
|
unique: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -66,10 +68,20 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Start grouping changes, this will prevent the version from being incremented until `end_grouping` is called.
|
||||||
|
pub fn start_grouping(&mut self) {
|
||||||
|
self.grouping = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// End grouping changes, this will allow the version to be incremented again.
|
||||||
|
pub fn end_grouping(&mut self) {
|
||||||
|
self.grouping = false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Increment the version number if the last change was made more than `GROUP_INTERVAL` milliseconds ago.
|
/// Increment the version number if the last change was made more than `GROUP_INTERVAL` milliseconds ago.
|
||||||
fn inc_version(&mut self) -> usize {
|
fn inc_version(&mut self) -> usize {
|
||||||
let t = Instant::now();
|
let t = Instant::now();
|
||||||
if Some(self.last_changed_at.elapsed()) > self.group_interval {
|
if !self.grouping && Some(self.last_changed_at.elapsed()) > self.group_interval {
|
||||||
self.version += 1;
|
self.version += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1579,7 +1579,6 @@ impl InputState {
|
||||||
}
|
}
|
||||||
|
|
||||||
let old_text = text.slice(range.clone()).to_string();
|
let old_text = text.slice(range.clone()).to_string();
|
||||||
|
|
||||||
let new_range = range.start..range.start + new_text.len();
|
let new_range = range.start..range.start + new_text.len();
|
||||||
|
|
||||||
self.history
|
self.history
|
||||||
|
|
@ -2150,6 +2149,7 @@ impl EntityInputHandler for InputState {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.push_history(&old_text, &range, &new_text);
|
self.push_history(&old_text, &range, &new_text);
|
||||||
|
self.history.end_grouping();
|
||||||
if let Some(diagnostics) = self.mode.diagnostics_mut() {
|
if let Some(diagnostics) = self.mode.diagnostics_mut() {
|
||||||
diagnostics.reset(&self.text)
|
diagnostics.reset(&self.text)
|
||||||
}
|
}
|
||||||
|
|
@ -2205,7 +2205,6 @@ impl EntityInputHandler for InputState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.push_history(&old_text, &range, new_text);
|
|
||||||
if let Some(diagnostics) = self.mode.diagnostics_mut() {
|
if let Some(diagnostics) = self.mode.diagnostics_mut() {
|
||||||
diagnostics.reset(&self.text)
|
diagnostics.reset(&self.text)
|
||||||
}
|
}
|
||||||
|
|
@ -2228,7 +2227,8 @@ impl EntityInputHandler for InputState {
|
||||||
.into();
|
.into();
|
||||||
}
|
}
|
||||||
self.mode.update_auto_grow(&self.text_wrapper);
|
self.mode.update_auto_grow(&self.text_wrapper);
|
||||||
cx.emit(InputEvent::Change);
|
self.history.start_grouping();
|
||||||
|
self.push_history(&old_text, &range, new_text);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue