feat: Add new system for multi-selections.

This commit is contained in:
2026-03-14 13:55:55 -04:00
parent f6f1efdf8e
commit 2e29dfc103
13 changed files with 930 additions and 63 deletions

View File

@@ -20,6 +20,7 @@ pub enum Mode {
#[default]
Insert,
Normal,
Visual,
}
/// A command the menu should process. Frontends and headless
@@ -37,6 +38,12 @@ pub enum Action {
HalfPageUp(usize),
HalfPageDown(usize),
SetMode(Mode),
ToggleSelect,
SelectRange { start: usize, end: usize },
ClearSelections,
SelectAll,
UndoSelection,
RedoSelection,
Confirm,
Quicklist,
Cancel,
@@ -53,7 +60,7 @@ pub enum Action {
#[derive(Debug, Clone)]
pub enum MenuEvent {
StateChanged(ViewState),
Selected(Value),
Selected(Vec<(Value, usize)>),
Quicklist(Vec<Value>),
Cancelled,
}
@@ -72,6 +79,8 @@ pub struct ViewState {
pub total_items: usize,
pub total_filtered: usize,
pub mode: Mode,
pub selection_count: usize,
pub multi_enabled: bool,
/// Monotonically increasing counter. Each call to
/// `build_view_state()` bumps this, so frontends can
/// detect duplicate broadcasts and skip redundant redraws.
@@ -87,6 +96,7 @@ pub struct VisibleItem {
pub label: String,
pub formatted_text: Option<String>,
pub index: usize,
pub selected: bool,
}
/// Final outcome of [`crate::menu::MenuRunner::run`]. The
@@ -94,7 +104,7 @@ pub struct VisibleItem {
#[must_use]
#[derive(Debug)]
pub enum MenuResult {
Selected { value: Value, index: usize },
Selected { items: Vec<(Value, usize)> },
Quicklist { items: Vec<(Value, usize)> },
Cancelled,
}