- Automatically show nav bar and thumbnail panel when loading PDF files
- Hide nav bar when switching to single-page documents
- Apply auto-toggle on initial load and document navigation
- Thumbnails are already generated via DocumentManager.open_document()
- 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)
The fix: cursor.position_in(bounds) returns RELATIVE coordinates,
but we were drawing at those relative positions directly.
Solution: Add bounds.x and bounds.y offset when drawing.
- selection.region stores relative coords (from cursor)
- when drawing: absolute = relative + bounds offset
This fixes the Y-position being too far up.
KISS principle: Widget is in stack over canvas, uses SAME coordinates!
- Mouse position = exact position to draw
- selection.region = canvas pixel coordinates
- NO relative/absolute conversion needed
- NO bounds offset calculations
Removed all the over-engineered coordinate math.
Keyboard events (Enter/Escape) are already handled globally in app.rs
subscription and work correctly with Crop mode detection.
Widget-level keyboard events don't work without focus anyway.
Only mouse events (click, drag, double-click) stay in the widget.
B1: Fixed handle positions - now uses relative coordinates correctly
- Handles are drawn at correct positions (relative to bounds)
- Conversion between screen and relative coords
B2: Added Enter and Double-click for Apply
- Enter key applies crop when selection exists
- Escape key cancels crop
- Double-click on selection center applies crop (400ms window)
- CropRegion moved to domain/document/operations/crop.rs (pure model)
- crop_types.rs renamed to crop_model.rs (honest UI model name)
- DragHandle and CropSelection stay in UI layer (where they belong)
- Clean separation: Domain has no UI concerns, UI imports from Domain
- 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