use std::cell::RefCell; use crate::{GameState, eguictx::EguiCtx, solar_system::SystemId, timeman::{self, Second, TimeMan}}; #[derive(Default, Clone)] pub struct TopBarState { pub current_system: Option, pub auto_tick: Option, pub do_auto_tick: bool, pub bodies_window_visible: bool, pub fleet_window_visible: bool, } #[derive(Default, Clone)] pub struct TopBarAction { pub advance_tick: Option, } impl TopBarState { pub fn render( &mut self, game_state: &GameState, eguictx: &EguiCtx) -> TopBarAction { let mut action: TopBarAction = TopBarAction::default(); let solar_systems = game_state.solar_systems(); let timeman = game_state.timeman(); egui::TopBottomPanel::top("topbar").show( eguictx.context(), |ui| { ui.horizontal(|ui| { ui.vertical(|ui| { let selected_system_label = match self.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 self.current_system, Some(i), system.name() ); } }); ui.horizontal(|ui| { self.paint_empire_buttons(ui); }); }); self.paint_tick_buttons(&mut action, timeman, ui); }); ui.vertical_centered_justified(|ui| { let time_str = TimeMan::format_duration(timeman.seconds()); ui.label( egui::RichText::new(time_str) .font(egui::FontId::monospace(16.0)) ); }); }); action } pub fn paint_empire_buttons( &mut self, ui: &mut egui::Ui) { if ui.add(egui::Button::new("Bodies").selected(self.bodies_window_visible)).clicked() { self.bodies_window_visible = !self.bodies_window_visible; } if ui.add(egui::Button::new("Fleets").selected(self.fleet_window_visible)).clicked() { self.fleet_window_visible = !self.fleet_window_visible; } } pub fn paint_tick_buttons( &mut self, action: &mut TopBarAction, timeman: &TimeMan, ui: &mut egui::Ui) { 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 = self.auto_tick; ui.vertical(|ui| { ui.label("Manual"); ui.checkbox(&mut self.do_auto_tick, "Auto"); }); 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() { action.advance_tick = Some(seconds); } if ui.add(egui::Button::new(label.clone()).selected(auto_selected)).clicked() { self.auto_tick = Some(seconds); } }); }); } }