gled 2.3.4

gled is an application for creating animations and effects on artnet or wled light installations
use crate::{
    storage::{Loading, STORAGE_DIR},
    ui::{action::UiAction, logo::logo_image},
};
use egui::{
    pos2, Color32, Context, Label, Margin, Pos2, Rect, RichText, Spinner, Stroke, Ui, Vec2,
};

fn draw_background_logo(ui: &mut Ui) {
    ui.painter().image(
        logo_image().texture_id(ui.ctx()),
        {
            let rect = ui.available_rect_before_wrap();
            let size = rect.size();
            if size.x > size.y {
                Rect::from_center_size(rect.center(), Vec2::splat(size.y - 10.0))
            } else {
                Rect::from_center_size(rect.center(), Vec2::splat(size.x - 10.0))
            }
        },
        Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0)),
        Color32::from_white_alpha(1),
    );
}

pub fn show_storage_loading(ctx: &Context, loading: Loading) {
    egui::CentralPanel::default().show(ctx, |ui| {
        let rect = ui.available_rect_before_wrap();
        let mut spinner_size = 300.0;
        let mut x = rect.center().x;
        let mut y = rect.center().y;

        if y < spinner_size {
            spinner_size = y - 20.0;
        }
        if x < spinner_size {
            spinner_size = x - 20.0;
        }
        x -= spinner_size / 2.0;
        y -= spinner_size / 2.0;
        let center_rect = Rect::from_min_size(Pos2::new(x, y), Vec2::splat(spinner_size));

        draw_background_logo(ui);
        ui.put(center_rect, Spinner::new().size(spinner_size));
        ui.put(
            center_rect,
            Label::new(RichText::new(format!("{loading}")).heading()),
        );
    });
}

pub fn show_storage_error(ctx: &Context, error: String) {
    egui::CentralPanel::default().show(ctx, |ui| {
        draw_background_logo(ui);

        ui.vertical_centered(|ui| {
            ui.add_space(0f32.max((ui.available_height() - 200.0) / 2.0));
            ui.heading("Storage error!");
            egui::Frame::none()
                .inner_margin(Margin::from(3.0))
                .fill(Color32::DARK_RED)
                .stroke(Stroke::new(1.0, Color32::RED))
                .show(ui, |ui| {
                    ui.add(Label::new(RichText::new(error).color(Color32::WHITE)));
                });
            ui.label(format!("Storage folder: {}", STORAGE_DIR.display()));
            ui.add_space(20.0);
            if ui.button("Open git config").clicked() {
                UiAction::OpenGitConfigWindow.enqueue();
            }
        });
    });
}