pub(crate) mod cinematic;
mod draw;
pub(crate) mod files;
mod geometry;
pub(crate) mod loading;
pub(crate) use draw::place;
pub(crate) use geometry::{Layout, Mode, hit_test};
use super::hud_ids::{hud_ids, panel_base};
use super::panels::registry::PanelKey;
pub(crate) const POOL: usize = 24;
hud_ids! {
base: panel_base(PanelKey::Worlds);
sprites: [
pub(crate) PANEL_BG,
pub(crate) CLOSE_BG,
pub(crate) NEW_BG,
pub(crate) row_bg[POOL],
pub(crate) LIST_TRACK,
pub(crate) LIST_THUMB,
pub(crate) DOT_BG,
pub(crate) DOT1,
pub(crate) DOT2,
pub(crate) DOT3,
pub(crate) MENU_BG,
pub(crate) MENU_OPEN_BG,
pub(crate) MENU_DELETE_BG,
];
labels: [
pub(crate) TITLE_LABEL,
pub(crate) CLOSE_LABEL,
pub(crate) NEW_LABEL,
pub(crate) STATUS_LABEL,
pub(crate) LIST_HEADER,
pub(crate) row_label[POOL],
pub(crate) MENU_OPEN_LABEL,
pub(crate) MENU_DELETE_LABEL,
];
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct WorldRow {
pub name: String,
pub path: String,
pub open: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum WorldTarget {
Open(String),
Untitled,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum WorldsConfirm {
Delete(String),
Save(WorldTarget),
Discard(WorldTarget),
}
pub(crate) struct WorldsView<'a> {
pub rows: &'a [WorldRow],
pub scroll: usize,
pub layout: Layout,
pub selected: Option<usize>,
pub previewing: Option<usize>,
pub menu: Option<usize>,
pub status: Option<&'a str>,
pub mouse: [f32; 2],
}
impl WorldsView<'_> {
pub(crate) fn slot_of(&self, i: usize) -> Option<usize> {
let slot = i.checked_sub(self.scroll)?;
(slot < self.layout.rows() && i < self.rows.len()).then_some(slot)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum WorldsAction {
New,
Select(usize),
Open(usize),
OpenMenu(usize),
Delete(usize),
CloseMenu,
Consume,
}