summaryrefslogtreecommitdiffstats
path: root/src/ui/topbar.rs
blob: 07c20a1c2a7d767363a9afcc3749174e474d2b41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use std::cell::RefCell;

use crate::{GameState, eguictx::EguiCtx, solar_system::{SolarSystem, SystemId}, timeman::{self, Second, TimeMan}};

#[derive(Default, Clone)]
pub struct TopBarState
{
    pub current_system: Option<SystemId>,
    pub auto_tick: Option<Second>,
    pub do_auto_tick: bool
}

impl TopBarState
{
    pub fn render(
        state: &mut TopBarState,
        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 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_tick;

                let timeman = game_state.timeman_mut();
                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() {
                            timeman.advance(seconds);
                        }

                        if ui.add(egui::Button::new(label.clone()).selected(auto_selected)).clicked() {
                            state.auto_tick = Some(seconds);
                        }
                    });
                });

                ui.checkbox(&mut state.do_auto_tick, "Auto");
            });
            ui.vertical_centered_justified(|ui| {
                let timeman = game_state.timeman_mut();
                let time_str = TimeMan::format_duration(timeman.seconds());
                ui.label(
                    egui::RichText::new(time_str)
                        .font(egui::FontId::monospace(16.0))
                    );
            });
        });
    }
}