No description
Find a file
wfx fc73e4b76b Complete Clean Architecture migration
Phase 1-7: Full migration from src/app/ to Clean Architecture

BREAKING CHANGES:
- Removed src/app/ (old TEA-style implementation)
- Removed src/constant.rs (constants now local to modules)
- Removed deprecated canvas_to_image_coords functions

NEW STRUCTURE:
- src/ui/           - UI Layer (COSMIC interface)
- src/application/  - Application Layer (DocumentManager, Commands)
- src/domain/       - Domain Layer (Document types, Operations)
- src/infrastructure/ - Infrastructure Layer (Loaders, Cache, System)

FEATURES:
- DocumentManager as Single Source of Truth
- Command Pattern for all operations
- Model caching for render data (performance)
- Sync mechanism between DocumentManager and UI Model
- Wallpaper support (COSMIC, KDE, GNOME, feh)
- Thumbnail cache with disk persistence

IMPROVEMENTS:
- Warnings: 62 → 43 (-31%)
- Deprecated warnings: 2 → 0 (-100%)
- Code removed: src/app/ (~2000 lines), constant.rs, deprecated functions
- Better Locality of Reference (constants local to modules)
- Clean separation of concerns
- No circular dependencies

DOCUMENTATION:
- Updated AGENTS.md (100% migration status)
- Updated README.md (architecture section)
- Updated Workflow.md
- Added Migration-Plan.md with full completion summary

TESTS:
- All 41 tests passing
- Build successful (0 errors, 43 warnings)
- Release build verified

Migration Status:  100% Complete
2026-02-03 08:43:21 +01:00
.zed feat: implement crop functionality with self-contained widget 2026-01-22 20:40:36 +01:00
DEVNOTE Complete Clean Architecture migration 2026-02-03 08:43:21 +01:00
docs docs: update 2026-01-18 20:42:46 +01:00
i18n/en Complete Clean Architecture migration 2026-02-03 08:43:21 +01:00
resources chore: remove unused panel icon resources 2026-01-15 19:04:58 +01:00
src Complete Clean Architecture migration 2026-02-03 08:43:21 +01:00
.gitignore chore: initial commit 2026-01-07 20:22:49 +01:00
Cargo.lock feature: PDF and PDF thumbnails and refresh UI 2026-01-18 20:35:12 +01:00
Cargo.toml feat: implement crop functionality with self-contained widget 2026-01-22 20:40:36 +01:00
i18n.toml chore: initial commit 2026-01-07 20:22:49 +01:00
justfile Fix: correct metainfo path, icon destination, add post-install 2026-01-08 20:49:54 +01:00
LICENSE chore: initial commit 2026-01-07 20:22:49 +01:00
MIGRATION.md Complete Clean Architecture migration 2026-02-03 08:43:21 +01:00
README.md Complete Clean Architecture migration 2026-02-03 08:43:21 +01:00
rustfmt.toml chore: initial commit 2026-01-07 20:22:49 +01:00

Noctua

An image viewer application for the COSMIC™ desktop

Screenshot

Features

  • Multi-format support: Raster images (PNG, JPEG, WebP, etc.), SVG vector graphics, and PDF documents
  • Navigation: Browse through folders with keyboard shortcuts
  • Transformations: Rotate, flip, and crop images
  • Zoom & Pan: Flexible viewing with zoom controls and panning
  • Multi-page documents: Navigate PDF pages with thumbnail previews
  • Metadata display: View EXIF data and file information
  • Wallpaper setting: Set images as desktop wallpaper (multi-DE support)

Architecture

Noctua follows Clean Architecture principles with clear separation of concerns:

src/
├── main.rs              # Application entry point
├── ui/                  # UI Layer (COSMIC interface)
│   ├── app.rs           # Application state & lifecycle
│   ├── model.rs         # UI state + cached render data
│   ├── update.rs        # Message handlers
│   ├── sync.rs          # Model synchronization
│   ├── views/           # View components
│   └── components/      # Reusable widgets
├── application/         # Application Layer (use cases)
│   ├── document_manager.rs  # Document orchestration
│   ├── commands/        # Write operations (Transform, Crop)
│   └── services/        # Shared services (Cache)
├── domain/              # Domain Layer (business logic)
│   ├── document/        # Document abstractions & operations
│   │   ├── core/        # Traits & types (Renderable, Transformable)
│   │   ├── types/       # Implementations (Raster, Vector, Portable)
│   │   └── operations/  # Transform, render, export operations
│   └── errors.rs        # Domain errors
└── infrastructure/      # Infrastructure Layer (external systems)
    ├── loaders/         # Document loading (image, SVG, PDF)
    ├── cache/           # Thumbnail caching
    ├── filesystem/      # File operations
    └── system/          # System integration (wallpaper)

Key Patterns:

  • MVU (Model-View-Update): Elm architecture via libcosmic
  • Command Pattern: All operations go through commands
  • Dependency Inversion: Domain has no dependencies on infrastructure
  • Type-Erased Documents: DocumentContent enum for unified handling

Installation

A justfile is included by default for the [casey/just][just] command runner.

  • just builds the application with the default just build-release recipe
  • just run builds and runs the application
  • just install installs the project into the system
  • just vendor creates a vendored tarball
  • just build-vendored compiles with vendored dependencies from that tarball
  • just check runs clippy on the project to check for linter warnings
  • just check-json can be used by IDEs that support LSP

Dependencies

Arch Linux

sudo pacman -S poppler-glib

Debian/Ubuntu

sudo apt install libpoppler-glib-dev

Fedora

sudo dnf install poppler-glib-devel

OpenSUSE

sudo zypper install poppler-glib-devel

Documentation

License

GPL-3.0-or-later