//! Shared modal content and binding presentation. use hexwork_term::remap::{Action, Keymap}; use hexwork_ui::inventory::{BrowserBindings, render_browser}; use hexwork_ui::transfer::{TransferPromptBindings, TransferPromptKind, render_transfer_prompt}; use crate::app::{InventoryBrowserSnapshot, TransferPromptSnapshot}; pub fn binding_label(keymap: &Keymap, action: Action, fallback: &str) -> String { keymap.primary_binding_label(action).unwrap_or_else(|| fallback.to_owned()) } pub fn inventory_browser_bindings(keymap: &Keymap) -> BrowserBindings { BrowserBindings { up: binding_label(keymap, Action::Up, "up action"), down: binding_label(keymap, Action::Down, "down action"), left: binding_label(keymap, Action::Left, "left action"), right: binding_label(keymap, Action::Right, "right action"), inspect: binding_label(keymap, Action::Confirm, "confirm action"), wield: None, identify: None, back: binding_label(keymap, Action::Look, "look action"), close: binding_label(keymap, Action::Inventory, "inventory action"), quit: binding_label(keymap, Action::Quit, "quit action"), picks: std::array::from_fn(|slot| binding_label(keymap, Action::ChargenPick(slot), "unavailable")), } } pub fn transfer_prompt_bindings(keymap: &Keymap, kind: TransferPromptKind) -> TransferPromptBindings { TransferPromptBindings { previous: binding_label(keymap, Action::Up, "up action"), next: binding_label(keymap, Action::Down, "down action"), confirm: binding_label(keymap, Action::Confirm, "confirm action"), quit: binding_label(keymap, Action::Quit, "quit action"), originating_action: match kind { TransferPromptKind::Pickup => keymap.primary_binding_label(Action::Pickup), TransferPromptKind::Drop => keymap.primary_binding_label(Action::Drop), TransferPromptKind::Wield | TransferPromptKind::TinkerIdentify { .. } => None, }, } } pub fn modal_rows(prompt: Option<&TransferPromptSnapshot>, browser: Option<&InventoryBrowserSnapshot>, keymap: &Keymap) -> Option> { if let Some(prompt) = prompt { return Some(render_transfer_prompt(&prompt.content, &transfer_prompt_bindings(keymap, prompt.content.kind), &prompt.layout)); } browser.map(|browser| { let mut bindings = inventory_browser_bindings(keymap); if browser.content.can_wield_selected { bindings.wield = keymap.primary_binding_label(Action::Confirm); } if browser.content.tinker.as_ref().is_some_and(|t| t.selected_eligible) { bindings.identify = keymap.primary_binding_label(Action::Confirm); } render_browser(&browser.content, &bindings, &browser.layout) }) }