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