- All app/ traits present in domain/
- Domain has additional features (fine rotation, interpolation)
- RotationMode is more flexible than plain Rotation
- Better error handling in MultiPageThumbnails
- No changes needed - domain version is superior
Refs: Migration Step 1.7
- Verified BasicMeta, ExifMeta, DocumentMeta are identical
- Domain version is better organized (extract_meta in types)
- from_bytes() is public in domain (vs private in app)
- No consolidation needed
Refs: Migration Step 1.6
- crop(): Universal crop for all document types (delegates to type impl)
- extract_meta(): Extract metadata from any document type
- Both methods work via type erasure pattern
Refs: Migration Step 1.5
- Inspired by cosmic-viewer's crop implementation (https://codeberg.org/bhh32/cosmic-viewer)
- Add crop support for all document types (Raster, Vector, Portable)
- Implement PDF and PDF thumbnail generation with incremental loading
- Add UI refresh mechanism (tick counter + RefreshView message)
- Improve fl! macro with named parameters
- Clean up code organization (mod.rs: wiring, model.rs: state only)
Add ability to set current image as desktop wallpaper with keyboard
shortcut 'W' and icon button in Properties panel.
Supports COSMIC, GNOME, KDE, XFCE, and tiling window managers via
automatic detection and fallback mechanism.
Implementation uses wallpaper crate with custom COSMIC config file
integration and gsettings/feh fallbacks.
- Mark all zoom and pan controls as fully working
- Remove status column (all shortcuts are implemented)
- Add detailed descriptions for each feature
- Include mouse controls and toolbar usage
- Add tips for keyboard-driven workflow
- Document bidirectional control synchronization
- Remove or mark planned features accurately
Both SVG and PDF support are prepared in code structure but
not yet functionally implemented. They currently show 1x1
placeholder images. Moved to 'Planned Features' section with
proper status documentation.
Document all implemented and planned features:
- Current features with implementation status
- Planned features organized by priority
- Technical architecture details
- Keyboard shortcuts reference
- Contributing guidelines for new features
Mark unused message variants with #[allow(dead_code)] to indicate
they are intentionally kept for future implementation:
- OpenPath: for file dialog integration
- RefreshMetadata: for metadata panel updates
- ShowError/ClearError: for error handling UI
- NoOp: fallback/placeholder message
- Add explicit lifetimes to Element return types
- Remove unused imports (Length, button, horizontal_space, icon, Handle, self)
- Mark unused parameter with underscore prefix
This eliminates all 'hiding a lifetime' and 'unused import' warnings.
- Fork cosmic::iced viewer widget to enable external state control
- Add bidirectional state synchronization between viewer and AppModel
- Implement ViewerStateChanged message for mouse interaction feedback
- Fix pixel-perfect rendering at 100% zoom (ActualSize mode)
- Ensure smooth interaction between mouse, keyboard, and button controls
This allows zoom/pan to work via:
- Keyboard shortcuts (+/-, Ctrl+arrows)
- Future toolbar buttons
- Mouse wheel and drag (existing functionality preserved)
The viewer state now properly syncs in both directions:
- External controls (keyboard/buttons) → update viewer state via diff()
- Mouse interactions → update AppModel via ViewerStateChanged message
Closes: Zoom/pan via keyboard and buttons now functional
Replace hardcoded \"~/Pictures\" with dirs::picture_dir() which resolves
to the actual absolute path (e.g. /home/user/Pictures).
The tilde (~) in paths is not automatically expanded by Rust's PathBuf,
causing path.exists() to return false for \"~/Pictures\".
Using dirs::picture_dir() provides:
- Proper absolute path resolution
- XDG Base Directory compliance
- Fallback to home directory if Pictures doesn't exist
Note: Users with existing config files need to delete
~/.config/cosmic/org.codeberg.wfx.Noctua/v1/default_image_dir
to apply the new default."
EXIF support and display in the right panel.
New features:
- Extract basic metadata (filename, format, resolution, file size, color type)
- Parse EXIF data (camera, date, exposure, aperture, ISO, focal length, GPS)
- Display metadata in collapsible right panel (toggle with 'i' key)
- Auto-refresh metadata on document navigation
Changes by file:
Cargo.toml, Cargo.lock:
- Add kamadak-exif dependency for EXIF parsing
i18n/en/noctua.ftl:
- Add translation strings for all metadata labels
src/app/document/meta.rs:
- New module for metadata types (BasicMeta, ExifMeta, DocumentMeta)
- Extraction logic with EXIF parsing via kamadak-exif
- Helper methods for formatted display (resolution, file size, camera, GPS)
src/app/document/mod.rs:
- Re-export meta module
src/app/document/{raster,vector,portable}.rs:
- Add extract_metadata() method stubs (full impl for raster)
src/app/document/file.rs:
- Reset metadata on document change
src/app/message.rs:
- Add ToggleRightPanel and RefreshMetadata messages
src/app/model.rs:
- Add metadata: Option<DocumentMeta> field
- Add show_right_panel: bool field
src/app/update.rs:
- Handle panel toggle and metadata refresh
- Auto-refresh metadata on navigation when panel visible
src/app/view/panels.rs:
- Implement right_panel() with metadata display
- Conditional sections for basic info and EXIF data
src/app/view/canvas.rs:
- Integrate right panel into layout"