mod component;
mod component_settings;
mod component_state;
pub mod editor;
mod general_settings;
mod layout_direction;
mod layout_settings;
mod layout_state;
pub mod parser;
pub use self::{
component::Component, component_settings::ComponentSettings, component_state::ComponentState,
editor::Editor, general_settings::GeneralSettings, layout_direction::LayoutDirection,
layout_settings::LayoutSettings, layout_state::LayoutState,
};
use crate::{
component::{previous_segment, splits, timer, title},
platform::prelude::*,
timing::Snapshot,
};
#[derive(Clone, Default)]
pub struct Layout {
pub components: Vec<Component>,
settings: GeneralSettings,
}
impl Layout {
pub fn new() -> Self {
Default::default()
}
pub fn default_layout() -> Self {
Self {
components: vec![
title::Component::new().into(),
splits::Component::new().into(),
timer::Component::new().into(),
previous_segment::Component::new().into(),
],
settings: GeneralSettings::default(),
}
}
pub fn from_settings(layout_settings: LayoutSettings) -> Self {
Self {
components: layout_settings
.components
.into_iter()
.map(Into::into)
.collect(),
settings: layout_settings.general,
}
}
pub const fn general_settings(&self) -> &GeneralSettings {
&self.settings
}
pub fn general_settings_mut(&mut self) -> &mut GeneralSettings {
&mut self.settings
}
pub fn push<C: Into<Component>>(&mut self, component: C) {
self.components.push(component.into());
}
pub fn update_state(&mut self, state: &mut LayoutState, timer: &Snapshot<'_>) {
let settings = &self.settings;
state.components.truncate(self.components.len());
let mut components = self.components.iter_mut();
for (state, component) in state.components.iter_mut().zip(components.by_ref()) {
component.update_state(state, timer, settings);
}
state
.components
.extend(components.map(|c| c.state(timer, settings)));
state.timer_font.clone_from(&settings.timer_font);
state.times_font.clone_from(&settings.times_font);
state.text_font.clone_from(&settings.text_font);
state.background = settings.background;
state.thin_separators_color = settings.thin_separators_color;
state.separators_color = settings.separators_color;
state.text_color = settings.text_color;
state.direction = settings.direction;
}
pub fn state(&mut self, timer: &Snapshot<'_>) -> LayoutState {
let mut state = Default::default();
self.update_state(&mut state, timer);
state
}
pub fn settings(&self) -> LayoutSettings {
LayoutSettings {
components: self.components.iter().map(Component::settings).collect(),
general: self.settings.clone(),
}
}
pub fn scroll_up(&mut self) {
for component in &mut self.components {
component.scroll_up();
}
}
pub fn scroll_down(&mut self) {
for component in &mut self.components {
component.scroll_down();
}
}
pub fn remount(&mut self) {
for component in &mut self.components {
component.remount();
}
}
}