# imajViewer

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Build](https://github.com/alhan/imajviewer/actions/workflows/build.yml/badge.svg)](https://github.com/alhan/imajviewer/actions/workflows/build.yml)
[![Release](https://img.shields.io/github/v/release/alhan/imajviewer)](https://github.com/alhan/imajviewer/releases/latest)

Ultra-lightweight image viewer written in Flutter — Linux & Windows.

![imajViewer](imajviewer.png)

## Features

- **Formats:** PNG, JPEG, JFIF, WebP, BMP, GIF, WBMP
- **Pan:** Left drag
- **Zoom:** Mouse wheel (cursor-centered; viewport-centered in rotate mode)
- **Fill/Fit toggle:** Double left click
- **Contrast:** Right drag + vertical move
- **Saturation:** Ctrl + Right drag + vertical move
- **Brightness:** Ctrl+Shift + Right drag + vertical move
- **Rotate:** Shift + Right drag + vertical move (~100px = 90°)
- **Reset (all effects):** Double right click
- **Navigation arrows:** bottom corners, visible on hover
- **Settings (gear):** sort by time/name, print, shortcut info
- **Print:** send the image to a printer (A4, fit)
- Drag & drop to open images
- Window size/position memory (JSON persistence)
- Set as default image viewer
- Cascade placement for new windows
- Taskbar grouping (Linux: `StartupWMClass`)

## Install

### Linux (.deb, recommended)

No Flutter SDK needed — grab the latest `.deb` from the
[Releases page](https://github.com/alhan/imajviewer/releases/latest):

```bash
sudo dpkg -i imajviewer_*_amd64.deb
sudo apt-get install -f  # install missing dependencies, if any
```

After install, open an image with `xdg-open <file>` or double-click it.

### Windows (installer)

Download `imajviewer_setup_*.exe` from the
[Releases page](https://github.com/alhan/imajviewer/releases/latest) and run it.
The installer:

- Installs to Program Files
- Adds a Start Menu shortcut (optional desktop shortcut)
- Registers file associations (PNG, JPG, JPEG, WebP, BMP, GIF)
- Supports uninstall (Settings > Apps)

### Build from source

| Requirement | Notes |
|---|---|
| [Flutter SDK](https://docs.flutter.dev/get-started/install) | stable channel |
| Linux: GTK dev libs | `libgtk-3-dev`, `ninja-build`, `clang`, `cmake` |
| Windows: VS 2022 Build Tools | "Desktop development with C++" workload |

```bash
flutter pub get
flutter build linux    # Linux
flutter build windows --release   # Windows
```

Linux output: `build/linux/x64/release/bundle/`
Windows output: `build\windows\x64\runner\Release\` (portable: copy the whole
folder including `imajviewer.exe` and all DLLs).

## Keyboard & Mouse Shortcuts

| Interaction | Action |
|---|---|
| Left drag | Pan |
| Mouse wheel | Zoom (cursor-centered) |
| Double left click | Fill / Fit toggle |
| Right drag + vertical | Contrast (0.0 – 2.0) |
| Ctrl + Right drag + vertical | Saturation (0.0 – 2.0) |
| Ctrl+Shift + Right drag + vertical | Brightness (-100 – 100) |
| Shift + Right drag + vertical | Rotate (free) |
| Double right click | Reset (all effects) |
| Left / Right arrow | Previous / next image |
| Ctrl + Q | Close window |
| Ctrl + Shift + Q | Close all windows |

## CI / Releases

GitHub Actions builds Linux `.deb` and Windows installer on every push to
`main`. Pushing a `v*` tag creates a GitHub Release with both installers as
assets.

## Development

```bash
flutter pub get
flutter analyze
flutter test
```

To rebuild the `.deb` locally:

```bash
flutter build linux --release
bash dist/rebuild-deb.sh
```

## License

[MIT](LICENSE)
