use ansi_to_tui::IntoText; use mlua::{AnyUserData, ExternalError, ExternalResult, IntoLua, Lua, Table, UserData, Value}; use ratatui::widgets::Widget; use super::{Line, RectRef, Renderable, Style}; // Alignment const LEFT: u8 = 0; const CENTER: u8 = 1; const RIGHT: u8 = 2; // Wrap const WRAP_NO: u8 = 0; const WRAP: u8 = 1; const WRAP_TRIM: u8 = 2; #[derive(Clone, Debug, Default)] pub struct Paragraph { pub area: ratatui::layout::Rect, pub text: ratatui::text::Text<'static>, pub style: ratatui::style::Style, pub alignment: ratatui::layout::Alignment, pub wrap: u8, } impl Paragraph { pub fn install(lua: &Lua, ui: &Table) -> mlua::Result<()> { let new = lua.create_function(|_, (_, area, lines): (Table, RectRef, Vec)| { Ok(Paragraph { area: *area, text: lines.into_iter().map(|s| s.0).collect(), ..Default::default() }) })?; let parse = lua.create_function(|_, (area, code): (RectRef, mlua::String)| { Ok(Paragraph { area: *area, text: code.into_text().into_lua_err()?, ..Default::default() }) })?; let paragraph = lua.create_table_from([ ("parse", parse.into_lua(lua)?), // Alignment ("LEFT", LEFT.into_lua(lua)?), ("CENTER", CENTER.into_lua(lua)?), ("RIGHT", RIGHT.into_lua(lua)?), // Wrap ("WRAP_OFF", WRAP_NO.into_lua(lua)?), ("WRAP", WRAP.into_lua(lua)?), ("WRAP_TRIM", WRAP_TRIM.into_lua(lua)?), ])?; paragraph.set_metatable(Some(lua.create_table_from([("__call", new)])?)); ui.raw_set("Paragraph", paragraph) } } impl UserData for Paragraph { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { crate::impl_style_shorthands!(methods, style); methods.add_function("style", |_, (ud, value): (AnyUserData, Value)| { { let mut me = ud.borrow_mut::()?; match value { Value::Nil => me.style = ratatui::style::Style::default(), Value::Table(tb) => me.style = Style::try_from(tb)?.0, Value::UserData(ud) => me.style = ud.borrow::