gled 2.6.1

gled is an application for creating animations and effects on artnet or wled light installations
use super::App;
use crate::{
    storage::{
        asset::{project::scene_instance_path::SceneInstancePath, scene::Scene},
        asset_id::AssetId,
    },
    ui::{ChangeButton, action},
};
use egui::{Color32, RichText, Slider, Ui};

impl App {
    pub fn effects_header(&mut self, ui: &mut Ui, path: SceneInstancePath) {
        let Some(project) = self.project.as_mut() else {
            return;
        };
        let deck = project.deck(path);
        let mut init_gpu = false;

        ui.horizontal(|ui| {
            ui.label(RichText::new(path.deck_path.name()).heading());

            let mut scene: Option<AssetId<Scene>> = None;
            scene.change_button(ui);
            if let Some(scene) = scene {
                deck.add_scene(&mut self.selected_scene_instance, scene);
                init_gpu = true;
            }

            ui.menu_button(
                if deck.auto_mode_active {
                    "💂Automatic"
                } else {
                    "🔨Manual"
                },
                |ui| {
                    ui.label("Automatic mode");
                    ui.checkbox(&mut deck.auto_mode_active, "");
                    ui.label("Seconds/scene");
                    ui.add_enabled(
                        deck.auto_mode_active,
                        Slider::new(&mut deck.auto_mode_seconds, 1..=240)
                            .custom_formatter(|n, _| format!("{n} s")),
                    );
                    ui.label("Max concurrent scenes");
                    ui.add_enabled(
                        deck.auto_mode_active,
                        Slider::new(&mut deck.auto_mode_max_scenes, 1..=10),
                    );
                },
            );

            ui.scope(|ui| {
                ui.set_max_width(ui.available_width() - 24.0);
                ui.vertical_centered_justified(|ui| {
                    ui.add_space(2.0);
                    deck.palette.change_button(ui);
                });
            });
        });
        if deck.groups.is_empty() {
            ui.painter().rect_filled(
                {
                    let rect = ui.cursor();
                    rect.with_max_y(rect.min.y + 20.0)
                },
                0.0,
                Color32::ORANGE,
            );
            ui.add_sized(
                [ui.available_width(), 20.0],
                egui::Label::new(
                    RichText::new("☢ No groups = no output! ☢").color(Color32::DARK_RED),
                ),
            );
        }

        ui.scope(|ui| {
            ui.horizontal(|ui| {
                if deck.groups.change_button(ui) {
                    action::UiAction::InitGPU.enqueue();
                }
            });
        });

        if init_gpu {
            project.init_gpu();
        }
    }
}