use super::*;
impl App {
pub fn set_message(&mut self, msg: impl Into<String>) {
self.set_message_inner(msg, MessageType::Info, Some(MESSAGE_TTL_INFO));
}
pub fn set_warning(&mut self, msg: impl Into<String>) {
self.set_message_inner(msg, MessageType::Warning, Some(MESSAGE_TTL_WARNING));
}
pub fn set_error(&mut self, msg: impl Into<String>) {
self.set_message_inner(msg, MessageType::Error, None);
}
pub fn set_sticky_warning(&mut self, msg: impl Into<String>) {
self.set_message_inner(msg, MessageType::Warning, None);
}
fn set_message_inner(
&mut self,
msg: impl Into<String>,
message_type: MessageType,
ttl: Option<Duration>,
) {
self.message = Some(Message {
content: msg.into(),
message_type,
expires_at: ttl.map(|d| Instant::now() + d),
});
}
pub fn clear_expired_message(&mut self) -> bool {
let expired = self
.message
.as_ref()
.and_then(|m| m.expires_at)
.is_some_and(|t| Instant::now() >= t);
if expired {
self.message = None;
}
expired
}
pub fn enter_command_mode(&mut self) {
self.input_mode = InputMode::Command;
self.command_buffer.clear();
self.command_completion = None;
}
pub fn exit_command_mode(&mut self) {
self.input_mode = InputMode::Normal;
self.command_buffer.clear();
self.command_completion = None;
}
pub fn enter_search_mode(&mut self) {
self.search_return_mode = self.input_mode;
self.input_mode = InputMode::Search;
self.search_buffer.clear();
}
pub fn exit_search_mode(&mut self) {
self.input_mode = self.search_return_mode;
self.search_buffer.clear();
}
pub fn searching_help(&self) -> bool {
self.input_mode == InputMode::Search && self.search_return_mode == InputMode::Help
}
pub fn toggle_help(&mut self) {
if self.input_mode == InputMode::Help {
self.input_mode = InputMode::Normal;
} else {
self.input_mode = InputMode::Help;
self.help_state.scroll_offset = 0;
}
}
pub fn help_scroll_down(&mut self, lines: usize) {
let max_offset = self
.help_state
.total_lines
.saturating_sub(self.help_state.viewport_height);
self.help_state.scroll_offset = (self.help_state.scroll_offset + lines).min(max_offset);
}
pub fn help_scroll_up(&mut self, lines: usize) {
self.help_state.scroll_offset = self.help_state.scroll_offset.saturating_sub(lines);
}
pub fn help_scroll_to_top(&mut self) {
self.help_state.scroll_offset = 0;
}
pub fn help_scroll_to_bottom(&mut self) {
let max_offset = self
.help_state
.total_lines
.saturating_sub(self.help_state.viewport_height);
self.help_state.scroll_offset = max_offset;
}
pub fn enter_confirm_mode(&mut self, action: ConfirmAction) {
self.input_mode = InputMode::Confirm;
self.pending_confirm = Some(action);
}
pub fn exit_confirm_mode(&mut self) {
self.input_mode = InputMode::Normal;
self.pending_confirm = None;
}
}