From 555a45a9f2b68a48b098099804ce795e3d5a350b Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 14:05:30 +0200 Subject: sheetview add background theme parameter --- src/config/theme/sheetview.rs | 10 ++++++++-- src/lua/evalsto.rs | 10 +++++----- src/sheet/foreach.rs | 37 ------------------------------------- src/sheet/luaref.rs | 6 +++--- src/sheet/map.rs | 37 +++++++++++++++++++++++++++++++++++++ src/sheet/mod.rs | 2 +- src/widgets/sheetview/mod.rs | 13 ++++++++++--- 7 files changed, 64 insertions(+), 51 deletions(-) delete mode 100644 src/sheet/foreach.rs create mode 100644 src/sheet/map.rs diff --git a/src/config/theme/sheetview.rs b/src/config/theme/sheetview.rs index bcd53e1..af0b585 100644 --- a/src/config/theme/sheetview.rs +++ b/src/config/theme/sheetview.rs @@ -10,6 +10,7 @@ pub struct SheetViewTheme { pub cursor: EvalTo, pub selection: EvalTo, pub cell: EvalTo, + pub background: EvalTo, } impl SheetViewTheme { @@ -18,6 +19,7 @@ impl SheetViewTheme { 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)), } } } @@ -44,17 +46,21 @@ impl UserData for SheetViewTheme { }); 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/lua/evalsto.rs b/src/lua/evalsto.rs index 6d8ab29..d72638e 100644 --- a/src/lua/evalsto.rs +++ b/src/lua/evalsto.rs @@ -1,6 +1,6 @@ use std::{fmt, marker::PhantomData, sync::Arc}; -use mlua::{FromLua, IntoLua, Lua, Result, Value}; +use mlua::{FromLua, IntoLua, IntoLuaMulti, Lua, Result, Value}; use crate::lua::ownedfunction::OwnedFunction; @@ -14,7 +14,7 @@ impl EvalTo { pub fn get<'lua>(&'lua self, args: A, lua: &'lua Lua) -> Result where T: FromLua<'lua> + Clone, - A: IntoLua<'lua>, + A: IntoLuaMulti<'lua>, { match self { EvalTo::Function(value, _) => { @@ -33,7 +33,7 @@ impl EvalTo { impl<'lua, T, A> FromLua<'lua> for EvalTo where T: FromLua<'lua> + Clone, - A: IntoLua<'lua>, + A: IntoLuaMulti<'lua>, { fn from_lua( value: mlua::prelude::LuaValue<'lua>, @@ -53,7 +53,7 @@ where impl<'lua, T, A> IntoLua<'lua> for EvalTo where T: FromLua<'lua> + Clone + IntoLua<'lua>, - A: IntoLua<'lua>, + A: IntoLuaMulti<'lua>, { fn into_lua(self, lua: &'lua mlua::prelude::Lua) -> Result> { match self { @@ -74,7 +74,7 @@ where impl fmt::Debug for EvalTo where - T: fmt::Debug + T: fmt::Debug, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { diff --git a/src/sheet/foreach.rs b/src/sheet/foreach.rs deleted file mode 100644 index a2a3f90..0000000 --- a/src/sheet/foreach.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::sync::{Arc, RwLock}; - -use mlua::prelude::*; - -use super::{cell::Cell, Sheet}; - -pub trait LuaForEach { - fn lua_foreach<'lua>( - &self, - func: LuaFunction<'lua>, - range: Vec<(usize, usize)>, - ) -> Result<(), LuaError>; -} - -impl LuaForEach for Arc> { - fn lua_foreach<'lua>( - &self, - func: LuaFunction<'lua>, - range: Vec<(usize, usize)>, - ) -> Result<(), LuaError> { - let mut this = self.write().unwrap(); - let mut sheet = this.clone(); - - for (row, column) in range.iter() { - let cellref = this.get_ref(*row, *column); - - match func.call::<_, Cell>(cellref) { - Ok(cell) => sheet.set_cell(*row, *column, cell), - Err(error) => return Err(error), - } - } - - this.apply(sheet); - - Ok(()) - } -} diff --git a/src/sheet/luaref.rs b/src/sheet/luaref.rs index fa4b8f9..5fb6bed 100644 --- a/src/sheet/luaref.rs +++ b/src/sheet/luaref.rs @@ -1,7 +1,7 @@ use crate::state::GlobalState; use super::{ - foreach::LuaForEach, + map::LuaMap, register::{Register, SheetId}, }; use mlua::prelude::*; @@ -41,7 +41,7 @@ impl LuaUserData for SheetLuaRef { } }); - methods.add_method_mut("foreach", |_, luaref, func: LuaFunction| { + methods.add_method_mut("map", |_, luaref, func: LuaFunction| { let range: Vec<_> = { let state = GlobalState::instance(); let lock = state.sheetview.active_sheet().unwrap(); @@ -66,7 +66,7 @@ impl LuaUserData for SheetLuaRef { } }; - Register::get(luaref.id).unwrap().lua_foreach(func, range) + Register::get(luaref.id).unwrap().lua_map(func, range) }) } } diff --git a/src/sheet/map.rs b/src/sheet/map.rs new file mode 100644 index 0000000..09209a3 --- /dev/null +++ b/src/sheet/map.rs @@ -0,0 +1,37 @@ +use std::sync::{Arc, RwLock}; + +use mlua::prelude::*; + +use super::{cell::Cell, Sheet}; + +pub trait LuaMap { + fn lua_map<'lua>( + &self, + func: LuaFunction<'lua>, + range: Vec<(usize, usize)>, + ) -> Result<(), LuaError>; +} + +impl LuaMap for Arc> { + fn lua_map<'lua>( + &self, + func: LuaFunction<'lua>, + range: Vec<(usize, usize)>, + ) -> Result<(), LuaError> { + let mut this = self.write().unwrap(); + let mut sheet = this.clone(); + + for (row, column) in range.iter() { + let cellref = this.get_ref(*row, *column); + + match func.call::<_, Cell>(cellref) { + Ok(cell) => sheet.set_cell(*row, *column, cell), + Err(error) => return Err(error), + } + } + + this.apply(sheet); + + Ok(()) + } +} diff --git a/src/sheet/mod.rs b/src/sheet/mod.rs index 5f28e07..ffaec94 100644 --- a/src/sheet/mod.rs +++ b/src/sheet/mod.rs @@ -1,7 +1,7 @@ use cell::{Cell, CellRef}; pub mod cell; -pub mod foreach; +pub mod map; pub mod register; pub mod luaref; diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs index aac2080..2239a0b 100644 --- a/src/widgets/sheetview/mod.rs +++ b/src/widgets/sheetview/mod.rs @@ -3,7 +3,7 @@ use ratatui::{ prelude::*, style::Stylize, text::ToLine, - widgets::Widget, + widgets::{Paragraph, Widget}, }; use crate::{ @@ -62,10 +62,10 @@ impl SheetView { fn open_editor(&self) { let mut state = GlobalState::instance_mut(); state.editor.buffer.set_lines_from_string( -r#"require('neosheet') + r#"require('neosheet') .state .view - .active:foreach(function(cell) + .active:map(function(cell) return "" end)"#, ); @@ -188,6 +188,13 @@ impl Widget for &mut SheetView { self.scroll.1 = cursor.x(); } + theme + .background + .get((), &lua::get()) + .unwrap_or_default() + .apply(Paragraph::default()) + .render(area, buf); + for row in 0..viewport_rows { for column in 0..(viewport_columns + 1) { let (cell_pos_y, cell_pos_x) = (row + self.scroll.0, column + self.scroll.1); -- cgit v1.2.3-70-g09d2