xref: /StarryEngine/starry_toolkit/src/widgets/mod.rs (revision 48d97639c61db7d12182c250896dd116973d24c5)
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