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)
This commit is contained in:
mow 2026-02-05 17:27:44 +01:00
parent 9624eec699
commit a8344f77a1
3 changed files with 44 additions and 25 deletions

View file

@ -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);
}
}
}
}
}

View file

@ -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);
}

View file

@ -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(),
]
}