srb_gui 0.1.0

GUI for the Space Robotics Bench
use crate::env_cfg::TaskConfig;
use crate::gui_runtime_params::RuntimeParams;
use crate::gui_selection::GuiSelection;
use crate::page::Page;

#[derive(Clone, Debug, PartialEq)]
pub struct GuiSessionState {
    current_page: Page,
    show_about: bool,
    collect_trajectory: bool,
    runtime_params: RuntimeParams,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GuiSessionEpisodeRequest {
    pub collect_trajectory: bool,
    pub task_config: TaskConfig,
}

impl GuiSessionState {
    #[must_use]
    pub fn from_selection(selection: &GuiSelection) -> Self {
        Self {
            current_page: Page::default(),
            show_about: false,
            collect_trajectory: false,
            runtime_params: Self::default_runtime_params(selection.task_config()),
        }
    }

    #[must_use]
    pub fn current_page(&self) -> Page {
        self.current_page
    }

    pub fn select_page(&mut self, page: Page) {
        self.current_page = page;
        if page == Page::QuickStart {
            self.show_about = false;
        }
    }

    #[must_use]
    pub fn show_about(&self) -> bool {
        self.show_about
    }

    pub fn show_about_mut(&mut self) -> &mut bool {
        &mut self.show_about
    }

    pub fn collect_trajectory_mut(&mut self) -> &mut bool {
        &mut self.collect_trajectory
    }

    #[must_use]
    pub fn runtime_params(&self) -> RuntimeParams {
        self.runtime_params
    }

    pub fn runtime_params_mut(&mut self) -> &mut RuntimeParams {
        &mut self.runtime_params
    }

    pub fn set_runtime_params(&mut self, runtime_params: RuntimeParams) {
        self.runtime_params = runtime_params;
    }

    pub fn start_task(&mut self, task_config: &TaskConfig) {
        self.runtime_params.gravity = task_config.domain.gravity_magnitude();
    }

    #[must_use]
    pub fn restart_episode_request(&self, task_config: &TaskConfig) -> GuiSessionEpisodeRequest {
        GuiSessionEpisodeRequest {
            collect_trajectory: self.collect_trajectory,
            task_config: task_config.clone(),
        }
    }

    pub fn exit_to_tasks(&mut self, selection: &mut GuiSelection) -> GuiSessionEpisodeRequest {
        let request = self.restart_episode_request(selection.task_config());
        self.select_page(Page::QuickStart);
        self.collect_trajectory = false;
        selection.reset_task_config();
        self.runtime_params = Self::default_runtime_params(selection.task_config());
        request
    }

    fn default_runtime_params(task_config: &TaskConfig) -> RuntimeParams {
        RuntimeParams {
            gravity: task_config.domain.gravity_magnitude(),
            latency_ms: 0.0,
            motion_sensitivity: 1.0,
        }
    }
}