gled 2.28.4

gled is an application for creating animations and effects on artnet or dmx installations
use super::asset_tree::AssetTree;
use crate::storage::{
    asset::{Asset, AssetTrait},
    asset_id::AssetId,
    collections::Collections,
};
use egui::{Ui, UiKind};
use egui_ltreeview::TreeViewState;

pub trait CollectionsChangeButton {
    fn collections_change_button(&mut self, ui: &mut Ui, collections: &mut Collections) -> bool;
}

impl<T: AssetTrait> CollectionsChangeButton for Option<AssetId<T>> {
    fn collections_change_button(&mut self, ui: &mut Ui, collections: &mut Collections) -> bool {
        let mut changed = false;

        let asset = self.and_then(|id| Asset::get(id, collections));
        let response = ui
            .menu_button(
                if let Some(asset) = asset.as_ref() {
                    if T::SHOW_NAME_IF_SELECTED {
                        asset.name().to_owned()
                    } else {
                        "".to_owned()
                    }
                } else {
                    format!("📂 {}", T::NAME)
                },
                |ui| {
                    if let Some(id) = AssetTree::show_asset_selection(
                        ui,
                        ui.make_persistent_id(T::NAME),
                        collections,
                    ) {
                        *self = Some(id);
                        ui.data_mut(|d| {
                            d.remove::<TreeViewState<usize>>(ui.make_persistent_id(T::NAME))
                        });
                        ui.close_kind(UiKind::Menu);
                        changed = true;
                    }
                },
            )
            .response;
        if let Some(asset) = asset {
            asset.data.show(ui, response.rect);
        }

        changed
    }
}

impl<T: AssetTrait> CollectionsChangeButton for Option<Option<AssetId<T>>> {
    fn collections_change_button(&mut self, ui: &mut Ui, collections: &mut Collections) -> bool {
        let mut changed = false;

        let mut overwrite = self.is_some();
        ui.checkbox(&mut overwrite, format!("Overwrite {}", T::NAME));
        if self.is_none() && overwrite {
            *self = Some(Some(Default::default()));
            changed = true;
        } else if self.is_some() && !overwrite {
            *self = None;
            changed = true;
        }
        if let Some(asset_id) = self {
            ui.vertical_centered_justified(|ui| {
                changed |= asset_id.collections_change_button(ui, collections);
            });
        }

        changed
    }
}