1use super::{FrameVisuals, Theme, ThemeKind};
2use egui::{Color32, ComboBox, Frame, Response, Sense, Stroke, Ui};
3
4pub const TINT_1: Color32 = Color32::from_rgba_premultiplied(216, 216, 216, 255);
8
9pub fn change_theme(current_theme: &Theme, ui: &mut Ui) -> Option<Theme> {
13 let mut new_theme_opt = None;
14 ComboBox::from_label("Theme")
15 .selected_text(current_theme.kind.to_str())
16 .show_ui(ui, |ui| {
17 for kind in ThemeKind::to_vec() {
18 if ui.selectable_label(current_theme.kind == kind, kind.to_str()).clicked() {
19 let new_theme = Theme::new(kind);
20 ui.ctx().set_global_style(new_theme.style.clone());
21 new_theme_opt = Some(new_theme);
22 }
23 }
24 });
25 new_theme_opt
26}
27
28pub fn apply_theme_changes(theme: &mut Theme, ui: &mut Ui) {
30 theme.set_window_frame_colors();
31 theme.set_frame1_colors();
32 theme.set_frame2_colors();
33
34 ui.style_mut().visuals = theme.style.visuals.clone();
35}
36
37pub fn no_border_on_idle(ui: &mut Ui) {
43 ui.visuals_mut().widgets.inactive.bg_stroke = Stroke::NONE;
44}
45
46pub fn no_border_on_click(ui: &mut Ui) {
50 ui.visuals_mut().widgets.active.bg_stroke = Stroke::NONE;
51}
52
53pub fn no_border_on_hover(ui: &mut Ui) {
57 ui.visuals_mut().widgets.hovered.bg_stroke = Stroke::NONE;
58}
59
60pub fn no_border(ui: &mut Ui) {
64 ui.visuals_mut().widgets.inactive.bg_stroke = Stroke::NONE;
65 ui.visuals_mut().widgets.active.bg_stroke = Stroke::NONE;
66 ui.visuals_mut().widgets.hovered.bg_stroke = Stroke::NONE;
67}
68
69pub fn border_on_idle(ui: &mut Ui, width: f32, color: Color32) {
73 ui.visuals_mut().widgets.inactive.bg_stroke = Stroke::new(width, color);
74}
75
76pub fn border_on_click(ui: &mut Ui, width: f32, color: Color32) {
80 ui.visuals_mut().widgets.active.bg_stroke = Stroke::new(width, color);
81}
82
83pub fn border_on_open(ui: &mut Ui, width: f32, color: Color32) {
87 ui.visuals_mut().widgets.open.bg_stroke = Stroke::new(width, color);
88}
89
90pub fn border_on_hover(ui: &mut Ui, width: f32, color: Color32) {
94 ui.visuals_mut().widgets.hovered.bg_stroke = Stroke::new(width, color);
95}
96
97pub fn bg_color_on_idle(ui: &mut Ui, color: Color32) {
101 ui.visuals_mut().widgets.inactive.weak_bg_fill = color;
102}
103
104pub fn bg_color_on_hover(ui: &mut Ui, color: Color32) {
108 ui.visuals_mut().widgets.hovered.weak_bg_fill = color;
109}
110
111pub fn bg_color_on_click(ui: &mut Ui, color: Color32) {
115 ui.visuals_mut().widgets.active.weak_bg_fill = color;
116}
117
118pub fn bg_color_on_open(ui: &mut Ui, color: Color32) {
120 ui.visuals_mut().widgets.open.weak_bg_fill = color;
121}
122
123pub fn window_fill(ui: &mut Ui, color: Color32) {
127 ui.visuals_mut().window_fill = color;
128}
129
130pub fn window_border(ui: &mut Ui, width: f32, color: Color32) {
134 ui.visuals_mut().window_stroke = Stroke::new(width, color);
135}
136
137pub fn frame_it(
139 frame: &mut Frame,
140 visuals: Option<FrameVisuals>,
141 ui: &mut Ui,
142 add_contents: impl FnOnce(&mut Ui),
143) -> Response {
144 let mut frame = frame.begin(ui);
145 let res = frame.content_ui.scope(|ui| add_contents(ui));
146
147 if let Some(visuals) = visuals {
148 if res.response.interact(Sense::click()).clicked() {
149 frame.frame = frame.frame.fill(visuals.bg_on_click);
150 frame.frame = frame.frame.stroke(Stroke::new(
151 visuals.border_on_click.0,
152 visuals.border_on_click.1,
153 ));
154 } else if res.response.hovered() {
155 frame.frame = frame.frame.fill(visuals.bg_on_hover);
156 frame.frame = frame.frame.stroke(Stroke::new(
157 visuals.border_on_hover.0,
158 visuals.border_on_hover.1,
159 ));
160 }
161 }
162 frame.end(ui);
163 res.response
164}