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 ButtonVisuals {
22 pub fn bg_from_res(&self, res: &Response) -> Color32 {
23 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
24 self.bg_click
25 } else if res.hovered() || res.highlighted() {
26 self.bg_hover
27 } else {
28 self.bg
29 }
30 }
31
32 pub fn border_from_res(&self, res: &Response) -> Stroke {
33 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
34 self.border_click
35 } else if res.hovered() || res.highlighted() {
36 self.border_hover
37 } else {
38 self.border
39 }
40 }
41}
42
43#[derive(Copy, Clone, Debug, Default)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct TextEditVisuals {
47 pub text: Color32,
48 pub bg: Color32,
49 pub border: Stroke,
50 pub border_hover: Stroke,
51 pub border_open: Stroke,
52 pub corner_radius: CornerRadius,
53 pub shadow: Shadow,
54}
55
56impl TextEditVisuals {
57 pub fn border_from_res(&self, res: &Response) -> Stroke {
58 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
59 self.border_open
60 } else if res.hovered() || res.highlighted() {
61 self.border_hover
62 } else {
63 self.border
64 }
65 }
66}
67
68#[derive(Copy, Clone, Debug, Default)]
70#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
71pub struct ComboBoxVisuals {
72 pub bg: Color32,
73 pub icon: Color32,
74 pub bg_hover: Color32,
75 pub bg_open: Color32,
76 pub border: Stroke,
77 pub border_hover: Stroke,
78 pub border_open: Stroke,
79 pub corner_radius: CornerRadius,
80 pub shadow: Shadow,
81}
82
83impl ComboBoxVisuals {
84 pub fn bg_from_res(&self, res: &Response) -> Color32 {
85 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
86 self.bg_open
87 } else if res.hovered() || res.highlighted() {
88 self.bg_hover
89 } else {
90 self.bg
91 }
92 }
93
94 pub fn border_from_res(&self, res: &Response) -> Stroke {
95 if res.is_pointer_button_down_on() || res.has_focus() || res.clicked() {
96 self.border_open
97 } else if res.hovered() || res.highlighted() {
98 self.border_hover
99 } else {
100 self.border
101 }
102 }
103}
104
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
106#[derive(Clone, Copy, Debug, Default)]
107pub struct FrameVisuals {
108 pub bg_on_hover: Color32,
109 pub bg_on_click: Color32,
110 pub border_on_hover: (f32, Color32),
111 pub border_on_click: (f32, Color32),
112}