Skip to main content

zeus_theme/
visuals.rs

1use egui::{Color32, CornerRadius, Response, Shadow, Stroke};
2
3pub type LabelVisuals = ButtonVisuals;
4
5/// Visuals for a button
6#[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/// Visuals for a TextEdit
61#[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/// Visuals for a ComboBox
100#[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 {}