diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/config/theme/bar.rs | 17 | ||||
| -rw-r--r-- | src/config/theme/editor/bar.rs | 8 | ||||
| -rw-r--r-- | src/config/theme/editor/mod.rs | 22 | ||||
| -rw-r--r-- | src/config/theme/mod.rs | 15 | ||||
| -rw-r--r-- | src/config/theme/sheetview/bar.rs | 3 | ||||
| -rw-r--r-- | src/state/bar.rs | 17 | ||||
| -rw-r--r-- | src/state/editor/bar.rs | 8 | ||||
| -rw-r--r-- | src/state/editor/mod.rs | 11 | ||||
| -rw-r--r-- | src/state/view/bar.rs | 3 | ||||
| -rw-r--r-- | src/widgets/luaeditor/mod.rs | 143 | ||||
| -rw-r--r-- | src/widgets/statusbar.rs | 13 |
11 files changed, 150 insertions, 110 deletions
diff --git a/src/config/theme/bar.rs b/src/config/theme/bar.rs index 68a3b13..a28bede 100644 --- a/src/config/theme/bar.rs +++ b/src/config/theme/bar.rs @@ -1,16 +1,15 @@ macro_rules! BarTheme { - ($name:ident, $cfg:expr, $cfg_mut:expr) => { + ($name:ident, $type:ty, $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<Style, Mode>, - pub middle: EvalTo<Style, Mode>, - pub right: EvalTo<Style, Mode>, + pub left: EvalTo<Style, $type>, + pub middle: EvalTo<Style, $type>, + pub right: EvalTo<Style, $type>, } impl $name { @@ -22,7 +21,7 @@ macro_rules! BarTheme { } } - pub fn apply(bar: &mut StatusBar, mode: Mode, lua: &Lua) { + pub fn apply(bar: &mut StatusBar, mode: $type, lua: &Lua) { let (left, middle, right) = ( $cfg.left.get(mode, lua).unwrap_or_default().style(), $cfg.middle.get(mode, lua).unwrap_or_default().style(), @@ -38,19 +37,19 @@ macro_rules! BarTheme { 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<Style, Mode>| { + fields.add_field_function_set("left", |_, _, style: EvalTo<Style, $type>| { $cfg_mut.left = style; Ok(()) }); fields.add_field_function_get("middle", |_, _| Ok($cfg.middle.clone())); - fields.add_field_function_set("middle", |_, _, style: EvalTo<Style, Mode>| { + fields.add_field_function_set("middle", |_, _, style: EvalTo<Style, $type>| { $cfg_mut.middle = style; Ok(()) }); fields.add_field_function_get("right", |_, _| Ok($cfg.right.clone())); - fields.add_field_function_set("right", |_, _, style: EvalTo<Style, Mode>| { + fields.add_field_function_set("right", |_, _, style: EvalTo<Style, $type>| { $cfg_mut.right = style; Ok(()) }); diff --git a/src/config/theme/editor/bar.rs b/src/config/theme/editor/bar.rs new file mode 100644 index 0000000..62be7b0 --- /dev/null +++ b/src/config/theme/editor/bar.rs @@ -0,0 +1,8 @@ +use crate::config::{theme::bar::BarTheme, GlobalConfig}; + +BarTheme!( + EditorBarTheme, + (), + GlobalConfig::instance().theme.editor.bar, + GlobalConfig::instance_mut().theme.editor.bar +); diff --git a/src/config/theme/editor/mod.rs b/src/config/theme/editor/mod.rs index d9e2b16..662dacc 100644 --- a/src/config/theme/editor/mod.rs +++ b/src/config/theme/editor/mod.rs @@ -1,11 +1,16 @@ use mlua::UserData; +use crate::config::DUMMY_CONFIG; use crate::lua::evalsto::EvalTo; use crate::widgets::luaeditor::theme::HighlightTheme; +use self::bar::EditorBarTheme; + use super::super::GlobalConfig; use super::style::Style; +pub mod bar; + #[derive(Clone, Debug, Default)] pub struct EditorTheme { pub background: EvalTo<Style, ()>, @@ -13,6 +18,7 @@ pub struct EditorTheme { pub cursor_line: EvalTo<Style, ()>, pub line_number: EvalTo<Style, ()>, pub active_line_number: EvalTo<Style, ()>, + pub bar: EditorBarTheme, } impl EditorTheme { @@ -23,6 +29,7 @@ impl EditorTheme { cursor_line: EvalTo::Value(Style::new()), line_number: EvalTo::Value(Style::new()), active_line_number: EvalTo::Value(Style::new()), + bar: EditorBarTheme::new(), } } } @@ -65,10 +72,17 @@ impl UserData for EditorTheme { Ok(()) }); - fields.add_field_function_get("active_line_number", |_, _| Ok(cfg!().active_line_number.clone())); - fields.add_field_function_set("active_line_number", |_, _, active_line_number: EvalTo<Style, ()>| { - cfg_mut!().active_line_number = active_line_number; - Ok(()) + fields.add_field_function_get("active_line_number", |_, _| { + Ok(cfg!().active_line_number.clone()) }); + fields.add_field_function_set( + "active_line_number", + |_, _, active_line_number: EvalTo<Style, ()>| { + cfg_mut!().active_line_number = active_line_number; + Ok(()) + }, + ); + + fields.add_field_method_get("bar", |_, _| Ok(DUMMY_CONFIG.theme.editor.bar)) } } diff --git a/src/config/theme/mod.rs b/src/config/theme/mod.rs index ca9723b..b714e86 100644 --- a/src/config/theme/mod.rs +++ b/src/config/theme/mod.rs @@ -1,14 +1,13 @@ - use mlua::UserData; use self::{editor::EditorTheme, sheetview::SheetViewTheme}; use super::DUMMY_CONFIG; -pub mod style; -pub mod sheetview; -pub mod editor; mod bar; +pub mod editor; +pub mod sheetview; +pub mod style; #[derive(Clone, Debug, Default)] pub struct Theme { @@ -27,12 +26,8 @@ impl Theme { impl UserData for Theme { fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) { - fields.add_field_function_get("sheetview", |_, _| { - Ok(DUMMY_CONFIG.theme.sheetview) - }); + fields.add_field_function_get("sheetview", |_, _| Ok(DUMMY_CONFIG.theme.sheetview)); - fields.add_field_function_get("editor", |_, _| { - Ok(DUMMY_CONFIG.theme.editor) - }) + fields.add_field_function_get("editor", |_, _| Ok(DUMMY_CONFIG.theme.editor)) } } diff --git a/src/config/theme/sheetview/bar.rs b/src/config/theme/sheetview/bar.rs index c3d1d50..b23f785 100644 --- a/src/config/theme/sheetview/bar.rs +++ b/src/config/theme/sheetview/bar.rs @@ -1,8 +1,9 @@ use super::super::bar::BarTheme; -use crate::config::GlobalConfig; +use crate::{config::GlobalConfig, state::view::mode::Mode}; BarTheme!( SheetViewBarTheme, + Mode, GlobalConfig::instance().theme.sheetview.bar, GlobalConfig::instance_mut().theme.sheetview.bar ); diff --git a/src/state/bar.rs b/src/state/bar.rs index 6462449..2f8e6aa 100644 --- a/src/state/bar.rs +++ b/src/state/bar.rs @@ -1,15 +1,14 @@ macro_rules! BarState { - ($name:ident, $cfg:expr, $cfg_mut:expr) => { + ($name:ident, $type:ty, $cfg:expr, $cfg_mut:expr) => { 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<String, Mode>, - pub middle: EvalTo<String, Mode>, - pub right: EvalTo<String, Mode>, + pub left: EvalTo<String, $type>, + pub middle: EvalTo<String, $type>, + pub right: EvalTo<String, $type>, } impl $name { @@ -21,7 +20,7 @@ macro_rules! BarState { } } - pub fn apply(bar: &mut StatusBar, mode: Mode, lua: &Lua) { + pub fn apply(bar: &mut StatusBar, mode: $type, lua: &Lua) { let (left, middle, right) = ( $cfg.left.get(mode, lua).unwrap_or_default(), $cfg.middle.get(mode, lua).unwrap_or_default(), @@ -36,19 +35,19 @@ macro_rules! BarState { 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<String, Mode>| { + fields.add_field_function_set("left", |_, _, style: EvalTo<String, $type>| { $cfg_mut.left = style; Ok(()) }); fields.add_field_function_get("middle", |_, _| Ok($cfg.middle.clone())); - fields.add_field_function_set("middle", |_, _, style: EvalTo<String, Mode>| { + fields.add_field_function_set("middle", |_, _, style: EvalTo<String, $type>| { $cfg_mut.middle = style; Ok(()) }); fields.add_field_function_get("right", |_, _| Ok($cfg.right.clone())); - fields.add_field_function_set("right", |_, _, style: EvalTo<String, Mode>| { + fields.add_field_function_set("right", |_, _, style: EvalTo<String, $type>| { $cfg_mut.right = style; Ok(()) }); diff --git a/src/state/editor/bar.rs b/src/state/editor/bar.rs new file mode 100644 index 0000000..752d021 --- /dev/null +++ b/src/state/editor/bar.rs @@ -0,0 +1,8 @@ +use crate::state::{bar::BarState, GlobalState}; + +BarState!( + EditorBarState, + (), + GlobalState::instance().editor.bar, + GlobalState::instance_mut().editor.bar +); diff --git a/src/state/editor/mod.rs b/src/state/editor/mod.rs index 6fbd2b9..279a164 100644 --- a/src/state/editor/mod.rs +++ b/src/state/editor/mod.rs @@ -1,14 +1,16 @@ -use self::buffer::Buffer; +use self::{bar::EditorBarState, buffer::Buffer}; -use super::GlobalState; +use super::{GlobalState, DUMMY_STATE}; use mlua::{Lua, UserData}; pub mod buffer; +pub mod bar; #[derive(Default, Debug)] pub struct EditorState { pub visible: bool, pub buffer: Buffer, + pub bar: EditorBarState, } macro_rules! cfg { @@ -28,6 +30,7 @@ impl EditorState { Self { visible: false, buffer: Buffer::new(), + bar: EditorBarState::new(), } } @@ -45,7 +48,9 @@ impl UserData for EditorState { fields.add_field_function_set("visible", |_, _, visible: bool| { cfg_mut!().visible = visible; Ok(()) - }) + }); + + fields.add_field_function_get("bar", |_, _| Ok(DUMMY_STATE.editor.bar)); } fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) { diff --git a/src/state/view/bar.rs b/src/state/view/bar.rs index cc59e36..f3d1e46 100644 --- a/src/state/view/bar.rs +++ b/src/state/view/bar.rs @@ -1,7 +1,10 @@ use crate::state::{bar::BarState, GlobalState}; +use super::mode::Mode; + BarState!( SheetViewBarState, + Mode, GlobalState::instance().sheetview.bar, GlobalState::instance_mut().sheetview.bar ); diff --git a/src/widgets/luaeditor/mod.rs b/src/widgets/luaeditor/mod.rs index c777190..620de4c 100644 --- a/src/widgets/luaeditor/mod.rs +++ b/src/widgets/luaeditor/mod.rs @@ -7,8 +7,8 @@ use ratatui::{ use tree_sitter_highlight::HighlightConfiguration; use crate::{ - config::GlobalConfig, - state::{editor::EditorState, window::Window, GlobalState}, + config::{theme::editor::bar::EditorBarTheme, GlobalConfig}, + state::{editor::{bar::EditorBarState, EditorState}, window::Window, GlobalState}, tuicursor::TuiCursor, }; use crate::{cursor::CursorMove, lua}; @@ -108,90 +108,95 @@ impl Widget for &mut LuaEditor { where Self: Sized, { - let state = GlobalState::instance(); - let buffer = &state.editor.buffer; + { + let state = GlobalState::instance(); + let buffer = &state.editor.buffer; - let config = GlobalConfig::instance(); - let theme = &config.theme.editor; + let config = GlobalConfig::instance(); + let theme = &config.theme.editor; - self.bar.render(area, buf); - let inner_area = self.bar.area(area); + let inner_area = self.bar.area(area); - let text = buffer.as_string(); - let highlights = treesitter::highlighter_split(text.as_bytes(), &self.highlight_config); + let text = buffer.as_string(); + let highlights = treesitter::highlighter_split(text.as_bytes(), &self.highlight_config); - let nr_width = (buffer.lines().len().to_string().len() + 1).max(4) as u16; - let mut text_area = inner_area; - text_area.x += nr_width; + let nr_width = (buffer.lines().len().to_string().len() + 1).max(4) as u16; + let mut text_area = inner_area; + text_area.x += nr_width; - let mut span_area = text_area; - let mut current_line = 0; + let mut span_area = text_area; + let mut current_line = 0; - theme - .background - .get((), &lua::get()) - .unwrap_or_default() - .apply(Paragraph::default()) - .render(area, buf); + theme + .background + .get((), &lua::get()) + .unwrap_or_default() + .apply(Paragraph::default()) + .render(area, buf); - theme - .cursor_line - .get((), &lua::get()) - .unwrap_or_default() - .apply(Paragraph::default()) - .render( - Rect::new( - text_area.x, - text_area.y + buffer.cursor().y() as u16, - text_area.width, - 1, - ), - buf, - ); + theme + .cursor_line + .get((), &lua::get()) + .unwrap_or_default() + .apply(Paragraph::default()) + .render( + Rect::new( + text_area.x, + text_area.y + buffer.cursor().y() as u16, + text_area.width, + 1, + ), + buf, + ); - for (hl, group) in highlights.iter() { - if *group == "\n" { - if current_line >= self.scroll { - span_area.y += 1; - span_area.x = text_area.x; - } + for (hl, group) in highlights.iter() { + if *group == "\n" { + if current_line >= self.scroll { + span_area.y += 1; + span_area.x = text_area.x; + } - current_line += 1; - } else if current_line >= self.scroll { - let group = group.replace('\t', " "); - let span = group.to_span(); + current_line += 1; + } else if current_line >= self.scroll { + let group = group.replace('\t', " "); + let span = group.to_span(); - if inner_area.contains(span_area.into()) { - theme.highlight.highlight(*hl, span).render(span_area, buf); - } + if inner_area.contains(span_area.into()) { + theme.highlight.highlight(*hl, span).render(span_area, buf); + } - span_area.x += group.len() as u16; + span_area.x += group.len() as u16; + } } - } - for i in self.scroll..buffer.lines().len() { - let mut nr_area = span_area; - nr_area.x = inner_area.x; - nr_area.width = nr_width; - nr_area.y = inner_area.y + (i - self.scroll) as u16; - nr_area.height = 1; + for i in self.scroll..buffer.lines().len() { + let mut nr_area = span_area; + nr_area.x = inner_area.x; + nr_area.width = nr_width; + nr_area.y = inner_area.y + (i - self.scroll) as u16; + nr_area.height = 1; - if !inner_area.contains(nr_area.into()) { - break; - } + if !inner_area.contains(nr_area.into()) { + break; + } - if buffer.cursor().y() == i { - theme - .active_line_number - .get((), &lua::get()) - .unwrap_or_default() - } else { - theme.line_number.get((), &lua::get()).unwrap_or_default() + if buffer.cursor().y() == i { + theme + .active_line_number + .get((), &lua::get()) + .unwrap_or_default() + } else { + theme.line_number.get((), &lua::get()).unwrap_or_default() + } + .apply(((i + 1).to_string() + " ").to_line()) + .right_aligned() + .render(nr_area, buf); } - .apply(((i + 1).to_string() + " ").to_line()) - .right_aligned() - .render(nr_area, buf); } + + EditorBarState::apply(&mut self.bar, (), &lua::get()); + EditorBarTheme::apply(&mut self.bar, (), &lua::get()); + self.bar.render(area, buf); } } diff --git a/src/widgets/statusbar.rs b/src/widgets/statusbar.rs index 61ce1a3..9375d95 100644 --- a/src/widgets/statusbar.rs +++ b/src/widgets/statusbar.rs @@ -1,4 +1,3 @@ - use ratatui::{ crossterm::event::{KeyCode, KeyEvent}, layout::{Alignment, Rect}, @@ -23,12 +22,12 @@ pub struct StatusBar { impl StatusBar { pub fn new() -> Self { Self { - left: String::new(), + left: "".to_string(), left_style: Style::default(), - middle: String::new(), + middle: " ".to_string(), middle_style: Style::default(), middle_alignment: Alignment::Center, - right: String::new(), + right: "".to_string(), right_style: Style::default(), input: None, cursor: 0, @@ -46,7 +45,11 @@ impl StatusBar { where S: AsRef<str>, { - self.middle = text.as_ref().to_string(); + if text.as_ref().is_empty() { + self.middle = " ".to_string(); + } else { + self.middle = text.as_ref().to_string(); + } } pub fn set_right<S>(&mut self, text: S) |