tui/modal.rs
1//! Modal overlay types.
2//!
3//! The TUI keeps a LIFO stack of modals via [`crate::overlay::OverlayStack`].
4//! The topmost modal owns keyboard focus and is rendered on top of the current
5//! tab. Each modal carries a [`KeyPolicy`] that the keymap resolver uses to
6//! decide whether `q` closes the overlay or inserts a literal character.
7
8pub use crate::form::Form;
9
10#[cfg(test)]
11mod tests;
12
13/// Keyboard handling policy for an overlay.
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum KeyPolicy {
16 /// Display overlay (Help, Confirm): both `q` and `Esc` close.
17 Display,
18 /// Input overlay (Form): `Esc` closes; `q` inserts literally.
19 Input,
20}
21
22/// Action to execute when a confirm overlay is accepted with `y` or Enter.
23#[derive(Debug)]
24pub enum ConfirmAction {
25 DeleteTransaction(String),
26}
27
28/// Anything renderable as an overlay. Kept as an enum rather than a trait
29/// object so modal state stays `Debug` and survives through the [`crate::overlay::OverlayStack`].
30#[derive(Debug)]
31pub enum Modal {
32 Form(Form),
33 Help,
34 Confirm {
35 prompt: String,
36 action: ConfirmAction,
37 },
38}
39
40impl Modal {
41 /// Key handling policy for this overlay variant.
42 #[must_use]
43 pub fn key_policy(&self) -> KeyPolicy {
44 match self {
45 Modal::Help | Modal::Confirm { .. } => KeyPolicy::Display,
46 Modal::Form(_) => KeyPolicy::Input,
47 }
48 }
49}