use std::cell::RefCell; use cgmath::Vector3; use crate::{GameState, eguictx::EguiCtx, solar_system, timeman::{Second, TimeMan}}; #[derive(Default, Clone)] pub struct GameWindowUiState { pub current_system: Option, pub camera_scale: f32, pub camera_target: Option, pub auto_time: Option, pub do_auto_tick: bool } impl GameWindowUiState { pub fn render( old_state: &GameWindowUiState, game_state: &RefCell, eguictx: &EguiCtx) -> Self { let mut new_state = old_state.clone(); { GameWindowUiState::render_topbar(&mut new_state, game_state, eguictx); } new_state } fn render_topbar( state: &mut GameWindowUiState, game_state: &RefCell, eguictx: &EguiCtx) { let mut game_state = game_state.borrow_mut(); egui::TopBottomPanel::top("topbar").show( eguictx.context(), |ui| { ui.horizontal(|ui| { ui.menu_button("File", |ui| { }); }); ui.horizontal(|ui| { let solar_systems = game_state.solar_systems(); let selected_label = match state.current_system { Some(id) => solar_systems[id].name(), None => "" }; egui::ComboBox::from_label("Current System") .selected_text(selected_label) .show_ui(ui, |ui| { for (i, system) in solar_systems.iter().enumerate() { ui.selectable_value( &mut state.current_system, Some(i), system.name() ); } }); }); ui.horizontal(|ui| { ui.label(format!("Time: {}", TimeMan::format_duration(game_state.timeman().seconds()))); let button_seconds = [1, 5, 30, 60, 60*5, 60*30, 60*60, 60*60*24, 60*60*24*5, 60*60*24*30]; 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); } }); }); }); }); } }