use std::ptr::addr_of_mut; use mlua::{UserData, UserDataFields}; use self::log::LogState; pub mod editor; pub mod log; pub mod view; pub mod window; mod bar; #[derive(Debug, Default)] pub struct GlobalState { pub view: view::SheetViewState, pub editor: editor::EditorState, pub active_window: window::Window, pub log: log::LogState, pub exit: bool, } const DUMMY_STATE: GlobalState = GlobalState::new(); impl GlobalState { const fn new() -> Self { Self { view: view::SheetViewState::new(), editor: editor::EditorState::new(), log: LogState::new(), active_window: window::Window::View, exit: false, } } pub fn get() -> &'static mut Self { static mut GLOBAL_STATE: GlobalState = GlobalState::new(); unsafe { &mut *addr_of_mut!(GLOBAL_STATE) } } pub fn set_focus(&mut self, win: window::Window) { self.active_window = win; match win { window::Window::Editor => self.editor.visible = true, window::Window::Log => self.log.visible = true, _ => {} } } } impl UserData for GlobalState { fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("view", |_, _| Ok(DUMMY_STATE.view)); fields.add_field_function_get("editor", |_, _| Ok(DUMMY_STATE.editor)); fields.add_field_function_get("log", |_, _| Ok(DUMMY_STATE.log)); fields.add_field_function_get("active_window", |_, _| { Ok(GlobalState::get().active_window) }); fields.add_field_function_set("active_window", |_, _, win: window::Window| { GlobalState::get().set_focus(win); Ok(()) }); } fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_function("quit", |_, _: ()| { GlobalState::get().exit = true; Ok(()) }) } }