Files
drk-blutspende-orte/docs/changelog.md
T
Paddy caecc60c7b UI/UX pass: readability, feedback, safer actions, DRK branding
Items 1–12 of the interface review:

- Larger UI font (UI_FONT_SIZE) across widgets, menus, dialogs, Treeview rows.
- DRK-red header bar; window title shows entry count; runtime-drawn red-cross
  icon (also written to data/icon.png for the launcher).
- Status bar colour-coded by severity; transient messages auto-clear after 8 s,
  queue-count messages stay.
- Tab 1: more form spacing, digits-only PLZ, explicit "Auswahl entfernen" +
  Delete key for queue rows, confirm on "Warteschlange leeren", modal on
  duplicate save.
- Tab 2: raw lat/lon columns replaced by one "Karte" column (checkmark / red
  "fehlt"); ▲/▼ arrow on the active sort column; hint line always shows the
  saved-entry count.
- "Karte öffnen" with no coordinates shows a dialog, not just a status line.
- Window size/position remembered between sessions (data/window.json).

Verified by building and driving the window under Homebrew Python 3.12 / Tk 9;
non-GUI smoke tests still pass. Docs updated (changelog, overview, improvements,
data-model, setup, dev-notes).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 18:51:17 +02:00

74 lines
3.5 KiB
Markdown

# Changelog
Notable changes to the app. Newest first.
## 2026-09-07 — UI/UX pass
A round of usability improvements aimed at the non-technical user
(see [improvements.md](improvements.md#uiux-review-2026-09-07)).
- **Larger UI font** (`UI_FONT_SIZE = 11`) applied to all default fonts, menus,
dialogs and the Treeview (taller rows).
- **DRK-red header bar** with the app name; window title shows the total count
("… · 142 Einsätze"); simple red-cross window icon drawn at runtime (also
written to `data/icon.png` for the launcher).
- **Status bar** is now colour-coded by severity (grey/green/orange/red), and
transient messages auto-clear after 8 s back to a neutral state; queue-count
messages stay put.
- **Tab 1:** more spacing in the form; PLZ field accepts digits only;
"+ Hinzufügen" is a solid button; explicit **"Auswahl entfernen"** button and
<kbd>Delete</kbd> key for queue rows; **"Warteschlange leeren"** now asks for
confirmation; **duplicate save shows a modal** (list + "trotzdem speichern?")
instead of a transient hint.
- **Tab 2:** the raw `lat`/`lon` columns are replaced by a single **"Karte"**
column (`✓` / red `fehlt`); active sort column shows a ▲/▼ arrow; the hint
line always shows the saved-entry count.
- **"Karte öffnen"** with no coordinates now shows a dialog, not just a status
line.
- **Window size & position** are remembered between sessions
(`data/window.json`).
## 2026-09-07 — data safety, robustness, easier input
Addressed the top three findings from [improvements.md](improvements.md).
### Data safety (`DataStore`)
- All writes (append / update / delete) now rebuild the full DataFrame and go
through `_save_csv`: **rotating backup** to `data/backups/` (startup + before
every change, keep 20, skip if unchanged) then **atomic write**
(`tmp` + `fsync` + `os.replace`).
- `orte.csv` missing / empty (`EmptyDataError`) / unreadable now falls back to an
empty table or the newest backup instead of crashing.
### Geocoder robustness (`GeocoderWorker`, `geocode_city`)
- Each queue item runs inside `try/except`; a failing lookup or callback logs a
traceback and the worker keeps going (previously an unexpected error killed the
thread and silently froze all further geocoding).
- `geocode_city` raises `GeocodingUnavailable` when every query failed on a
service/network error. After 3 in a row the app shows a one-time
"Standortdienst nicht erreichbar" dialog; entries still save without
coordinates.
### Easier, safer input
- Date fields (entry form + edit dialog) are now `ttkbootstrap.DateEntry`
calendar pickers, validated/normalized to ISO by `parse_date()` (also accepts
`TT.MM.JJJJ`). Invalid dates are rejected with a dialog.
- Edit dialog has manual **Breitengrad / Längengrad** fields for fixing
coordinates by hand.
- Tab 2: rows without coordinates shown in red, "Nur ohne Koordinaten" filter,
count in the hint line, right-click **Koordinaten suchen**.
### Housekeeping
- `git init` + `.gitignore`.
- Rotating log file at `data/app.log` (`_setup_logging`).
- Shared helpers `filter_locations` / `split_city_plz` / `parse_coord` replace
duplicated combobox code.
- Config constants: `GEOCODE_REGIONS`, `MAP_DEFAULT_CENTER`, `MAP_DEFAULT_ZOOM`,
`MAX_BACKUPS`.
- `generate_map` fits the view to the markers.
### Verification
Non-GUI smoke tests (helpers, `DataStore` backup/atomic/recovery, geocoder
resilience) pass. The GUI now *can* be built and driven on the dev Mac via a
Homebrew Python with Tk 9 — see [dev-notes.md](dev-notes.md).