pub use std::any::Any;
use crate::buffer::SizedBuffer;
use crate::console::ConsoleUpdateInfo;
pub trait UiElement {
fn update(&mut self, _console: &mut ConsoleUpdateInfo) {}
fn render(&self, _buffer: &mut SizedBuffer) {}
fn get_name(&self) -> &str;
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn is_clicked(&self, _x: u16, _y: u16) -> bool { false }
fn is_focusable(&self) -> bool {false}
fn has_focus(&self) -> bool;
fn on_focus(&mut self) {}
fn on_focus_removed(&mut self) {}
}
#[macro_export]
macro_rules! ui_component_struct {
(pub struct $name:ident { $( $vis:vis $field:ident: $ty:ty ),* $(,)* }) => {
pub struct $name {
pub name: &'static str,
focused: bool,
$( $vis $field: $ty ),*
}
};
}
#[macro_export]
macro_rules! ui_component_impl {
() => {
fn get_name(&self) -> &str {
self.name.clone()
}
fn has_focus(&self) -> bool { self.focused }
fn as_any(&self) -> &dyn Any { self }
fn as_any_mut(&mut self) -> &mut dyn Any { self }
};
}