gled-ui 2.32.1

gled's egui interface, shared by the desktop app and the browser
Documentation
use crate::ui::window_common::{gled_window_frame, tool_window_builder};
use egui::{Color32, Frame, Id, RichText, ScrollArea, Vec2, ViewportId};

#[derive(Debug, Default)]
pub(crate) struct ErrorsWindow {
    pub(crate) entries: Vec<String>,
}

impl ErrorsWindow {
    #[cfg_attr(feature = "profiling", profiling::function)]
    pub(crate) fn update(&mut self, ctx: &egui::Context) {
        if self.entries.is_empty() {
            return;
        }

        ctx.show_viewport_immediate(
            ViewportId(Id::new("errors window")),
            tool_window_builder("Errors")
                .with_inner_size(Vec2::new(560.0, 260.0))
                .with_minimize_button(false)
                .with_maximize_button(true)
                .with_resizable(true),
            |ctx, _viewport_class| {
                ctx.input(|input| {
                    if input.viewport().close_requested()
                        || crate::ui::window_common::embedded_close_clicked("Errors")
                    {
                        self.entries.clear();
                    }
                });

                gled_window_frame(ctx, "Errors", |ui| {
                    egui::CentralPanel::default()
                        .frame(Frame::default().fill(Color32::DARK_RED).inner_margin(8))
                        .show(ui, |ui| {
                            // Long messages (fingerprints, commands to copy)
                            // wrap and scroll instead of growing the window.
                            ScrollArea::vertical().auto_shrink(false).show(ui, |ui| {
                                for error in &self.entries {
                                    ui.label(RichText::new(error).color(Color32::WHITE));
                                    ui.add_space(6.0);
                                }
                            });
                        });
                });
            },
        );
    }
}