diff --git a/yazi-widgets/src/input/history.rs b/yazi-core/src/input/history.rs similarity index 92% rename from yazi-widgets/src/input/history.rs rename to yazi-core/src/input/history.rs index 40661b05..75d9c7cc 100644 --- a/yazi-widgets/src/input/history.rs +++ b/yazi-core/src/input/history.rs @@ -1,6 +1,6 @@ use std::{collections::VecDeque, mem}; -use super::InputSnaps; +use yazi_widgets::input::InputSnaps; // TODO: make configurable? const MAX_LENGTH: usize = 20; @@ -83,10 +83,7 @@ impl InputHistory { }; // Preserve mode and cursor position from before navigation - let snap = snaps.current_mut(); - snap.mode = mode; - snap.cursor = cursor.min(snap.count().saturating_sub(mode.delta())); - snap.resize(limit); + snaps.update_current(mode, cursor, limit); true } diff --git a/yazi-core/src/input/input.rs b/yazi-core/src/input/input.rs index f697321a..ed0c17c0 100644 --- a/yazi-core/src/input/input.rs +++ b/yazi-core/src/input/input.rs @@ -5,11 +5,12 @@ use yazi_config::popup::Position; use yazi_macro::{render, succ}; use yazi_shared::{data::Data, SStr}; use yazi_widgets::input::{InputOp, parser::HistoryOpt}; +use crate::input::InputHistory; #[derive(Default)] pub struct Input { pub(super) inner: yazi_widgets::input::Input, - pub history: std::collections::HashMap, + pub history: std::collections::HashMap, pub visible: bool, pub title: String, @@ -17,9 +18,9 @@ pub struct Input { } impl Input { - pub fn history(&mut self) -> &mut yazi_widgets::input::InputHistory { + pub fn history(&mut self) -> &mut InputHistory { if !self.history.contains_key(&self.inner.id) { - self.history.insert(self.inner.id.clone(), yazi_widgets::input::InputHistory::new()); + self.history.insert(self.inner.id.clone(), InputHistory::new()); } self.history.get_mut(&self.inner.id).unwrap() } diff --git a/yazi-core/src/input/mod.rs b/yazi-core/src/input/mod.rs index 9ad1aafa..29e51ec9 100644 --- a/yazi-core/src/input/mod.rs +++ b/yazi-core/src/input/mod.rs @@ -1 +1 @@ -yazi_macro::mod_flat!(input); +yazi_macro::mod_flat!(history input); diff --git a/yazi-widgets/src/input/mod.rs b/yazi-widgets/src/input/mod.rs index 265e2eea..dde2b4e8 100644 --- a/yazi-widgets/src/input/mod.rs +++ b/yazi-widgets/src/input/mod.rs @@ -1,3 +1,3 @@ yazi_macro::mod_pub!(actor parser); -yazi_macro::mod_flat!(event history input mode op option snap snaps widget); +yazi_macro::mod_flat!(event input mode op option snap snaps widget); diff --git a/yazi-widgets/src/input/snaps.rs b/yazi-widgets/src/input/snaps.rs index f54ca246..9ec261f8 100644 --- a/yazi-widgets/src/input/snaps.rs +++ b/yazi-widgets/src/input/snaps.rs @@ -77,4 +77,16 @@ impl InputSnaps { #[inline] pub(super) fn current_mut(&mut self) -> &mut InputSnap { &mut self.current } + + /// Updates the current snap. + /// + /// * `mode`: New mode to use. + /// * `cursor`: Cursor position. + /// * `limit`: New size of the snap. + pub fn update_current(&mut self, mode: InputMode, cursor: usize, limit: usize) { + let snap = self.current_mut(); + snap.mode = mode; + snap.cursor = cursor.min(snap.count().saturating_sub(mode.delta())); + snap.resize(limit); + } }