use mlua::{IntoLua, UserData}; use ratatui::style::Color; use crate::{config::{evalsto::EvalTo, GlobalConfig}, sheet::cell::CellRef}; use super::style::Style; #[derive(Debug, Clone)] pub struct SheetViewTheme { pub cursor: Style, pub selection: Style, pub cell: EvalTo, } impl SheetViewTheme { pub const fn new() -> Self { Self { cursor: Style::new().fg(Color::Black).bg(Color::White), selection: Style::new().fg(Color::White).bg(Color::DarkGray), cell: EvalTo::Value(Style::new().fg(Color::White).bg(Color::Black)), } } } 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: Style| { cfg_mut!().cursor = pair; Ok(()) }); fields.add_field_function_get("selection", |_, _| Ok(cfg!().selection.clone())); fields.add_field_function_set("selection", |_, _, pair: Style| { cfg_mut!().selection = pair; Ok(()) }); fields.add_field_function_get("cell", |lua, _| { Ok(cfg!().cell.clone().into_lua(lua)?) }); fields.add_field_function_set("cell", |_, _, cell: EvalTo| { cfg_mut!().cell = cell; Ok(()) }); } }