Skip to content
Snippets Groups Projects
s1_title.rs 2.5 KiB
Newer Older
Finn Bear's avatar
Finn Bear committed
use crate::component::image::Image;
Finn Bear's avatar
Finn Bear committed
use crate::egui::{Align2, Context};
use crate::fade_in::fade_in;
Finn Bear's avatar
Finn Bear committed
use crate::slide::Slide;
Finn Bear's avatar
Finn Bear committed
use crate::{ctx_img, Margin};
use eframe::egui::{Frame, TextureHandle, Ui, Vec2, Window};
Finn Bear's avatar
Finn Bear committed

Finn Bear's avatar
Finn Bear committed
/// The first slide in the cartoon.
Finn Bear's avatar
Finn Bear committed
#[derive(Default)]
pub struct Title {
Finn Bear's avatar
Finn Bear committed
    examples: Vec<TextureHandle>,
Finn Bear's avatar
Finn Bear committed
    state: TitleState,
}

#[derive(Default)]
enum TitleState {
    #[default]
    Initial,
    Title {
        // When we started fading in the title.
        fade_start: f64,
    },
Finn Bear's avatar
Finn Bear committed
}

impl Slide for Title {
Finn Bear's avatar
Finn Bear committed
    fn transition(&mut self, ctx: &Context) -> bool {
        match &self.state {
            TitleState::Initial => {
                self.state = TitleState::Title {
                    fade_start: ctx.input().time,
                }
            }
            TitleState::Title { .. } => return true,
        }
        false
    }

    fn show(&mut self, ui: &mut Ui) {
Finn Bear's avatar
Finn Bear committed
        if self.examples.is_empty() {
Finn Bear's avatar
Finn Bear committed
            // For now, these images are somewhat like placeholders.
Finn Bear's avatar
Finn Bear committed
            self.examples = vec![
Finn Bear's avatar
Finn Bear committed
                ctx_img!(ui.ctx(), "raymarching0.png"),
                ctx_img!(ui.ctx(), "raymarching1.png"),
                ctx_img!(ui.ctx(), "atom0.png"),
                ctx_img!(ui.ctx(), "atom1.png"),
                ctx_img!(ui.ctx(), "atom2.png"),
Finn Bear's avatar
Finn Bear committed
            ];
        }

Finn Bear's avatar
Finn Bear committed
        for example in &self.examples {
Finn Bear's avatar
Finn Bear committed
            Image::default().show(ui, example);
Finn Bear's avatar
Finn Bear committed
        }
Finn Bear's avatar
Finn Bear committed

Finn Bear's avatar
Finn Bear committed
        if let &TitleState::Title { fade_start } = &self.state {
            fade_in(ui, fade_start, |ui| {
                ui.scope(|ui| {
                    // Extra large margins for title window.
                    ui.style_mut().spacing.window_margin = Margin::same(20.0);

                    Window::new("title")
                        .title_bar(false)
                        .resizable(false)
                        .anchor(Align2::CENTER_CENTER, Vec2::ZERO)
                        .default_width(400.0)
                        .frame(Frame::window(ui.style()))
                        .show(ui.ctx(), |ui| {
                            // Nested fade since fade doesn't propagate through window.
                            fade_in(ui, fade_start, |ui| {
                                ui.vertical_centered(|ui| {
                                    ui.heading("Generative Art");
                                    ui.label("By: Finn, Matthew, Nathan, Owen");
                                });
                            });
                        });
Finn Bear's avatar
Finn Bear committed
                });
Finn Bear's avatar
Finn Bear committed
            });
Finn Bear's avatar
Finn Bear committed
        }
Finn Bear's avatar
Finn Bear committed
    }
}