use ratatui::{
Frame,
layout::Rect,
widgets::Paragraph,
};
use a2ui_base::model::component_context::ComponentContext;
use a2ui_base::protocol::common_types::DynamicString;
use crate::component_impl::TuiComponent;
pub struct IconComponent;
impl TuiComponent for IconComponent {
fn name(&self) -> &'static str {
"Icon"
}
fn render(
&self,
ctx: &ComponentContext,
area: Rect,
frame: &mut Frame,
_render_child: &mut dyn FnMut(&str, Rect, &mut Frame, &str),
_measure_child: &mut dyn FnMut(&str, &str, u16) -> Option<u16>,
) {
let comp_model = match ctx.components.get(&ctx.component_id) {
Some(m) => m,
None => return,
};
let inner = crate::layout_engine::padded_content(area);
if inner.width == 0 || inner.height == 0 {
return;
}
let name = match comp_model.get_property::<DynamicString>("name") {
Some(ds) => ctx.data_context.resolve_dynamic_string(&ds),
None => return,
};
let symbol = map_icon(&name);
let paragraph = Paragraph::new(symbol);
frame.render_widget(paragraph, inner);
}
fn natural_height(
&self,
_ctx: &ComponentContext,
_available_width: u16,
_measure_child: &mut dyn FnMut(&str, &str, u16) -> Option<u16>,
) -> Option<u16> {
Some(3)
}
}
fn map_icon(name: &str) -> String {
let symbol = match name {
"mail" => "✉",
"send" => "➤",
"search" => "🔍",
"settings" => "⚙",
"star" => "★",
"accountCircle" => "👤",
"home" => "🏠",
"heart" => "♥",
"check" => "✓",
"close" => "✕",
"add" => "+",
"remove" => "−",
"edit" => "✎",
"delete" => "🗑",
"refresh" => "⟳",
"arrowBack" => "←",
"arrowForward" => "→",
"arrowUp" => "↑",
"arrowDown" => "↓",
"info" => "ℹ",
"warning" => "⚠",
"error" => "✗",
"success" => "✔",
_ => return fallback_icon(name),
};
symbol.to_string()
}
fn fallback_icon(name: &str) -> String {
let chars: String = name.chars().take(2).collect();
format!("[{}]", chars)
}