| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
1 |
# SagoImageBrowser |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
2 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
3 |
A Qt6-based image browser application for viewing and managing image collections. |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
4 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
5 |
## Features |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
6 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
7 |
- Browse images in a directory tree with file system navigation |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
8 |
- Multi-threaded, cached thumbnail generation for a responsive UI |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
9 |
- Single image view mode with keyboard-driven zoom, pan, fit and navigation |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
10 |
- Fullscreen viewing |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
11 |
- EXIF/IPTC metadata panel (camera, exposure, ISO, focal length, dimensions, …) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
12 |
- Geo location with a clickable OpenStreetMap link when an image is geotagged |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
13 |
- Edit image captions (written to the IPTC Caption-Abstract tag) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
14 |
- Lossless 90° rotation (updates the EXIF orientation tag, pixel data untouched) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
15 |
- Move images to trash and delete files |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
16 |
- Right-click context menus (including copying file paths), also in fullscreen |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
17 |
- Configurable keyboard shortcuts |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
18 |
- Preferences for background color, thumbnail cache size, dock locking and layout |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
19 |
- Path entry field with autocomplete |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
20 |
- Translations (Danish included) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
21 |
- Supports every image format provided by the installed Qt image plugins |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
22 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
23 |
## Requirements |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
24 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
25 |
- C++17 or later |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
26 |
- CMake 3.21+ |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
27 |
- Qt6 (Widgets and LinguistTools components) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
28 |
- Git and a network connection — Exiv2 (v0.28.8) is fetched and statically linked |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
29 |
at configure time via CMake `FetchContent` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
30 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
31 |
## Building |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
32 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
33 |
### Prerequisites |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
34 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
35 |
Install Qt6 development files: |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
36 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
37 |
```bash |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
38 |
# On Ubuntu/Debian |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
39 |
sudo apt-get install qt6-base-dev qt6-tools-dev |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
40 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
41 |
# On macOS with Homebrew |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
42 |
brew install qt6 |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
43 |
``` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
44 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
45 |
### Build Steps |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
46 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
47 |
```bash |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
48 |
cd SagoImageBrowser |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
49 |
cmake -B build |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
50 |
cmake --build build |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
51 |
``` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
52 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
53 |
The compiled executable will be at `./build/SagoImageBrowser`. |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
54 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
55 |
### Installing |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
56 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
57 |
```bash |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
58 |
cmake --install build |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
59 |
``` |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
60 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
61 |
This installs the executable, a `.desktop` entry and the application icon. |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
62 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
63 |
## Running |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
64 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
65 |
```bash |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
66 |
./build/SagoImageBrowser [path] |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
67 |
``` |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
68 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
69 |
An optional directory or image path can be passed on the command line. |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
70 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
71 |
## Tests |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
72 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
73 |
A small test for the EXIF reader is built alongside the application: |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
74 |
|
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
75 |
```bash |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
76 |
./build/test_exifreader |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
77 |
``` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
78 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
79 |
## Project Structure |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
80 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
81 |
``` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
82 |
src/ |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
83 |
├── main.cpp # Application entry point |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
84 |
├── mainwindow.h/cpp # Main application window |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
85 |
├── imagemodel.h/cpp # Image list/grid data model |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
86 |
├── fsdirmodel.h/cpp # Directory tree model |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
87 |
├── imageviewwidget.h/cpp # Single-image display widget (zoom/pan) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
88 |
├── thumbnailworker.h/cpp # Background thumbnail generation |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
89 |
├── thumbnailcache.h/cpp # Thumbnail caching |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
90 |
├── thumbnaildelegate.h/cpp # Thumbnail rendering in the view |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
91 |
├── exifreader.h/cpp # EXIF/IPTC reading, caption writing, rotation |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
92 |
├── preferencesdialog.h/cpp # Preferences dialog |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
93 |
├── shortcutmanager.h/cpp # Configurable keyboard shortcuts |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
94 |
└── pathcompletermodel.h/cpp # Autocomplete for the path field |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
95 |
test/ # Unit tests |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
96 |
translations/ # Qt translation files (.ts) |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
97 |
extra/ # Desktop entry and icons |
| ce844ce8 |
Poul Sander |
2026-06-10 18:04 |
98 |
CMakeLists.txt # Build configuration |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
99 |
``` |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
100 |
|
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
101 |
## License |
| c0882fd1 |
Poul Sander |
2026-02-23 19:00 |
102 |
|
| 14cf904f |
Poul Sander |
2026-06-22 18:18 |
103 |
GPL 3.0 or later, see `LICENSE` file for details. |
| 14cf904f |
Poul Sander |
2026-06-22 18:18 |
104 |
|
| 14cf904f |
Poul Sander |
2026-06-22 18:18 |
105 |
Some files might have more liberal licenses, see individual file headers for details. |
| 14cf904f |
Poul Sander |
2026-06-22 18:18 |
106 |
|
|
|
1970-01-01 00:00 |
107 |
|