From d1492a10cdaf714074d29ad3366ab9c169d95b75 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 15:51:45 +0200 Subject: add bartheme and barstate to sheetview --- src/config/theme/bar.rs | 62 ++++++++++++++++++++++++++++++++ src/config/theme/mod.rs | 1 + src/config/theme/sheetview.rs | 66 ---------------------------------- src/config/theme/sheetview/bar.rs | 8 +++++ src/config/theme/sheetview/mod.rs | 74 +++++++++++++++++++++++++++++++++++++++ src/config/theme/style.rs | 6 +++- 6 files changed, 150 insertions(+), 67 deletions(-) create mode 100644 src/config/theme/bar.rs delete mode 100644 src/config/theme/sheetview.rs create mode 100644 src/config/theme/sheetview/bar.rs create mode 100644 src/config/theme/sheetview/mod.rs (limited to 'src/config') diff --git a/src/config/theme/bar.rs b/src/config/theme/bar.rs new file mode 100644 index 0000000..68a3b13 --- /dev/null +++ b/src/config/theme/bar.rs @@ -0,0 +1,62 @@ +macro_rules! BarTheme { + ($name:ident, $cfg:expr, $cfg_mut:expr) => { + use crate::config::theme::style::Style; + use crate::lua::evalsto::EvalTo; + use crate::state::view::mode::Mode; + use crate::widgets::statusbar::StatusBar; + use mlua::{Lua, UserData}; + + #[derive(Debug, Default, Clone)] + pub struct $name { + pub left: EvalTo, + pub middle: EvalTo, + pub right: EvalTo, + } + + impl $name { + pub const fn new() -> Self { + Self { + left: EvalTo::Value(Style::new()), + middle: EvalTo::Value(Style::new()), + right: EvalTo::Value(Style::new()), + } + } + + pub fn apply(bar: &mut StatusBar, mode: Mode, lua: &Lua) { + let (left, middle, right) = ( + $cfg.left.get(mode, lua).unwrap_or_default().style(), + $cfg.middle.get(mode, lua).unwrap_or_default().style(), + $cfg.right.get(mode, lua).unwrap_or_default().style(), + ); + + bar.set_left_style(left); + bar.set_middle_style(middle); + bar.set_right_style(right); + } + } + + impl UserData for $name { + fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { + fields.add_field_function_get("left", |_, _| Ok($cfg.left.clone())); + fields.add_field_function_set("left", |_, _, style: EvalTo| { + $cfg_mut.left = style; + Ok(()) + }); + + fields.add_field_function_get("middle", |_, _| Ok($cfg.middle.clone())); + fields.add_field_function_set("middle", |_, _, style: EvalTo| { + $cfg_mut.middle = style; + Ok(()) + }); + + fields.add_field_function_get("right", |_, _| Ok($cfg.right.clone())); + fields.add_field_function_set("right", |_, _, style: EvalTo| { + $cfg_mut.right = style; + Ok(()) + }); + } + } + }; +} + +pub(super) use BarTheme; diff --git a/src/config/theme/mod.rs b/src/config/theme/mod.rs index 75f65a0..082cd17 100644 --- a/src/config/theme/mod.rs +++ b/src/config/theme/mod.rs @@ -7,6 +7,7 @@ use super::DUMMY_CONFIG; pub mod style; pub mod sheetview; +pub(self) mod bar; #[derive(Clone, Debug, Default)] pub struct Theme { diff --git a/src/config/theme/sheetview.rs b/src/config/theme/sheetview.rs deleted file mode 100644 index af0b585..0000000 --- a/src/config/theme/sheetview.rs +++ /dev/null @@ -1,66 +0,0 @@ -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(()) - }); - } -} diff --git a/src/config/theme/sheetview/bar.rs b/src/config/theme/sheetview/bar.rs new file mode 100644 index 0000000..c3d1d50 --- /dev/null +++ b/src/config/theme/sheetview/bar.rs @@ -0,0 +1,8 @@ +use super::super::bar::BarTheme; +use crate::config::GlobalConfig; + +BarTheme!( + SheetViewBarTheme, + GlobalConfig::instance().theme.sheetview.bar, + GlobalConfig::instance_mut().theme.sheetview.bar +); diff --git a/src/config/theme/sheetview/mod.rs b/src/config/theme/sheetview/mod.rs new file mode 100644 index 0000000..fc999ca --- /dev/null +++ b/src/config/theme/sheetview/mod.rs @@ -0,0 +1,74 @@ +use mlua::UserData; +use ratatui::style::Color; + +use crate::{config::{GlobalConfig, DUMMY_CONFIG}, lua::evalsto::EvalTo, sheet::cell::CellRef}; + +use self::bar::SheetViewBarTheme; + +use super::style::Style; + +pub mod bar; + +#[derive(Debug, Clone, Default)] +pub struct SheetViewTheme { + pub cursor: EvalTo, + pub selection: EvalTo, + pub cell: EvalTo, + pub background: EvalTo, + pub bar: SheetViewBarTheme, +} + +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)), + bar: SheetViewBarTheme::new(), + } + } +} + +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(()) + }); + + fields.add_field_function_get("bar", |_, _| Ok(DUMMY_CONFIG.theme.sheetview.bar)) + } +} diff --git a/src/config/theme/style.rs b/src/config/theme/style.rs index 87cd068..aadd73b 100644 --- a/src/config/theme/style.rs +++ b/src/config/theme/style.rs @@ -38,6 +38,10 @@ impl Style { S: Styled, I: Styled, { + s.set_style(self.style()) + } + + pub fn style(&self) -> ratatui::style::Style { let mut style = ratatui::style::Style::default(); if let Some(fg) = self.fg { @@ -60,7 +64,7 @@ impl Style { style = style.underlined() } - s.set_style(style) + style } } -- cgit v1.2.3-70-g09d2