use super::gantz::{LayoutConfig, SceneConfig, ViewToggles};
use crate::{Keymap, Responses};
pub trait SettingsTab {
fn title(&self) -> &str;
fn ui(&mut self, ui: &mut egui::Ui) -> Responses;
}
#[derive(Clone, Default, PartialEq, Eq)]
enum SubTab {
#[default]
Global,
Style,
Keybinds,
Panes,
Ext(String),
}
#[derive(Default)]
pub struct SettingsResponse {
pub compile_config: Option<gantz_core::compile::Config>,
pub validate_change_tracking: Option<bool>,
pub reset_all_demos: bool,
pub reset_layout: bool,
pub responses: Responses,
}
pub fn settings(
view: &mut ViewToggles,
compile_config: Option<gantz_core::compile::Config>,
validate_change_tracking: Option<bool>,
layout_config: &mut LayoutConfig,
scene_config: &mut SceneConfig,
keymap: &mut Keymap,
ext_tabs: &mut [&mut dyn SettingsTab],
ext_panes: &[super::ExtPaneEntry],
ui: &mut egui::Ui,
) -> SettingsResponse {
let id = ui.id().with("settings_subtab");
let mut tab = ui.data(|d| d.get_temp::<SubTab>(id)).unwrap_or_default();
if let SubTab::Ext(ref name) = tab {
if !ext_tabs.iter().any(|t| t.title() == name) {
tab = SubTab::Global;
}
}
ui.horizontal(|ui| {
let mut tab_label = |ui: &mut egui::Ui, this: SubTab, label: &str| {
let color = if tab == this {
ui.visuals().strong_text_color()
} else {
ui.visuals().weak_text_color()
};
let resp = ui
.add(
egui::Label::new(egui::RichText::new(label).color(color))
.sense(egui::Sense::click())
.selectable(false),
)
.on_hover_cursor(egui::CursorIcon::PointingHand);
if resp.clicked() {
tab = this;
}
};
tab_label(ui, SubTab::Global, "Global");
tab_label(ui, SubTab::Style, "Style");
tab_label(ui, SubTab::Keybinds, "Keybinds");
tab_label(ui, SubTab::Panes, "Panes");
for t in ext_tabs.iter() {
let title = t.title();
tab_label(ui, SubTab::Ext(title.to_string()), title);
}
});
ui.separator();
let mut res = SettingsResponse::default();
match tab {
SubTab::Panes => {
egui::Panel::bottom(id.with("reset"))
.show_separator_line(false)
.frame(egui::Frame::NONE)
.show_inside(ui, |ui| {
res.reset_layout = super::reset_layout_button(ui);
});
egui::CentralPanel::default()
.frame(egui::Frame::NONE)
.show_inside(ui, |ui| {
egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| super::panes_config(view, ext_panes, ui));
});
}
SubTab::Style => {
egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| super::style_config(&mut scene_config.grid, ui));
}
SubTab::Keybinds => {
egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| super::keybinds_config(keymap, ui));
}
SubTab::Global => {
let g = egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| {
super::global_config(
compile_config,
validate_change_tracking,
layout_config,
&mut scene_config.snap,
&mut scene_config.align,
ui,
)
})
.inner;
res.compile_config = g.compile_config;
res.validate_change_tracking = g.validate_change_tracking;
res.reset_all_demos = g.reset_all_demos;
}
SubTab::Ext(ref name) => {
if let Some(t) = ext_tabs.iter_mut().find(|t| t.title() == name) {
res.responses = egui::ScrollArea::vertical()
.auto_shrink([false, false])
.show(ui, |ui| t.ui(ui))
.inner;
}
}
}
ui.data_mut(|d| d.insert_temp(id, tab));
res
}