gled 2.28.5

gled is an application for creating animations and effects on artnet or dmx installations
use super::App;
use crate::{
    pipeline::preview::Preview,
    ui::{asset_tree::TreeSelection, gled_slider::GledSlider},
};
use egui::{Color32, Id, Image, Ui, Vec2, load::SizedTexture};

impl App {
    pub fn palette_asset_tree_id(&mut self, ui: &mut Ui) -> Id {
        *self
            .palette_asset_tree_id
            .get_or_insert_with(|| ui.make_persistent_id("preview palette tree"))
    }

    #[cfg_attr(feature = "profiling", profiling::function)]
    pub fn preview(&mut self, ui: &mut egui::Ui) {
        let palette_asset_tree_id = self.palette_asset_tree_id(ui);

        let height = ui.available_height();
        ui.horizontal(|ui| {
            let size = Vec2::splat(height.min(ui.available_width()));

            let svg_texture = self.svg_texture(ui.ctx());
            let res = svg_texture.map(|svg_texture_handle| {
                ui.add(
                    Image::new(SizedTexture::new(svg_texture_handle.id(), size))
                        .bg_fill(Color32::BLACK),
                )
            });
            let preview = Image::new(SizedTexture::new(Preview::texture_id(), size));
            match res {
                Some(res) => {
                    ui.put(res.rect, preview);
                }
                None => {
                    ui.add(preview);
                }
            }

            if let Some(project) = &mut self.project {
                ui.add_space(ui.available_width() - (300.0 + 16.0 + 40.0 + 16.0));
                ui.scope(|ui| {
                    ui.set_max_width(300.0);
                    if self.palette_asset_tree.show(
                        ui,
                        palette_asset_tree_id,
                        &mut self.collections,
                    ) && let TreeSelection::Asset(palette) = self.palette_asset_tree.selected()
                    {
                        project.palette = Some(palette.data.clone());
                    }

                    //TODO: Show and make project palette editable
                });

                let mut rect = ui.available_rect_before_wrap();
                *rect.top_mut() += 16.0;
                *rect.left_mut() = rect.right() - 56.0;
                *rect.bottom_mut() -= 16.0;

                let preview_value = if self.blackout {
                    0.0
                } else {
                    project.main_dimmer
                };
                ui.put(
                    rect,
                    GledSlider::new(&mut project.main_dimmer, 100.0)
                        .size(40.0)
                        .show_label()
                        .preview_value(preview_value),
                );
            }
        });
    }
}