blockworx/
preferences_menu.rs1use egui::{FontFamily, RichText, TextWrapMode, Ui};
6
7use blockworx_paint::{FontChoice, Mode, Scheme};
8
9use crate::preferences::Preferences;
10
11fn no_wrap(ui: &mut Ui) {
17 ui.style_mut().wrap_mode = Some(TextWrapMode::Extend);
18}
19
20pub fn menu(ui: &mut Ui, prefs: &mut Preferences) {
22 no_wrap(ui);
23 ui.menu_button("Mode", |ui| mode_menu(ui, prefs));
24 ui.menu_button("Theme", |ui| theme_menu(ui, prefs));
25 ui.menu_button("Font", |ui| font_menu(ui, prefs));
26}
27
28fn mode_menu(ui: &mut Ui, prefs: &mut Preferences) {
29 no_wrap(ui);
30 for mode in Mode::ALL {
31 let label = format!("{} {}", mode.glyph(), mode.display_name());
33 if ui.selectable_label(mode == prefs.mode, label).clicked() {
34 prefs.mode = mode;
35 }
36 }
37}
38
39fn theme_menu(ui: &mut Ui, prefs: &mut Preferences) {
40 no_wrap(ui);
41 for theme in Scheme::ALL {
42 if ui
43 .selectable_label(theme == prefs.theme, theme.display_name())
44 .clicked()
45 {
46 prefs.theme = theme;
47 }
48 }
49}
50
51fn font_menu(ui: &mut Ui, prefs: &mut Preferences) {
52 no_wrap(ui);
53 for choice in FontChoice::ALL {
54 let label = RichText::new(choice.display_name())
56 .family(FontFamily::Name(choice.family_name().into()));
57 if ui.selectable_label(choice == prefs.font, label).clicked() {
58 prefs.font = choice;
59 }
60 }
61}