diff --git a/src/gui/mod.rs b/src/gui/mod.rs index ae4203da..aedb2ec7 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -64,7 +64,7 @@ pub use tempfile_dialog::TempfileDialog; pub use timer_dialog::{TimerCompletionDialog, TimerDialog}; pub use toast_log_dialog::ToastLogDialog; pub use todo_dialog::TodoDialog; -pub use todo_view_dialog::TodoViewDialog; +pub use todo_view_dialog::{todo_view_layout_sizes, todo_view_window_constraints, TodoViewDialog}; pub use unused_assets_dialog::UnusedAssetsDialog; pub use volume_dialog::VolumeDialog; diff --git a/src/gui/todo_view_dialog.rs b/src/gui/todo_view_dialog.rs index ea04b1c6..06350688 100644 --- a/src/gui/todo_view_dialog.rs +++ b/src/gui/todo_view_dialog.rs @@ -2,6 +2,17 @@ use crate::gui::LauncherApp; use crate::plugins::todo::{load_todos, save_todos, TodoEntry, TODO_FILE}; use eframe::egui; +const TODO_VIEW_SIZE: egui::Vec2 = egui::vec2(360.0, 260.0); +const TODO_VIEW_LIST_HEIGHT: f32 = 170.0; + +pub fn todo_view_layout_sizes() -> (egui::Vec2, f32) { + (TODO_VIEW_SIZE, TODO_VIEW_LIST_HEIGHT) +} + +pub fn todo_view_window_constraints() -> (egui::Vec2, egui::Vec2) { + (TODO_VIEW_SIZE, TODO_VIEW_SIZE) +} + #[derive(Default)] pub struct TodoViewDialog { pub open: bool, @@ -51,14 +62,16 @@ impl TodoViewDialog { if !self.open { return; } + let (window_size, list_height) = todo_view_layout_sizes(); + let (min_size, max_size) = todo_view_window_constraints(); let mut close = false; let mut save_now = false; egui::Window::new("View Todos") .open(&mut self.open) - .resizable(true) - .default_size((320.0, 240.0)) - .min_width(200.0) - .min_height(150.0) + .resizable(false) + .default_size(window_size) + .min_size(min_size) + .max_size(max_size) .show(ctx, |ui| { ui.horizontal(|ui| { ui.checkbox(&mut self.sort_by_priority, "Sort by priority"); @@ -88,11 +101,10 @@ impl TodoViewDialog { indices .sort_by(|a, b| self.entries[*b].priority.cmp(&self.entries[*a].priority)); } - let area_height = ui.available_height(); // Keep horizontal overflow for long todo text without wrapping. egui::ScrollArea::both() .auto_shrink([false, false]) - .max_height(area_height) + .max_height(list_height) .show(ui, |ui| { for idx in indices { if Some(idx) == self.editing_idx { @@ -184,3 +196,19 @@ impl TodoViewDialog { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn todo_view_layout_sizes_constants() { + let (window_size, list_height) = todo_view_layout_sizes(); + let (min_size, max_size) = todo_view_window_constraints(); + assert_eq!(window_size, TODO_VIEW_SIZE); + assert_eq!(list_height, TODO_VIEW_LIST_HEIGHT); + assert_eq!(min_size, max_size); + assert_eq!(window_size, min_size); + assert!(list_height < window_size.y); + } +} diff --git a/tests/todo_plugin.rs b/tests/todo_plugin.rs index 0cfa9ec0..5d03cd70 100644 --- a/tests/todo_plugin.rs +++ b/tests/todo_plugin.rs @@ -1,5 +1,7 @@ use eframe::egui; -use multi_launcher::gui::{LauncherApp, TodoDialog}; +use multi_launcher::gui::{ + todo_view_layout_sizes, todo_view_window_constraints, LauncherApp, TodoDialog, TodoViewDialog, +}; use multi_launcher::plugin::Plugin; use multi_launcher::plugin::PluginManager; use multi_launcher::plugins::todo::{ @@ -419,3 +421,31 @@ fn dialog_scrolls_with_many_entries() { .expect("window rect"); assert!(rect.height() < 800.0); } + +#[test] +fn todo_view_dialog_has_fixed_size() { + let _lock = TEST_MUTEX.lock().unwrap(); + let dir = tempdir().unwrap(); + std::env::set_current_dir(dir.path()).unwrap(); + let ctx = egui::Context::default(); + let mut app = new_app(&ctx); + let mut dlg = TodoViewDialog::default(); + dlg.open(); + + ctx.begin_frame(egui::RawInput { + screen_rect: Some(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(1000.0, 2000.0), + )), + ..Default::default() + }); + dlg.ui(&ctx, &mut app); + let _ = ctx.end_frame(); + + let (min_size, max_size) = todo_view_window_constraints(); + let _rect = ctx + .memory(|m| m.area_rect(egui::Id::new("View Todos"))) + .expect("window rect"); + let (_window_size, _) = todo_view_layout_sizes(); + assert_eq!(min_size, max_size); +}