diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-22 10:51:13 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-04-22 10:51:13 -0400 |
| commit | 3d3864171785c589872bf23faaaa3a421f56ee4e (patch) | |
| tree | 4c4a927473ee1a58f23fff1e8ece8327a31d719a /src/ui.rs | |
| parent | 3dc92fad981e28c760f3c6e95f5a8153ea6c9be4 (diff) | |
| download | systemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.tar.gz systemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.tar.bz2 systemic4x-3d3864171785c589872bf23faaaa3a421f56ee4e.zip | |
complete orbit camera. add most large solar bodies
Diffstat (limited to 'src/ui.rs')
| -rw-r--r-- | src/ui.rs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..f6f7721 --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,114 @@ +pub mod camera_info; + +use std::cell::RefCell; + +use cgmath::Vector3; + +use crate::{GameState, eguictx::EguiCtx, solar_system, timeman::{self, Second, TimeMan}, ui::camera_info::CameraWindowState}; + +mod ui { + pub use super::camera_info; +} + +#[derive(Default, Clone)] +pub struct State +{ + pub current_system: Option<solar_system::SystemId>, + pub auto_time: Option<Second>, + pub do_auto_tick: bool, + + pub camera_info: CameraWindowState +} + +impl State +{ + pub fn render( + &mut self, + game_state: &RefCell<GameState>, + eguictx: &EguiCtx) + { + State::render_topbar(self, game_state, eguictx); + + CameraWindowState::render( + self, + game_state, + eguictx); + } + + fn render_topbar( + state: &mut State, + game_state: &RefCell<GameState>, + eguictx: &EguiCtx) + { + let mut game_state = game_state.borrow_mut(); + + egui::TopBottomPanel::top("topbar").show( + eguictx.context(), + |ui| { + + ui.horizontal(|ui| { + let solar_systems = game_state.solar_systems(); + let selected_system_label = match state.current_system { + Some(id) => solar_systems[id].name(), + None => "" + }; + + egui::ComboBox::from_label("Current System") + .selected_text(selected_system_label) + .show_ui(ui, |ui| { + + for (i, system) in solar_systems.iter().enumerate() { + ui.selectable_value( + &mut state.current_system, + Some(i), + system.name() + ); + } + }); + + let current_system = match state.current_system { + Some(id) => &solar_systems[id], + None => return + }; + }); + + ui.horizontal(|ui| { + ui.label(format!("Time: {: <16}", TimeMan::format_duration(game_state.timeman().seconds()))); + + let button_seconds = [ + 1, + 5, + 30, + timeman::MINUTE, + timeman::MINUTE * 5, + timeman::MINUTE * 30, + timeman::HOUR, + timeman::DAY, + timeman::DAY * 5, + timeman::YEAR + ]; + let selected_button = state.auto_time; + + button_seconds.iter().for_each(|&seconds| { + ui.vertical(|ui| { + let auto_selected = match selected_button { + Some(o) => o == seconds, + None => false + }; + let label = TimeMan::format_duration(seconds); + + if ui.button(label.clone()).clicked() { + game_state.timeman_mut().advance(seconds); + } + + if ui.add(egui::Button::new(label.clone()).selected(auto_selected)).clicked() { + state.auto_time = Some(seconds); + } + }); + }); + + ui.checkbox(&mut state.do_auto_tick, "Auto"); + }); + }); + } +} |
