use eframe::egui; use egui_commonmark::{CommonMarkCache, CommonMarkViewer}; #[derive(Clone, Copy)] pub struct HelpWindowOptions { pub min_size: egui::Vec2, pub max_size_factor: f32, pub default_width_factor: f32, pub default_height_factor: f32, } impl Default for HelpWindowOptions { fn default() -> Self { Self { min_size: egui::vec2(320.0, 240.0), max_size_factor: 0.9, default_width_factor: 0.5, default_height_factor: 0.6, } } } pub fn show_help_window( ctx: &egui::Context, cache: &mut CommonMarkCache, id_source: impl std::hash::Hash, title: &str, markdown_content: &str, is_open: &mut bool, options: HelpWindowOptions, ) { if !*is_open { return; } let viewport = ctx.available_rect(); let max_size = egui::vec2( viewport.width() * options.max_size_factor, viewport.height() * options.max_size_factor, ); let default_size = egui::vec2( (viewport.width() * options.default_width_factor) .clamp(options.min_size.x, max_size.x.max(options.min_size.x)), (viewport.height() * options.default_height_factor) .clamp(options.min_size.y, max_size.y.max(options.min_size.y)), ); let mut open = *is_open; egui::Window::new(title) .id(egui::Id::new(id_source)) .collapsible(false) .resizable(true) .default_size(default_size) .min_size(options.min_size) .max_size(max_size) .open(&mut open) .show(ctx, |ui| { egui::ScrollArea::vertical() .auto_shrink([false, false]) .show(ui, |ui| { CommonMarkViewer::new().show(ui, cache, markdown_content); }); }); *is_open = open; }