summaryrefslogtreecommitdiffstats
path: root/src/ui.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs114
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");
+ });
+ });
+ }
+}