gled 2.28.5

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

fn draw_background_logo(ui: &mut Ui) {
    Image::new(logo_image()).paint_at(ui, {
        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))
        }
    });
}

pub fn show_storage_loading(ui: &mut 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!("{}", crate::storage::loading())).heading()),
    );
}

pub fn show_storage_error(ui: &mut Ui, error: String) {
    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();
        }
    });
}