// ---- src/widgets/window.rs ----use super::Widget;
pubstructWindow {
title: String,
widgets: Vec<Box<dyn Widget>>,
}
impl Window {
pubfnnew(title: &str) -> Window {
Window { title: title.to_owned(), widgets: Vec::new() }
}
pubfnadd_widget(&mutself, widget: Box<dyn Widget>) {
self.widgets.push(widget);
}
fninner_width(&self) -> usize {
std::cmp::max(
self.title.chars().count(),
self.widgets.iter().map(|w| w.width()).max().unwrap_or(0),
)
}
}
impl Widget for Window {
fnwidth(&self) -> usize {
// ANCHOR_END: window-width// Añade 4 espacios de relleno para los bordesself.inner_width() + 4
}
// ANCHOR: Window-draw_intofndraw_into(&self, buffer: &mutdyn std::fmt::Write) {
// ANCHOR_END: Window-draw_intoletmut inner = String::new();
for widget in &self.widgets {
widget.draw_into(&mut inner);
}
let inner_width = self.inner_width();
// TAREA: después de saber cómo gestionar los errores, puedes cambiar// draw_into para devolver Result<(), std::fmt::Error>. A continuación, usa// el operator ? en lugar de .unwrap().writeln!(buffer, "+-{:-<inner_width$}-+", "").unwrap();
writeln!(buffer, "| {:^inner_width$} |", &self.title).unwrap();
writeln!(buffer, "+={:=<inner_width$}=+", "").unwrap();
for line in inner.lines() {
writeln!(buffer, "| {:inner_width$} |", line).unwrap();
}
writeln!(buffer, "+-{:-<inner_width$}-+", "").unwrap();
}
}
// ---- src/main.rs ----mod widgets;
use widgets::Widget;
fnmain() {
letmut window = widgets::Window::new("Demo de la GUI de Rust 1.23");
window
.add_widget(Box::new(widgets::Label::new("Esta es una demo de la GUI con poco texto.")));
window.add_widget(Box::new(widgets::Button::new("Haz clic aquí")));
window.draw();
}