use lv_tui::prelude::*;
use lv_tui::widgets::*;
struct App { pane: SplitPane }
impl App {
fn new() -> Self {
Self {
pane: SplitPane::new()
.first(
Column::new().gap(1)
.child(Label::new("左侧面板").style(Style::default().bold()))
.child(Label::new("Ctrl+←/→ 调整宽度"))
.child(ProgressBar::new().ratio(0.75).width(20))
)
.second(
Column::new().gap(1)
.child(Label::new("右侧面板").style(Style::default().bold()))
.child(Checkbox::new("启用功能"))
.child(Checkbox::new("自动保存").checked())
)
.ratio(40),
}
}
}
impl Component for App {
fn render(&self, cx: &mut RenderCx) { self.pane.render(cx); }
fn event(&mut self, e: &Event, cx: &mut EventCx) {
if e.is_key(Key::Char('q')) { cx.quit(); return; }
if let Event::Key(k) = e {
if k.key == Key::Char('c') && k.modifiers.ctrl { cx.quit(); return; }
}
self.pane.event(e, cx);
}
fn layout(&mut self, r: lv_tui::geom::Rect, cx: &mut lv_tui::component::LayoutCx) { self.pane.layout(r, cx); }
fn measure(&self, c: lv_tui::layout::Constraint, _cx: &mut lv_tui::component::MeasureCx) -> lv_tui::geom::Size {
lv_tui::geom::Size { width: c.max.width, height: c.max.height }
}
fn for_each_child(&self, f: &mut dyn FnMut(&lv_tui::node::Node)) { self.pane.for_each_child(f); }
fn for_each_child_mut(&mut self, f: &mut dyn FnMut(&mut lv_tui::node::Node)) { self.pane.for_each_child_mut(f); }
fn focusable(&self) -> bool { false }
}
fn main() -> lv_tui::Result<()> {
lv_tui::app::App::new(App::new()).run()
}