Gunnar

mikronova/kyokkou

src/app.rs

use crate::art_scenes::ArtScenes;
use crate::common::Scene;
use crate::data_graphs::DataGraphs;
use crate::rack_topology::RackTopology;
use crate::renderer::{RenderState, Renderer};
use crate::system_topology::SystemTopology;

#[derive(Debug, Clone, PartialEq)]
enum Flik {
    ArtScenes,
    SystemTopology,
    DataGraphs,
    RackTopology,
}

pub struct KokkouApp {
    active_flik:     Flik,
    art_scenes:      ArtScenes,
    system_topology: SystemTopology,
    data_graphs:     DataGraphs,
    rack_topology:   RackTopology,
    renderer:        Renderer,
}

impl Default for KokkouApp {
    fn default() -> Self {
        Self {
            active_flik:     Flik::ArtScenes,
            art_scenes:      ArtScenes::default(),
            system_topology: SystemTopology::default(),
            data_graphs:     DataGraphs::default(),
            rack_topology:   RackTopology::default(),
            renderer:        Renderer::default(),
        }
    }
}

impl eframe::App for KokkouApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::TopBottomPanel::top("flikar").show(ctx, |ui| {
            ui.horizontal(|ui| {
                ui.selectable_value(&mut self.active_flik, Flik::ArtScenes,      "Art scenes");
                ui.selectable_value(&mut self.active_flik, Flik::SystemTopology, "System topology");
                ui.selectable_value(&mut self.active_flik, Flik::DataGraphs,     "Data graphs");
                ui.selectable_value(&mut self.active_flik, Flik::RackTopology,   "Rack topology");
            });
        });

        egui::TopBottomPanel::bottom("render_status").show(ctx, |ui| {
            let state = self.renderer.state.lock().unwrap().clone();
            match &state {
                RenderState::Idle            => { ui.label("Ready"); }
                RenderState::Rendering       => { ui.label("Rendering..."); }
                RenderState::Done(path)      => { ui.colored_label(egui::Color32::GREEN, format!("Done: {path}")); }
                RenderState::Error(e)        => { ui.colored_label(egui::Color32::RED,   format!("Error: {e}")); }
            }
        });

        let result = egui::CentralPanel::default().show(ctx, |ui| {
            match self.active_flik {
                Flik::ArtScenes      => self.art_scenes.show(ui),
                Flik::SystemTopology => self.system_topology.show(ui),
                Flik::DataGraphs     => self.data_graphs.show(ui),
                Flik::RackTopology   => self.rack_topology.show(ui),
            }
        });

        if let Some(yaml) = result.inner {
            self.renderer.submit(yaml, ctx.clone());
        }
    }
}