diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e379f91..c619b219 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,103 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). --- +## [1.19.0] — 2026-09-15 + +> First stable release of the 1.19.0 cycle. Replaces the `1.19.0-beta.1` +> … `1.19.0-beta.8` builds — see git history / the entries below for the +> detailed beta-by-beta log if needed. Headline of this cycle: MTP support +> for newer Garmin devices (Linux + Windows), Linux AppImage +> self-administration, Pocket Query e-mail retrieval, Polish and Spanish +> UI languages, and the first wave of GSAK filter-parity work (12 text +> filter operators). + +### Added + +- **MTP support for newer Garmin devices, Linux and Windows (#453, #822, + #826)** — Newer Garmin models (2020+) dropped USB mass-storage in + favour of MTP (Media Transfer Protocol), which the mount-point-based + device detection couldn't see, so "Send to GPS" silently found no + device for these units. On Linux, device detection now also scans + GVFS/MTP mounts (`/run/user/*/gvfs/mtp:...`); on Windows, a new + `opensak.gps.mtp` module talks to the device through the same Shell + "Folder" automation API File Explorer itself uses (via `pywin32`, a + new Windows-only dependency), wrapped in an `MTPDevice`/`MTPPath` + adapter that mirrors `pathlib.Path`'s interface — so the existing + GPX/GGZ export code needed no changes at all. With this, #453 is + resolved on both Linux and Windows; macOS remains unconfirmed. Thanks + to Brian Anderson (@blazerat) for the investigation and fix. +- **Linux AppImage: self-administration, no terminal required (#824, + #835, #836, #837)** — Replaces the originally planned external + `uninstall.sh` + AppImageUpdate approach with self-integration, + self-update, and in-app uninstall implemented directly in OpenSAK. + Linux-only; a no-op everywhere else. On first launch, OpenSAK offers + to install itself into the application menu; an "Upgrade now" button + downloads and atomically replaces the running AppImage; and a new + "Uninstall OpenSAK" button removes the desktop integration with a + choice between removing the program only or the program and all data. +- **Pocket Query e-mail retrieval (#443)** — OpenSAK can now check a + configured IMAP mailbox for Pocket Query zip attachments and import + them automatically. Settings → PQ Email configures the mailbox + (host/port/SSL/credentials), with the password stored in the OS + keyring, never in plaintext. File → "Check for PQ Email…" runs a + manual, on-demand check; an opt-in checkbox deletes the e-mail after a + successful import. An "only check new (unread) messages" option uses + IMAP's native `\Seen` flag to avoid re-importing already-read PQ + e-mails. Gmail and Outlook.com/Live.com aren't supported yet (both + need OAuth2, tracked as #697/#698); scheduled/background checking is + tracked separately as #445. Thanks to Jimbo-DK for real-world PQ-club + mailbox testing and feedback. +- **Polish and Spanish UI languages** — OpenSAK now ships with `pl` and + `es` translations, bringing the total to 10 supported languages. Both + are a machine-translated first pass; community review and corrections + are welcome before promotion to stable status. +- **Text filter operators (#557, #850)** — Name, GC code, Placed by, + Owner, Country, State and County filters now offer 12 operators + instead of a single substring match: `contains`/`not contains`, + `equals`/`not equals`, `starts with`/`ends with`, `in list`/`not in + list`, `empty`/`not empty`, and `regex`/`not regex`. Matching is + pushed down to SQL where possible; anything SQLite can't express + falls back to an in-Python check, so accented/non-Latin text still + matches correctly. Existing saved filter profiles keep working + unchanged. First part of the GSAK filter-parity work tracked in #821. + Thanks to @nagisml for the contribution. +- **Cache type icons in filter dialog (#855, #856)** — The General tab's + cache type checkboxes now show the same type icon used in the cache + table instead of plain text labels. Thanks to @nagisml. + +### Fixed + +- **GPX import failing on invalid XML character references (#845, + #846)** — A cache description containing a character reference to a + code point XML 1.0 forbids (e.g. from text pasted out of Word) made + lxml reject the entire file and import zero caches. Illegal character + references and raw control characters are now stripped while + streaming the file, before parsing, for GPX, PQ ZIP, and .loc imports + alike. Thanks to @nagisml for the report and fix. +- **Filter dialog: Reset didn't clear the Owner name field (fixes + #848)** — Resetting the General tab (or "Reset all") cleared Name, GC + code and Placed by but left a typed Owner name in place. Thanks to + @nagisml for the report and fix (#849). +- **Filter dialog: single-day date range failed to match caches (fixes + #844)** — The start-of-range time was hardcoded to 23:59 regardless of + whether it was the "from" or "to" bound, so filtering on a single day + produced a 59-second window instead of the full day. +- **Filter dialog: Hidden date range not restored on reopen (fixes + #857)** — Reopening the Filter dialog after setting a Hidden date + range showed the Hidden date checkboxes unchecked and the date fields + empty, even though the cache list was still correctly filtered. + `HiddenDateFilter` is now a proper filter class alongside its + siblings, with working save/reload and dialog restore. Thanks to + ianwork for the report. + +### Changed + +- **Filter dialog: "Save filter" pre-fills the current profile name + (#852)** — When a saved profile is selected, the save dialog now + suggests its name instead of an empty field. Thanks to @nagisml. + +--- + ## [1.19.0-beta.8] — 2026-09-14 ### Added diff --git a/docs/filters.md b/docs/filters.md index 58803df5..a984184f 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -22,13 +22,14 @@ Filters can also be **nested**: an outer AND group can contain an inner OR group ## Filter tabs -The filter dialog is split across six tabs: +The filter dialog is split across seven tabs: | Tab | What's on it | |---|---| | **General** | Cache type, container, D/T, found status, availability, distance, premium, trackables, corrected coordinates | | **Dates** | Hidden date, found by me date, DNF date, last log date | | **Other** | Country / State / County, user flag, DNF, FTF, favourite points, locked | +| **Line/Polygon** | Caches along a route, inside an area, or near a list of points | | **Attributes** | ~70 standard Groundspeak attributes | | **Text Search** | Full-text search across description, logs, notes, and (optionally) hint | | **Where** | Raw SQL WHERE clause for advanced filtering | @@ -245,6 +246,34 @@ Filter by the date of the most recent log entry for the cache. --- +## Line / polygon filter + +The **Line/Polygon** tab works like GSAK's filter of the same name. Enter one point per line in the text box: + +```text +53.18346, 8.71113 +N 53 23.613, E 008 00.941 +W,GC12345 +``` + +- Any coordinate format OpenSAK understands works (decimal degrees, DMM, DMS), with or without a comma between latitude and longitude. +- `W,` takes the coordinates of a cache (its corrected coordinates when set) or a waypoint in the current database. +- Text after `#` is ignored, so you can annotate the list. +- **Add flagged (user flag)** appends a `W,` line for every cache with the user flag set. +- **Read points from file** loads a GPX file (track points, else route points, else waypoints), a KML file, or a text file in the format above — replacing or appending to the list. + +Choose the filter type: + +| Type | Includes caches… | Needs | +|---|---|---| +| Line | within the distance of the line through the points (a route or track) | 2+ points and a distance | +| Polygon | inside the area the points outline (closed automatically); a distance above 0 also includes caches that close to the outline | 3+ points | +| Points | within the distance of any single point | 1+ point and a distance | + +Check **Exclude** to invert the filter and keep only the caches that do *not* match. The filter uses a cache's corrected coordinates when set. Distances are measured along the Earth's surface; polygon edges are straight lines in latitude/longitude. Shapes that cross the ±180° meridian are not supported. + +--- + ## Text search filter The **Text Search** tab searches free-text fields for a word or phrase, rather than an exact match like the *Name* or *GC code* filters. diff --git a/site/user-guide.html b/site/user-guide.html index 4a1e0499..8274de96 100644 --- a/site/user-guide.html +++ b/site/user-guide.html @@ -3,7 +3,7 @@ -OpenSAK User Guide — v1.19.0-beta.8 +OpenSAK User Guide — v1.19.0