use mlua::{IntoLua, Table, UserData}; use ratatui::style::Color; use crate::config::GlobalConfig; use super::colorpair::ColorPair; #[derive(Clone)] pub struct SheetViewTheme { pub cursor: ColorPair, pub selection: ColorPair, pub cell: (ColorPair, ColorPair), } impl SheetViewTheme { pub const fn new() -> Self { Self { cursor: ColorPair::new(Color::Black, Color::White), selection: ColorPair::new(Color::White, Color::DarkGray), cell: ( ColorPair::new(Color::White, Color::Black), ColorPair::new(Color::White, Color::DarkGray), ), } } } macro_rules! cfg { () => { GlobalConfig::instance().theme.sheetview }; } macro_rules! cfg_mut { () => { GlobalConfig::instance_mut().theme.sheetview }; } impl UserData for SheetViewTheme { fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("cursor", |_, _| Ok(cfg!().cursor.clone())); fields.add_field_function_set("cursor", |_, _, pair: ColorPair| { cfg_mut!().cursor = pair; Ok(()) }); fields.add_field_function_get("selection", |_, _| Ok(cfg!().selection.clone())); fields.add_field_function_set("selection", |_, _, pair: ColorPair| { cfg_mut!().selection = pair; Ok(()) }); fields.add_field_function_get("cell", |lua, _| { let table = lua.create_table()?; let sel = cfg!().cell.clone(); table.set(1, sel.0)?; table.set(2, sel.1)?; Ok(table.into_lua(lua)?) }); fields.add_field_function_set("cell", |_, _, pair: Table| { cfg_mut!().cell = (pair.get(1)?, pair.get(2)?); Ok(()) }); } }