use crate::settings::{KNOBS, Kind, Knob, Knobbed, Settings};
use crate::ui::{Lookup, Model, theme};
pub const WORD: &str = "settings";
pub const SUMMARY: &str = "this seat's own knobs — the wheel, the bar, the help, the look — Ctrl+,";
pub const HEADING: &str = "this seat's settings";
pub const PINNED: &str = "bar pinned open";
pub const PINNED_HELP: &str = "keeps the bar open whatever the pointer does — the pin at its head";
pub const DEFAULTS: &str = "defaults";
pub const DEFAULTS_HELP: &str = "puts every knob above back to its default; the pin stays";
pub fn render(ui: &mut egui::Ui, model: &mut Model) -> bool {
if model.lookup != Some(Lookup::Settings) {
return false;
}
crate::ui::overlay::name(ui, HEADING);
egui::ScrollArea::vertical()
.id_salt(HEADING)
.auto_shrink(false)
.show(ui, |ui| {
for knob in KNOBS {
row(ui, &mut model.settings, knob);
}
theme::paint::toggle(ui, &mut model.bar.pinned, PINNED, PINNED_HELP);
sentence(ui, PINNED_HELP);
ui.add_space(theme::space::S);
if theme::paint::link(ui, DEFAULTS, theme::INK_WEAK, DEFAULTS_HELP).clicked() {
model.settings = Settings::default();
}
});
true
}
fn row(ui: &mut egui::Ui, settings: &mut Settings, knob: &Knob) {
match (knob.kind, (knob.get)(settings)) {
(Kind::Toggle, Knobbed::On(mut on)) => {
let seat = theme::paint::toggle(ui, &mut on, knob.label, knob.help);
written(settings, knob, seat.changed(), Knobbed::On(on));
}
(
Kind::Number {
unit,
floor,
ceiling,
step,
},
Knobbed::At(mut at),
) => {
ui.horizontal(|ui| {
ui.label(knob.label);
let help = if knob.key == crate::settings::SCALE_KEY {
crate::ui::keys::cited(
knob.help,
&[
crate::ui::keys::Act::ScaleUp,
crate::ui::keys::Act::ScaleDown,
crate::ui::keys::Act::ScaleReset,
],
)
} else {
knob.help.to_owned()
};
let seat = theme::paint::slider(ui, &mut at, (floor, ceiling, step), unit, &help);
written(settings, knob, seat.changed(), Knobbed::At(at));
});
}
_ => {}
}
sentence(ui, knob.help);
ui.add_space(theme::space::XS);
}
fn written(settings: &mut Settings, knob: &Knob, changed: bool, value: Knobbed) {
if changed {
(knob.set)(settings, value);
}
}
fn sentence(ui: &mut egui::Ui, help: &str) {
ui.add(egui::Label::new(egui::RichText::new(help).color(theme::INK_WEAK)).wrap());
}
#[cfg(test)]
mod tests;