1 use std::{ 2 any::Any, 3 cell::{Cell, RefCell}, 4 sync::Arc, 5 }; 6 7 use starry_client::base::renderer::Renderer; 8 9 use crate::base::{point::Point, rect::Rect}; 10 11 pub mod image; 12 pub mod label; 13 14 /// 组件的纵向排列方式 15 #[derive(PartialEq, Copy, Clone)] 16 pub enum VerticalPlacement { 17 /// 向上对齐 18 Top, 19 /// 居中对齐 20 Center, 21 /// 向下对齐 22 Bottom, 23 /// 绝对位置 24 Absolute, 25 /// 拉伸 26 Stretch, 27 } 28 29 /// 组件的横向排列方式 30 #[derive(PartialEq, Copy, Clone)] 31 pub enum HorizontalPlacement { 32 /// 靠左对齐 33 Left, 34 /// 居中对齐 35 Center, 36 /// 靠右对齐 37 Right, 38 /// 绝对位置 39 Absolute, 40 /// 拉伸 41 Stretch, 42 } 43 44 /// UI组件需要实现的特性 45 pub trait Widget: Any { 46 /// 返回渲染的矩形区域 47 fn rect(&self) -> &Cell<Rect>; 48 49 /// 返回组件相对于父物体的相对位置 50 fn local_position(&self) -> &Cell<Point>; 51 52 /// 返回纵向排列方式 53 fn vertical_placement(&self) -> &Cell<VerticalPlacement>; 54 55 /// 返回横向排列方式 56 fn horizontal_placement(&self) -> &Cell<HorizontalPlacement>; 57 58 /// 返回组件的名字 59 fn name(&self) -> &str; 60 61 /// 返回子组件数组 62 fn children(&self) -> &RefCell<Vec<Arc<dyn Widget>>>; 63 64 /// 添加子组件 65 fn add_child(&self, widget: Arc<dyn Widget>) { 66 (*self.children().borrow_mut()).push(widget); 67 self.arrange(); 68 } 69 70 /// 渲染组件 71 fn draw(&self, renderer: &mut dyn Renderer); 72 73 /// 更新组件状态 74 fn update(&self) {} 75 76 /// TODO 77 fn arrange(&self) {} 78 } 79