1use egui::{Color32, CornerRadius, Response, Shadow, Stroke};
2
3pub type LabelVisuals = ButtonVisuals;
4
5#[derive(Copy, Clone, Debug, Default)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct ButtonVisuals {
9 pub text: Color32,
10 pub bg: Color32,
11 pub bg_hover: Color32,
12 pub bg_click: Color32,
13 pub bg_selected: Color32,
14 pub border: Stroke,
15 pub border_hover: Stroke,
16 pub border_click: Stroke,
17 pub corner_radius: CornerRadius,
18 pub shadow: Shadow,
19}
20
21impl PartialEq for ButtonVisuals {
22 fn eq(&self, other: &Self) -> bool {
23 self.text == other.text
24 && self.bg == other.bg
25 && self.bg_hover == other.bg_hover
26 && self.bg_click == other.bg_click
27 && self.bg_selected == other.bg_selected
28 && self.border == other.border
29 && self.border_hover == other.border_hover
30 && self.border_click == other.border_click
31 && self.corner_radius == other.corner_radius
32 && self.shadow == other.shadow
33 }
34}
35
36impl Eq for ButtonVisuals {}
37
38impl ButtonVisuals {
39 pub fn bg_from_res(&self, res: &Response) -> Color32 {
40 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
41 self.bg_click
42 } else if res.hovered() || res.highlighted() {
43 self.bg_hover
44 } else {
45 self.bg
46 }
47 }
48
49 pub fn border_from_res(&self, res: &Response) -> Stroke {
50 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
51 self.border_click
52 } else if res.hovered() || res.highlighted() {
53 self.border_hover
54 } else {
55 self.border
56 }
57 }
58}
59
60#[derive(Copy, Clone, Debug, Default)]
62#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
63pub struct TextEditVisuals {
64 pub text: Color32,
65 pub bg: Color32,
66 pub border: Stroke,
67 pub border_hover: Stroke,
68 pub border_open: Stroke,
69 pub corner_radius: CornerRadius,
70 pub shadow: Shadow,
71}
72
73impl PartialEq for TextEditVisuals {
74 fn eq(&self, other: &Self) -> bool {
75 self.text == other.text
76 && self.bg == other.bg
77 && self.border == other.border
78 && self.border_hover == other.border_hover
79 && self.border_open == other.border_open
80 && self.corner_radius == other.corner_radius
81 && self.shadow == other.shadow
82 }
83}
84
85impl Eq for TextEditVisuals {}
86
87impl TextEditVisuals {
88 pub fn border_from_res(&self, res: &Response) -> Stroke {
89 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
90 self.border_open
91 } else if res.hovered() || res.highlighted() {
92 self.border_hover
93 } else {
94 self.border
95 }
96 }
97}
98
99#[derive(Copy, Clone, Debug, Default)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
102pub struct ComboBoxVisuals {
103 pub bg: Color32,
104 pub icon: Color32,
105 pub bg_hover: Color32,
106 pub bg_open: Color32,
107 pub border: Stroke,
108 pub border_hover: Stroke,
109 pub border_open: Stroke,
110 pub corner_radius: CornerRadius,
111 pub shadow: Shadow,
112}
113
114impl PartialEq for ComboBoxVisuals {
115 fn eq(&self, other: &Self) -> bool {
116 self.bg == other.bg
117 && self.icon == other.icon
118 && self.bg_hover == other.bg_hover
119 && self.bg_open == other.bg_open
120 && self.border == other.border
121 && self.border_hover == other.border_hover
122 && self.border_open == other.border_open
123 && self.corner_radius == other.corner_radius
124 && self.shadow == other.shadow
125 }
126}
127
128impl Eq for ComboBoxVisuals {}
129
130impl ComboBoxVisuals {
131 pub fn bg_from_res(&self, res: &Response) -> Color32 {
132 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
133 self.bg_open
134 } else if res.hovered() || res.highlighted() {
135 self.bg_hover
136 } else {
137 self.bg
138 }
139 }
140
141 pub fn border_from_res(&self, res: &Response) -> Stroke {
142 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
143 self.border_open
144 } else if res.hovered() || res.highlighted() {
145 self.border_hover
146 } else {
147 self.border
148 }
149 }
150}
151
152#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
153#[derive(Clone, Copy, Debug, Default)]
154pub struct FrameVisuals {
155 pub bg_on_hover: Color32,
156 pub bg_on_click: Color32,
157 pub border_on_hover: (f32, Color32),
158 pub border_on_click: (f32, Color32),
159}
160
161impl PartialEq for FrameVisuals {
162 fn eq(&self, other: &Self) -> bool {
163 self.bg_on_hover == other.bg_on_hover
164 && self.bg_on_click == other.bg_on_click
165 && self.border_on_hover == other.border_on_hover
166 && self.border_on_click == other.border_on_click
167 }
168}
169
170impl Eq for FrameVisuals {}