mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2026-01-31 10:56:41 +01:00
parent
1344967f33
commit
a933cbe285
4 changed files with 84 additions and 87 deletions
|
|
@ -1,8 +1,4 @@
|
||||||
#![feature(type_changing_struct_update)]
|
#![feature(type_changing_struct_update, trait_alias)]
|
||||||
#![feature(trait_alias)]
|
|
||||||
#[cfg(test)] mod tui_test;
|
|
||||||
mod tui_engine; pub use self::tui_engine::*;
|
|
||||||
mod tui_content; pub use self::tui_content::*;
|
|
||||||
pub use ::{tengri_input, tengri_output, ratatui, crossterm, palette, better_panic};
|
pub use ::{tengri_input, tengri_output, ratatui, crossterm, palette, better_panic};
|
||||||
pub(crate) use ::{
|
pub(crate) use ::{
|
||||||
dizzle::*,
|
dizzle::*,
|
||||||
|
|
@ -25,5 +21,42 @@ pub(crate) use ::{
|
||||||
event::{Event, KeyEvent, KeyCode, KeyModifiers, KeyEventKind, KeyEventState},
|
event::{Event, KeyEvent, KeyCode, KeyModifiers, KeyEventKind, KeyEventState},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
mod tui_engine; pub use self::tui_engine::*;
|
||||||
|
mod tui_content; pub use self::tui_content::*;
|
||||||
|
#[cfg(test)] mod tui_test {
|
||||||
|
use crate::*;
|
||||||
|
#[test] fn test_tui_engine () -> Usually<()> {
|
||||||
|
//use std::sync::{Arc, RwLock};
|
||||||
|
struct TestComponent(String);
|
||||||
|
impl Content<TuiOut> for TestComponent {
|
||||||
|
fn content (&self) -> impl Draw<TuiOut> {
|
||||||
|
Some(self.0.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Handle<TuiIn> for TestComponent {
|
||||||
|
fn handle (&mut self, _from: &TuiIn) -> Perhaps<bool> {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let engine = Tui::new()?;
|
||||||
|
engine.read().unwrap().exited.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||||
|
let state = TestComponent("hello world".into());
|
||||||
|
let _state = std::sync::Arc::new(std::sync::RwLock::new(state));
|
||||||
|
//engine.run(&state)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
//#[test] fn test_parse_key () {
|
||||||
|
////use KeyModifiers as Mods;
|
||||||
|
//let _test = |x: &str, y|assert_eq!(KeyMatcher::new(x).build(), Some(Event::Key(y)));
|
||||||
|
////test(":x",
|
||||||
|
////KeyEvent::new(KeyCode::Char('x'), Mods::NONE));
|
||||||
|
////test(":ctrl-x",
|
||||||
|
////KeyEvent::new(KeyCode::Char('x'), Mods::CONTROL));
|
||||||
|
////test(":alt-x",
|
||||||
|
////KeyEvent::new(KeyCode::Char('x'), Mods::ALT));
|
||||||
|
////test(":shift-x",
|
||||||
|
////KeyEvent::new(KeyCode::Char('x'), Mods::SHIFT));
|
||||||
|
////test(":ctrl-alt-shift-x",
|
||||||
|
////KeyEvent::new(KeyCode::Char('x'), Mods::CONTROL | Mods::ALT | Mods::SHIFT ));
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
use crate::*;
|
|
||||||
|
|
||||||
#[cfg(feature = "dsl")]
|
|
||||||
pub fn evaluate_output_expression_tui <'a, S> (
|
|
||||||
state: &S, mut output: &mut TuiOut, expr: impl DslExpr + 'a
|
|
||||||
) -> Usually<bool> where
|
|
||||||
S: View<TuiOut, ()>
|
|
||||||
+ for<'b>DslNs<'b, bool>
|
|
||||||
+ for<'b>DslNs<'b, u16>
|
|
||||||
+ for<'b>DslNs<'b, Color>
|
|
||||||
{
|
|
||||||
// See `tengri_output::evaluate_output_expression`
|
|
||||||
let head = expr.head()?;
|
|
||||||
let mut frags = head.src()?.unwrap_or_default().split("/");
|
|
||||||
let args = expr.tail();
|
|
||||||
let arg0 = args.head();
|
|
||||||
let tail0 = args.tail();
|
|
||||||
let arg1 = tail0.head();
|
|
||||||
let tail1 = tail0.tail();
|
|
||||||
let arg2 = tail1.head();
|
|
||||||
match frags.next() {
|
|
||||||
|
|
||||||
Some("text") => if let Some(src) = args?.src()? { output.place(&src) },
|
|
||||||
|
|
||||||
Some("fg") => {
|
|
||||||
let arg0 = arg0?.expect("fg: expected arg 0 (color)");
|
|
||||||
output.place(&Tui::fg(
|
|
||||||
DslNs::<Color>::from(state, arg0)?.unwrap_or_else(||panic!("fg: {arg0:?}: not a color")),
|
|
||||||
Thunk::new(move|output: &mut TuiOut|state.view(output, &arg1).unwrap()),
|
|
||||||
))
|
|
||||||
},
|
|
||||||
|
|
||||||
Some("bg") => {
|
|
||||||
let arg0 = arg0?.expect("bg: expected arg 0 (color)");
|
|
||||||
output.place(&Tui::bg(
|
|
||||||
DslNs::<Color>::from(state, arg0)?.unwrap_or_else(||panic!("bg: {arg0:?}: not a color")),
|
|
||||||
Thunk::new(move|output: &mut TuiOut|state.view(output, &arg1).unwrap()),
|
|
||||||
))
|
|
||||||
},
|
|
||||||
|
|
||||||
_ => return Ok(false)
|
|
||||||
|
|
||||||
};
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
||||||
|
|
@ -102,3 +102,47 @@ impl<T: TuiWidget + Send + Sync + 'static> TuiRun<T> for Arc<RwLock<Tui>> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "dsl")]
|
||||||
|
pub fn evaluate_output_expression_tui <'a, S> (
|
||||||
|
state: &S, mut output: &mut TuiOut, expr: impl DslExpr + 'a
|
||||||
|
) -> Usually<bool> where
|
||||||
|
S: View<TuiOut, ()>
|
||||||
|
+ for<'b>DslNs<'b, bool>
|
||||||
|
+ for<'b>DslNs<'b, u16>
|
||||||
|
+ for<'b>DslNs<'b, Color>
|
||||||
|
{
|
||||||
|
// See `tengri_output::evaluate_output_expression`
|
||||||
|
let head = expr.head()?;
|
||||||
|
let mut frags = head.src()?.unwrap_or_default().split("/");
|
||||||
|
let args = expr.tail();
|
||||||
|
let arg0 = args.head();
|
||||||
|
let tail0 = args.tail();
|
||||||
|
let arg1 = tail0.head();
|
||||||
|
let tail1 = tail0.tail();
|
||||||
|
let arg2 = tail1.head();
|
||||||
|
match frags.next() {
|
||||||
|
|
||||||
|
Some("text") => if let Some(src) = args?.src()? { output.place(&src) },
|
||||||
|
|
||||||
|
Some("fg") => {
|
||||||
|
let arg0 = arg0?.expect("fg: expected arg 0 (color)");
|
||||||
|
output.place(&Tui::fg(
|
||||||
|
DslNs::<Color>::from(state, arg0)?.unwrap_or_else(||panic!("fg: {arg0:?}: not a color")),
|
||||||
|
Thunk::new(move|output: &mut TuiOut|state.view(output, &arg1).unwrap()),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
|
||||||
|
Some("bg") => {
|
||||||
|
let arg0 = arg0?.expect("bg: expected arg 0 (color)");
|
||||||
|
output.place(&Tui::bg(
|
||||||
|
DslNs::<Color>::from(state, arg0)?.unwrap_or_else(||panic!("bg: {arg0:?}: not a color")),
|
||||||
|
Thunk::new(move|output: &mut TuiOut|state.view(output, &arg1).unwrap()),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
|
||||||
|
_ => return Ok(false)
|
||||||
|
|
||||||
|
};
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
use crate::*;
|
|
||||||
#[test] fn test_tui_engine () -> Usually<()> {
|
|
||||||
//use std::sync::{Arc, RwLock};
|
|
||||||
struct TestComponent(String);
|
|
||||||
impl Content<TuiOut> for TestComponent {
|
|
||||||
fn content (&self) -> impl Draw<TuiOut> {
|
|
||||||
Some(self.0.as_str())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Handle<TuiIn> for TestComponent {
|
|
||||||
fn handle (&mut self, _from: &TuiIn) -> Perhaps<bool> {
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let engine = Tui::new()?;
|
|
||||||
engine.read().unwrap().exited.store(true, std::sync::atomic::Ordering::Relaxed);
|
|
||||||
let state = TestComponent("hello world".into());
|
|
||||||
let _state = std::sync::Arc::new(std::sync::RwLock::new(state));
|
|
||||||
//engine.run(&state)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
//#[test] fn test_parse_key () {
|
|
||||||
////use KeyModifiers as Mods;
|
|
||||||
//let _test = |x: &str, y|assert_eq!(KeyMatcher::new(x).build(), Some(Event::Key(y)));
|
|
||||||
////test(":x",
|
|
||||||
////KeyEvent::new(KeyCode::Char('x'), Mods::NONE));
|
|
||||||
////test(":ctrl-x",
|
|
||||||
////KeyEvent::new(KeyCode::Char('x'), Mods::CONTROL));
|
|
||||||
////test(":alt-x",
|
|
||||||
////KeyEvent::new(KeyCode::Char('x'), Mods::ALT));
|
|
||||||
////test(":shift-x",
|
|
||||||
////KeyEvent::new(KeyCode::Char('x'), Mods::SHIFT));
|
|
||||||
////test(":ctrl-alt-shift-x",
|
|
||||||
////KeyEvent::new(KeyCode::Char('x'), Mods::CONTROL | Mods::ALT | Mods::SHIFT ));
|
|
||||||
//}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue