From 43a2c4f57b1c4f23b03b964a412f4ce971650715 Mon Sep 17 00:00:00 2001 From: R0GGER Date: Mon, 9 Nov 2026 17:06:35 +0100 Subject: [PATCH] plans --- .cursor/plans/gebogen_lijnen_e6c44304.plan.md | 51 ++++++++++ ...pdate-melding_blauwe_stip_0a210c0e.plan.md | 93 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 .cursor/plans/gebogen_lijnen_e6c44304.plan.md create mode 100644 .cursor/plans/update-melding_blauwe_stip_0a210c0e.plan.md diff --git a/.cursor/plans/gebogen_lijnen_e6c44304.plan.md b/.cursor/plans/gebogen_lijnen_e6c44304.plan.md new file mode 100644 index 0000000..8670cbd --- /dev/null +++ b/.cursor/plans/gebogen_lijnen_e6c44304.plan.md @@ -0,0 +1,51 @@ +--- +name: Gebogen lijnen +overview: Lijnen en pijlen krijgen buigpunten waardoor een vloeiende kromme door alle punten loopt. Bij een geselecteerde lijn staat tussen elk paar punten een spook-greep; slepen daarvan maakt een nieuw buigpunt, dubbelklikken op een buigpunt verwijdert het. +todos: + - id: model + content: "LineAnnotation: Bends-lijst, Catmull-Rom-naar-Bezier helper, Render/Bounds/HitTest/Move/Clone aanpassen, pijlpunt langs raaklijn" + status: completed + - id: handles + content: "Grepen: buigpunten + spook-grepen, BeginHandleDrag voegt buigpunt in, RemoveHandle; IsGhostHandle/RemoveHandle in Annotation" + status: completed + - id: surface + content: "AnnotationSurface: spook-grepen anders tekenen, echte grepen voorrang bij HitHandle" + status: completed + - id: editor + content: "EditorWindow: dubbelklik op buigpunt verwijdert het (met undo), hint-tekst bijwerken" + status: completed +isProject: false +--- + +# Gebogen lijnen en pijlen + +## Gedrag +- Selecteer een lijn of pijl: je ziet de begin- en eindgreep, de buigpunten en, halverwege elk stuk van de kromme, een kleine halfdoorzichtige spook-greep. +- Sleep je een spook-greep, dan wordt die een echt buigpunt en volgt de lijn de muis (zoals in je screenshot). +- Dubbelklik op een buigpunt verwijdert het. Beide acties kun je ongedaan maken. +- De kromme loopt precies door alle punten (Catmull-Rom, omgezet naar kubische Beziers). De pijlpunt volgt de richting van het laatste stuk. + +## Wijzigingen + +**[src/Kniip/Editor/Annotations/LineAnnotation.cs](src/Kniip/Editor/Annotations/LineAnnotation.cs)** +- Nieuw: `List Bends`, met `Start + Bends + End` als doorlooppunten. +- Een helper bouwt de Bezier-segmenten. Voor `Bounds`, `HitTest` en de posities van de spook-grepen gebruikt hij bemonsterde punten (ongeveer 16 per segment). Zonder buigpunten blijft alles gelijk aan nu. +- `Render`: een `StreamGeometry` met `BezierTo`. Bij een pijl wordt de richting bepaald door `End` min het laatste controlepunt. Het laatste segment eindigt op het basispunt van de pijlpunt. +- Grepen: index 0 is `Start` en 1 is `End`, zodat bestaande code blijft werken. Daarna volgen de buigpunten en dan de spook-grepen (het Bezier-punt bij t=0,5 van elk segment). +- `BeginHandleDrag`: bij een spook-greep wordt een buigpunt op de juiste plek in `Bends` ingevoegd en het actieve buigpunt onthouden. `MoveHandle` verplaatst daarna dat punt. +- Met Shift blijft `SnapAngle` werken voor begin en eind, maar dan ten opzichte van het naastliggende punt. +- `Move` verschuift ook alle buigpunten. `Clone` maakt een diepe kopie van `Bends`, nodig voor ongedaan maken (zelfde patroon als in `HighlightAnnotation`). + +**[src/Kniip/Editor/Annotations/Annotation.cs](src/Kniip/Editor/Annotations/Annotation.cs)** +- `public virtual bool IsGhostHandle(int index) => false;` +- `public virtual bool RemoveHandle(int index) => false;` (LineAnnotation verwijdert hiermee een buigpunt) + +**[src/Kniip/Editor/AnnotationSurface.cs](src/Kniip/Editor/AnnotationSurface.cs)** +- `DrawSelection` tekent spook-grepen als kleinere, halfdoorzichtige cirkels. `HitHandle` controleert eerst de echte grepen en daarna pas de spook-grepen, zodat een echte greep voorrang krijgt als ze overlappen. + +**[src/Kniip/Editor/EditorWindow.xaml.cs](src/Kniip/Editor/EditorWindow.xaml.cs)** (rond regel 452) +- In `Surface_MouseLeftButtonDown`: als op een greep geklikt wordt met `e.ClickCount == 2` en `_selected.RemoveHandle(handle)` slaagt, dan volgen `Commit(_pending)` en `InvalidateVisual`, en stopt de verwerking daar. Anders start het bestaande sleepgedrag. +- Optioneel: in `UpdateHint` een korte tip toevoegen voor lijnen ("Sleep het middenpunt om te buigen, dubbelklik om een punt te verwijderen"). + +## Niet nodig +Exporteren gaat via `Render` in [src/Kniip/Editor/DocumentRenderer.cs](src/Kniip/Editor/DocumentRenderer.cs) en werkt dus automatisch. Ook het aanmaken van lijnen (`UpdateCreating`) blijft ongewijzigd: nieuwe lijnen zijn recht. \ No newline at end of file diff --git a/.cursor/plans/update-melding_blauwe_stip_0a210c0e.plan.md b/.cursor/plans/update-melding_blauwe_stip_0a210c0e.plan.md new file mode 100644 index 0000000..74b9e1f --- /dev/null +++ b/.cursor/plans/update-melding_blauwe_stip_0a210c0e.plan.md @@ -0,0 +1,93 @@ +--- +name: Update-melding blauwe stip +overview: kniip controleert op de achtergrond (bij het starten en daarna elke 24 uur, uit te zetten in Instellingen) op een nieuwe versie. Als die er is, krijgen de knop Instellingen in de editor-werkbalk en de tab Update in Instellingen een blauwe stip. +todos: + - id: setting + content: CheckForUpdates toevoegen aan AppSettings + status: completed + - id: notifier + content: UpdateNotifier maken (controle na het starten en elke 24 uur, AvailabilityChanged-event, Report) + status: completed + - id: app + content: "UpdateNotifier koppelen in App: aanroepen bij het opstarten en in SaveSettings" + status: completed + - id: editor-badge + content: Blauwe stip op de knop Instellingen in EditorWindow + status: completed + - id: settings-tab + content: Blauwe stip op de tab Update, vinkje voor automatische controle, Report na handmatige controle + status: completed + - id: changelog-readme + content: CHANGELOG.md sectie 1.1.4 toevoegen en README bijwerken (achtergrondcontrole, versietabel, build-commentaar) + status: completed + - id: bump-version + content: Versie naar 1.1.4 in build.ps1, installer/Kniip.iss en src/Kniip/Kniip.csproj + status: completed + - id: build-release + content: build.ps1 draaien, commit "1.1.4", tag 1.1.4 en pushen; installer klaarzetten voor de release op git.hibbit.net + status: completed +isProject: false +--- + +# Blauwe update-melding bij Instellingen en de tab Update + +## Huidige situatie +- [src/Kniip/Update/UpdateChecker.cs](src/Kniip/Update/UpdateChecker.cs) haalt releases op met `GetReleasesAsync`, maar dat gebeurt nu alleen in [src/Kniip/Settings/SettingsWindow.xaml.cs](src/Kniip/Settings/SettingsWindow.xaml.cs) zodra de tab Update geopend wordt (`Tabs_SelectionChanged` gevolgd door `CheckForUpdatesAsync`). +- De knop Instellingen staat in [src/Kniip/Editor/EditorWindow.xaml](src/Kniip/Editor/EditorWindow.xaml) (regel 318–321, glyph ``). +- `AccentBrush` is `#0067C0` (blauw) in [src/Kniip/App.xaml](src/Kniip/App.xaml), en die gebruiken we voor de stip. + +```mermaid +flowchart LR + AppStart[App start] --> Notifier[UpdateNotifier] + Timer["Timer 24 uur"] --> Notifier + Notifier -->|GetReleasesAsync| Checker[UpdateChecker] + Notifier -->|AvailabilityChanged| EditorBadge[Stip op knop Instellingen] + Notifier -->|AvailabilityChanged| TabBadge[Stip op tab Update] + SettingsCheck[Handmatige controle in tab Update] -->|Report| Notifier +``` + +## Stappen + +1. **Nieuwe instelling** in [src/Kniip/Settings/AppSettings.cs](src/Kniip/Settings/AppSettings.cs): + `public bool CheckForUpdates { get; set; } = true;` + +2. **Nieuwe klasse `UpdateNotifier`** in `src/Kniip/Update/UpdateNotifier.cs`: + - Houdt `ReleaseInfo? Available` bij en `bool IsUpdateAvailable`, met een event `AvailabilityChanged` dat op de UI-thread wordt afgevuurd. + - `Apply(bool enabled)`: als de controle aanstaat, wordt die kort na het starten uitgevoerd (ongeveer 10 seconden vertraging, zodat het opstarten niet trager wordt) en daarna via een `DispatcherTimer` elke 24 uur. Als de controle uitstaat, stopt de timer en verdwijnt de stip. + - `CheckAsync()` roept `UpdateChecker.GetReleasesAsync` aan en vangt `UpdateException` stil af, zodat een achtergrondcontrole nooit een foutmelding toont. + - `Report(ReleaseInfo? newest)` wordt gebruikt door de handmatige controle in de tab Update, zodat de stip ook daarmee gelijkloopt. + - "Nieuwer" betekent hetzelfde als in `ShowReleases`: `r.Version > UpdateChecker.CurrentVersion`. + +3. **App** ([src/Kniip/App.xaml.cs](src/Kniip/App.xaml.cs)): + - Een property `public UpdateNotifier Updates { get; } = new();` + - Bij het opstarten (na `ApplyHotkeys`) wordt `Updates.Apply(Settings.CheckForUpdates)` aangeroepen. + - In `SaveSettings()` gebeurt dat opnieuw, zodat het aan- of uitzetten van de controle direct effect heeft. + +4. **Stip op de knop Instellingen** ([src/Kniip/Editor/EditorWindow.xaml](src/Kniip/Editor/EditorWindow.xaml) en `.xaml.cs`): + - De inhoud van de knop wordt een `Grid` met de bestaande glyph plus ``. + - In de code-behind abonneert de editor zich op `App.Instance.Updates.AvailabilityChanged`. Bij een wijziging worden `SettingsBadge.Visibility` en de tooltip bijgewerkt (de tooltip wordt "Instellingen - nieuwe versie beschikbaar"). Bij `Closed` wordt het abonnement weer opgezegd. + +5. **Stip op de tab Update en een vinkje voor de achtergrondcontrole** ([src/Kniip/Settings/SettingsWindow.xaml](src/Kniip/Settings/SettingsWindow.xaml) en `.xaml.cs`): + - De `Header` van `UpdateTab` wordt een horizontale `StackPanel` met de tekst "Update" en daarachter een blauwe `Ellipse x:Name="UpdateTabBadge"` van dezelfde stijl, met een margin links van 6. + - In de tab Update, onder `CurrentVersionText`, komt ``. Die wordt gevuld in `LoadFrom`, bewaard in `Save_Click` en meegenomen bij Standaardinstellingen. + - Het venster abonneert zich op `AvailabilityChanged` om de zichtbaarheid van de stip te zetten, en zegt dat abonnement op bij `Closed`. + - Na een handmatige controle roept `ShowReleases` `App.Instance.Updates.Report(newer.FirstOrDefault())` aan. + +## Gedrag +- De stip blijft zichtbaar zolang er een nieuwere versie is. Na het updaten start kniip met de nieuwe versie, en dan is er geen nieuwere versie meer, dus verdwijnt de stip vanzelf. +- Er komen geen extra meldingen in het systeemvak, zoals afgesproken. + +## Changelog en release 1.1.4 (na de codewijzigingen) + +6. **[CHANGELOG.md](CHANGELOG.md)**: bovenaan een nieuwe sectie `## 1.1.4 - 2026-11-09` in dezelfde stijl als de eerdere versies, bijvoorbeeld: + - Onder `### Nieuw`: **Melding bij een nieuwe versie.** kniip kijkt bij het starten en daarna elke dag of er een nieuwere versie is. Als die er is, staat er een blauwe stip op de knop **Instellingen** in de editor en op de tab **Update**. Je zet dit uit in de tab **Update** met **Automatisch controleren op nieuwe versies**. + - Onder `### Gewijzigd`: kniip zoekt nu standaard zelf op de achtergrond naar updates. Tot nu toe gebeurde dat alleen als je de tab **Update** opende, zoals vermeld bij 1.1.0. +7. **[README.md](README.md)**: + - In de versietabel 1.1.3 vervangen door 1.1.4, met de link `.../releases/download/1.1.4/Kniip-Setup-1.1.4.exe`. + - Het commentaar `# versie 1.1.3` bij het bouwen wordt `# versie 1.1.4`. + - Bij "Updaten vanuit kniip" komt een zin over de automatische controle en de blauwe stip. +8. **Versienummer** van 1.1.3 naar 1.1.4 in [build.ps1](build.ps1) (`$Version`), [installer/Kniip.iss](installer/Kniip.iss) (`#define AppVersion`) en [src/Kniip/Kniip.csproj](src/Kniip/Kniip.csproj) (``). +9. **Bouwen en uitbrengen**, op dezelfde manier als bij 1.1.2 en 1.1.3: + - `.\build.ps1` draaien. Dat levert `artifacts\Kniip-1.1.4.exe` en `artifacts\Kniip-Setup-1.1.4.exe` op. + - Daarna `git add -A`, `git commit -m "1.1.4"`, `git tag 1.1.4` (zonder `v`, net als de vorige tags) en `git push origin HEAD` plus `git push origin 1.1.4`. + - De release op git.hibbit.net maak je, net als eerder, zelf aan. Je hangt daar `artifacts\Kniip-Setup-1.1.4.exe` aan als bijlage en plakt de 1.1.4-tekst uit de changelog in de beschrijving. Ik lever die tekst kant-en-klaar aan.