From a8344f77a16a2fcf44af2e8c9a2d455bf4802367 Mon Sep 17 00:00:00 2001 From: mow Date: Thu, 5 Feb 2026 17:27:44 +0100 Subject: [PATCH] Fix initial document display and set Fit mode as default - Cache rendered image handle on startup to fix 'No document loaded' issue - Set ViewMode::Fit as default for initial load and navigation - Disable tooltips in header (too ugly) - Temporarily disable main menu button (needs proper implementation) --- src/ui/app.rs | 25 ++++++++++++++++++++++--- src/ui/update.rs | 4 ++-- src/ui/views/header.rs | 40 ++++++++++++++++++++-------------------- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 64e5a85..3e078fb 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -4,7 +4,7 @@ // COSMIC application wiring and main app struct. use super::message::AppMessage; -use super::model::AppModel; +use super::model::{AppModel, ViewMode}; use super::update; use crate::ui::views; @@ -73,8 +73,6 @@ impl cosmic::Application for NoctuaApp { Err(_) => (AppConfig::default(), None), }; - let mut model = AppModel::new(config.clone()); - let Flags::Args(args) = flags; // Determine initial path: CLI argument takes priority. @@ -90,10 +88,31 @@ impl cosmic::Application for NoctuaApp { // Initialize document manager let mut document_manager = DocumentManager::new(); + // Initialize model + let mut model = AppModel::new(config.clone()); + // Load initial document if provided if let Some(path) = initial_path { if let Err(e) = document_manager.open_document(&path) { log::error!("Failed to open initial path {}: {}", path.display(), e); + } else { + // Set initial view mode to Fit + model.viewport.fit_mode = ViewMode::Fit; + model.viewport.scale = 1.0; + model.reset_pan(); + + // Cache initial render so image is displayed immediately + if let Some(doc) = document_manager.current_document_mut() { + use crate::domain::document::core::document::Renderable; + match doc.render(model.viewport.scale as f64) { + Ok(output) => { + model.viewport.cached_image_handle = Some(output.handle); + } + Err(e) => { + log::error!("Failed to render initial document: {}", e); + } + } + } } } diff --git a/src/ui/update.rs b/src/ui/update.rs index 5d3290f..92e3e88 100644 --- a/src/ui/update.rs +++ b/src/ui/update.rs @@ -48,7 +48,7 @@ pub fn update(app: &mut NoctuaApp, msg: &AppMessage) -> UpdateResult { { // Reset zoom when navigating to new document app.model.viewport.scale = 1.0; - app.model.viewport.fit_mode = ViewMode::ActualSize; + app.model.viewport.fit_mode = ViewMode::Fit; app.model.reset_pan(); cache_render(&mut app.model, &mut app.document_manager); } @@ -61,7 +61,7 @@ pub fn update(app: &mut NoctuaApp, msg: &AppMessage) -> UpdateResult { { // Reset zoom when navigating to new document app.model.viewport.scale = 1.0; - app.model.viewport.fit_mode = ViewMode::ActualSize; + app.model.viewport.fit_mode = ViewMode::Fit; app.model.reset_pan(); cache_render(&mut app.model, &mut app.document_manager); } diff --git a/src/ui/views/header.rs b/src/ui/views/header.rs index ac65910..9f53cbe 100644 --- a/src/ui/views/header.rs +++ b/src/ui/views/header.rs @@ -25,23 +25,23 @@ pub fn start<'a>( .spacing(4) .push( button::icon(icon::from_name("view-sidebar-start-symbolic")) - .on_press(AppMessage::ToggleNavBar) - .tooltip(fl!("tooltip-nav-toggle")), - ) - .push( - button::icon(icon::from_name("open-menu-symbolic")) - .on_press(AppMessage::ToggleMainMenu) - .tooltip(fl!("menu-main")), + .on_press(AppMessage::ToggleNavBar), + //.tooltip(fl!("tooltip-nav-toggle")), ) + // .push( + // button::icon(icon::from_name("open-menu-symbolic")) + // .on_press(AppMessage::ToggleMainMenu), + // //.tooltip(fl!("menu-main")), + // ) .push( button::icon(icon::from_name("go-previous-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::PrevDocument)) - .tooltip(fl!("tooltip-nav-previous")), + .on_press_maybe(has_doc.then_some(AppMessage::PrevDocument)), + //.tooltip(fl!("tooltip-nav-previous")), ) .push( button::icon(icon::from_name("go-next-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::NextDocument)) - .tooltip(fl!("tooltip-nav-next")), + .on_press_maybe(has_doc.then_some(AppMessage::NextDocument)), + //.tooltip(fl!("tooltip-nav-next")), ); // Center section: Transformations @@ -49,24 +49,24 @@ pub fn start<'a>( .spacing(4) .push( button::icon(icon::from_name("object-rotate-left-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::RotateCCW)) - .tooltip(fl!("tooltip-rotate-ccw")), + .on_press_maybe(has_doc.then_some(AppMessage::RotateCCW)), + //.tooltip(fl!("tooltip-rotate-ccw")), ) .push( button::icon(icon::from_name("object-rotate-right-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::RotateCW)) - .tooltip(fl!("tooltip-rotate-cw")), + .on_press_maybe(has_doc.then_some(AppMessage::RotateCW)), + //.tooltip(fl!("tooltip-rotate-cw")), ) .push(horizontal_space().width(Length::Fixed(12.0))) .push( button::icon(icon::from_name("object-flip-horizontal-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::FlipHorizontal)) - .tooltip(fl!("tooltip-flip-horizontal")), + .on_press_maybe(has_doc.then_some(AppMessage::FlipHorizontal)), + //.tooltip(fl!("tooltip-flip-horizontal")), ) .push( button::icon(icon::from_name("object-flip-vertical-symbolic")) - .on_press_maybe(has_doc.then_some(AppMessage::FlipVertical)) - .tooltip(fl!("tooltip-flip-vertical")), + .on_press_maybe(has_doc.then_some(AppMessage::FlipVertical)), + //.tooltip(fl!("tooltip-flip-vertical")), ); vec![ @@ -85,7 +85,7 @@ pub fn end<'a>( // Info panel toggle button::icon(icon::from_name("dialog-information-symbolic")) .on_press(AppMessage::ToggleContextPage(ContextPage::Properties)) - .tooltip(fl!("tooltip-info-panel")) + //.tooltip(fl!("tooltip-info-panel")) .into(), ] }