codegame 0.6.0

CodeGame framework
Documentation
use super::*;
use geng::ui;

mod fullscreen_button;
mod play_stop_button;
mod timeline;
mod view_speed;
mod volume;

use fullscreen_button::*;
use play_stop_button::*;
use timeline::*;
pub use view_speed::*;
use volume::*;

const UI_SIZE: f64 = 32.0;
const UI_PADDING: f64 = 8.0;

fn create_texture(context: &Rc<Geng>, f: impl FnOnce(&mut ugli::Framebuffer)) -> ugli::Texture {
    let mut texture = ugli::Texture::new_uninitialized(context.ugli(), vec2(32, 32));
    {
        let mut framebuffer = ugli::Framebuffer::new(
            context.ugli(),
            ugli::ColorAttachment::Texture(&mut texture),
            ugli::DepthAttachment::None,
        );
        ugli::clear(
            &mut framebuffer,
            Some(Color::rgba(1.0, 1.0, 1.0, 0.0)),
            None,
        );
        f(&mut framebuffer);
    }
    texture
}

pub struct UI {
    play_stop_button: PlayStopButton,
    fullscreen_button: FullscreenButton,
    timeline: Timeline,
    view_speed: ViewSpeedControl,
    volume: VolumeControl,
}

impl UI {
    pub fn new(
        geng: &Rc<Geng>,
        paused: &Rc<Cell<bool>>,
        view_speed_modifier: &Rc<Cell<f64>>,
        volume: &Rc<Cell<f64>>,
    ) -> Self {
        let theme = Rc::new(ui::Theme::default(geng));
        let theme = &theme;
        Self {
            play_stop_button: PlayStopButton::new(geng, theme, paused),
            fullscreen_button: FullscreenButton::new(geng, theme),
            timeline: Timeline::new(geng, theme),
            view_speed: ViewSpeedControl::new(geng, theme, view_speed_modifier),
            volume: VolumeControl::new(geng, theme, volume),
        }
    }

    pub fn timeline_change(&self) -> Option<f64> {
        self.timeline.change()
    }

    pub fn set_time(&mut self, time: f64, max_time: f64, ticks_per_second: f64) {
        self.timeline.set_time(time, max_time, ticks_per_second);
    }

    pub fn ui<'a>(&'a mut self, default_tps: f64) -> impl ui::Widget + 'a {
        use ui::*;
        geng::ui::row![
            self.play_stop_button.ui(),
            self.timeline.ui(),
            self.view_speed.ui(default_tps),
            self.volume.ui(),
            self.fullscreen_button.ui(),
        ]
        .align(vec2(0.5, 0.0))
    }
}