summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-02 20:41:29 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-02 20:41:29 +0200
commit219c560c7c0ad9e3960298ec125d4e64637fe84b (patch)
treeb04df9aa63b68739383528a77c229828bdb95773 /src
parent595bcac243cb9cdd87e7484ab102c86f3235db8a (diff)
add editor theme and state lua bindings
Diffstat (limited to 'src')
-rw-r--r--src/config/theme/bar.rs17
-rw-r--r--src/config/theme/editor/bar.rs8
-rw-r--r--src/config/theme/editor/mod.rs22
-rw-r--r--src/config/theme/mod.rs15
-rw-r--r--src/config/theme/sheetview/bar.rs3
-rw-r--r--src/state/bar.rs17
-rw-r--r--src/state/editor/bar.rs8
-rw-r--r--src/state/editor/mod.rs11
-rw-r--r--src/state/view/bar.rs3
-rw-r--r--src/widgets/luaeditor/mod.rs143
-rw-r--r--src/widgets/statusbar.rs13
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)