Tuxie/PhotoViewerClassic

★ 0Forks 0RustGitHub ↗Compare

README

Photo Viewer Classic

A fast, simple, cross-platform desktop photo viewer (Rust + Slint).

Run

cargo run -p app -- path/to/image.jpg

Shows the image fit-to-window, correctly oriented, almost immediately, then prefetches the neighbours so next/previous are instant.

Formats & decoding

Decoding uses image-rs (JPEG/PNG/WebP/GIF/BMP/TIFF/ICO/QOI) plus the pure-Rust imazen heic crate for HEIC/HEIF (HEVC, AV1-in-HEIF, and uncompressed HEIF). Downscaling uses zenresize (linear-light-capable Lanczos); the in-memory buffer is zenpixels::PixelBuffer; embedded ICC profiles — and, for HEIF, nclx CICP — are converted to sRGB with moxcms. Standalone .avif is planned for a later phase (via zenavif).

Keyboard

Key Action
→ / L, ← / H Next / previous image (natural-sorted directory, wraps)
↑ / K, ↓ / J Zoom in / out (toward the centre)
Shift + ←/→/↑/↓ (or H/L/K/J) Pan left / right / up / down
Z Cycle view mode: Fit → 1:1 → last manual zoom
E / R Rotate counter-clockwise / clockwise (view-only; resets on navigate)
F Toggle fullscreen
I Toggle the info overlay (name, path, dimensions, file size, zoom %, rotation)
Esc Close the info overlay if open, otherwise quit
Q Quit

Mouse

  • Scroll to zoom toward the cursor; left-drag to pan.
  • Hover near the bottom for the toolbar (Prev / Next / Rotate L / Rotate R / Fullscreen / Exit); hover near the left / right edge for the ‹ / › nav buttons.

Persistence

Window geometry and the fullscreen flag are saved to config.toml on quit and restored on the next launch. The config lives in $PVC_HOME if set, else %APPDATA%\PhotoViewerClassic on Windows or ~/.config/pvc elsewhere.

Build & run on macOS

The only prerequisite beyond Rust is the Xcode Command Line Tools (one-time):

xcode-select --install

Then, from the repo root:

cargo run -p app --release -- path/to/image.jpg

Keys are the same as above. A single OpenGL-deprecation line may print to the console — that's expected and harmless (macOS deprecated, but still ships, OpenGL, which the FemtoVG renderer uses).

Interactive view (zoom/pan/rotate/fullscreen), neighbour prefetch, the auto-hiding chrome, the info overlay, geometry persistence, and HEIC/HEIF decode are in place. Still to come: tag/rating editing (with Windows-searchable keywords) and standalone .avif. See docs/superpowers/specs/ and docs/superpowers/plans/.

CI

GitHub Actions builds and tests on Linux, macOS (Apple Silicon), and Windows for every pull request (and on release tags) — see .github/workflows/ci.yml. Plain pushes to main do not run CI; main is gated through pull requests.

Releasing

Releases are cut from main with the helper script, which bumps the version, tags it, verifies the Linux release build locally with act, then pushes the tag to trigger the cross-platform release build:

scripts/release.sh          # bump the patch (C in A.B.C) and release
scripts/release.sh 0.2.0    # release an explicit version

The v* tag triggers .github/workflows/release.yml, which builds the photoviewer binary on Linux/macOS/Windows and attaches the archives to a GitHub Release. (The publish step is expected to fail under act; the script only requires the build to pass locally.) All crates share one version via [workspace.package] in the root Cargo.toml.

License

Photo Viewer Classic is licensed under AGPL-3.0-only, because it statically links the imazen heic crate and zenresize, which are AGPL-or-commercial. See the LICENSE file for the full text.

Contributors

Tuxie

Issues