mod widget;
#[cfg(test)]
mod tests;
use bevy_app::{App, AppExit};
use plurimus::core::ratatui_core::backend::TestBackend;
use plurimus::core::ratatui_core::layout::{Position, Rect};
use plurimus::core::{
ColorDepth, CorePlugin, PresenterPlugin, TerminalCamera, TerminalContext, TerminalCursor,
TerminalRenderApp, TerminalSize, UiArea, UiCamera, UiWidget, Viewport,
};
use widget::Waveform;
const SIZE: TerminalSize = TerminalSize::new(40, 12);
const TOP: Rect = Rect::new(0, 0, 40, 8);
const BOTTOM: Rect = Rect::new(0, 8, 40, 4);
fn main() -> AppExit {
let mut app = demo();
app.update();
print!("{}", composed(&app));
AppExit::Success
}
fn demo() -> App {
let mut app = App::new();
app.add_plugins(CorePlugin);
app.insert_resource(SIZE);
app.insert_resource(ColorDepth::Ansi16);
app.add_plugins(PresenterPlugin::new(TestBackend::new(SIZE.cols, SIZE.rows)));
let top = app
.world_mut()
.spawn(TerminalCamera::default().with_viewport(Viewport::Fixed(TOP)))
.id();
let bottom = app
.world_mut()
.spawn(
TerminalCamera::default()
.with_order(1)
.with_viewport(Viewport::Fixed(BOTTOM)),
)
.id();
app.world_mut().spawn((
UiWidget::new(Waveform::new(4)),
UiArea::Fixed(Rect::new(0, 0, TOP.width, TOP.height)),
UiCamera(top),
));
app.world_mut().spawn((
UiWidget::new(Waveform::new(11)),
UiArea::Fixed(Rect::new(0, 0, BOTTOM.width, BOTTOM.height)),
UiCamera(bottom),
));
app.world_mut().resource_mut::<TerminalCursor>().cell = Some(Position::new(0, 0));
app
}
fn composed(app: &App) -> String {
let backend = &app
.sub_app(TerminalRenderApp)
.world()
.resource::<TerminalContext<TestBackend>>()
.backend;
let buffer = backend.buffer();
let mut out = String::new();
for y in 0..buffer.area.height {
for x in 0..buffer.area.width {
out.push_str(buffer[(x, y)].symbol());
}
out.push('\n');
}
out
}