1.1.0
This commit is contained in:
1 parent
e7ed05922e
commit
cc08b00e3b
20 files changed
+1318
-32
No files matched your search
@@ -0,0 +1,64 @@
|
||||
---
|
||||
name: Naamsjabloon opslaan
|
||||
overview: In de tab Opslaan komt per soort (knipsels en screencasts) een eigen naamsjabloon met %J, %M, %D, %V, %Rn en %Nn. Mappen worden automatisch aangemaakt en kniip plakt zelf de extensie (.png, .mp4 of .gif) erachter.
|
||||
todos:
|
||||
- id: template
|
||||
content: FileNameTemplate.cs maken (tokens, submappen, opschonen, %N per map, fallback)
|
||||
status: completed
|
||||
- id: settings
|
||||
content: SnipFileNameTemplate en VideoFileNameTemplate toevoegen aan AppSettings
|
||||
status: completed
|
||||
- id: windowname
|
||||
content: Programmanaam van het venster bepalen in SnapshotWindows en doorgeven via RegionCaptureWindow, App, RecordingController
|
||||
status: completed
|
||||
- id: save
|
||||
content: EditorWindow.Save/SaveAs en ScreencastWindow.FixedTarget/DefaultFileName op het sjabloon laten draaien
|
||||
status: completed
|
||||
- id: ui
|
||||
content: Naamvelden met live voorbeeld en tokenuitleg toevoegen in de tab Opslaan
|
||||
status: completed
|
||||
- id: build
|
||||
content: Bouwen en testen met het voorbeeld %J/%M-%D/%V_%N3
|
||||
status: completed
|
||||
isProject: false
|
||||
---
|
||||
|
||||
# Naamsjabloon voor opslaan
|
||||
|
||||
## Gedrag
|
||||
|
||||
- In de tab **Opslaan** komt onder elke map (Knipsels en Screencasts) een veld **Naam**, met een live voorbeeld eronder. Bijvoorbeeld: `%J/%M-%D/%V_%N3` wordt `2026/11-08/Cursor_001.png`.
|
||||
- Tokens:
|
||||
- `%J` is het jaar (2026).
|
||||
- `%M` is de maand en `%D` de dag, allebei met twee cijfers (11, 08), zodat de mappen goed sorteren.
|
||||
- `%V` is de programmanaam van het venster, bijvoorbeeld `Cursor` of `chrome`.
|
||||
- `%Rn` zijn n willekeurige letters en cijfers.
|
||||
- `%Nn` is het eerste vrije nummer in de doelmap, met n cijfers (001, 002, ...). In een nieuwe map begint de teller weer bij 001.
|
||||
- Met `/` of `\` maak je submappen. Die maakt kniip zelf aan, onder de ingestelde map.
|
||||
- kniip plakt de extensie er zelf achter: `.png` voor knipsels, `.mp4` of `.gif` voor screencasts.
|
||||
- Is het veld leeg, dan blijft de huidige naam staan (`Knipsel 2026-11-08 234500`), zodat bestaande instellingen gewoon blijven werken.
|
||||
- Ongeldige tekens zoals `: * ? " < > |` worden `_`. Zit er geen `%N` in en bestaat het bestand al, dan valt kniip terug op de bestaande `(2)`-nummering uit `SaveLocation.UniquePath`.
|
||||
- Tokens beginnen altijd met `%`. In jouw voorbeeld moet `_N3` dus `_%N3` zijn. Het live voorbeeld laat meteen zien of het klopt.
|
||||
|
||||
## Waar komt %V vandaan
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
WinSnip["Alt+PrintScreen: aangeklikt venster"] --> Name[Programmanaam]
|
||||
RegionSnip["Rechthoekknipsel: venster onder het midden van de selectie"] --> Name
|
||||
Screencast["Screencast: venster onder het midden van het opnamegebied"] --> Name
|
||||
Other["Knipprogramma, klembord, Openen met"] --> Fallback["'Knipsel' of 'Screencast'"]
|
||||
```
|
||||
|
||||
Het venster wordt bepaald uit de vensterlijst die al vóór de overlay wordt vastgelegd (`PhysicalWindow.SnapshotWindows`). Zo staat kniip's eigen overlay er nooit tussen.
|
||||
|
||||
## Wijzigingen
|
||||
|
||||
- **Nieuw** [src/Kniip/Settings/FileNameTemplate.cs](src/Kniip/Settings/FileNameTemplate.cs): `Resolve(folder, template, windowName, extension)` geeft het volledige pad terug, inclusief submappen, opschoning en `%N`-telling. Daarnaast `Preview(...)` voor het voorbeeld in de instellingen.
|
||||
- [src/Kniip/Settings/AppSettings.cs](src/Kniip/Settings/AppSettings.cs): twee nieuwe instellingen, `SnipFileNameTemplate` en `VideoFileNameTemplate`. Leeg betekent de huidige standaardnaam.
|
||||
- [src/Kniip/Recording/PhysicalWindow.cs](src/Kniip/Recording/PhysicalWindow.cs): `SnapshotWindows` geeft naast de rechthoek ook de handle van elk venster terug. Een nieuwe helper zoekt via `GetWindowThreadProcessId` en `Process.ProcessName` de programmanaam op.
|
||||
- [src/Kniip/Capture/RegionCaptureWindow.xaml.cs](src/Kniip/Capture/RegionCaptureWindow.xaml.cs) en [src/Kniip/App.xaml.cs](src/Kniip/App.xaml.cs): `Finished` levert naast de afbeelding ook de vensternaam. `OpenEditor(image, windowName)` geeft die door aan `EditorWindow`.
|
||||
- [src/Kniip/Recording/RecordingController.cs](src/Kniip/Recording/RecordingController.cs): bij het kiezen van het gebied wordt de vensternaam onthouden. Die gaat via `RecordingFinished` naar `ScreencastWindow`.
|
||||
- [src/Kniip/Editor/EditorWindow.xaml.cs](src/Kniip/Editor/EditorWindow.xaml.cs): `Save()` gebruikt `FileNameTemplate.Resolve` in plaats van de vaste `Knipsel {DateTime.Now:...}.png`. `SaveAs()` stelt de gegenereerde bestandsnaam voor.
|
||||
- [src/Kniip/Recording/ScreencastWindow.xaml.cs](src/Kniip/Recording/ScreencastWindow.xaml.cs): `FixedTarget()` en `DefaultFileName` gaan via het sjabloon, met `.gif` of `.mp4` afhankelijk van het formaat.
|
||||
- [src/Kniip/Settings/SettingsWindow.xaml](src/Kniip/Settings/SettingsWindow.xaml) en [.xaml.cs](src/Kniip/Settings/SettingsWindow.xaml.cs): per soort een `TextBox` **Naam** met een voorbeeldregel, een uitleg van de tokens als hint, en opslaan en herstellen samen met de mapinstellingen. De bestaande hint over "datum en tijd in de naam" wordt aangepast.
|
||||
@@ -0,0 +1,86 @@
|
||||
---
|
||||
name: Update-tab met changelog
|
||||
overview: Add an "Update" tab to the settings that reads releases from git.hibbit.net (public Gitea/Forgejo API), shows the changelog rendered as Markdown, and on "Updaten" downloads the installer, runs it silently and restarts kniip.
|
||||
todos:
|
||||
- id: checker
|
||||
content: "UpdateChecker: releases ophalen via Gitea-API, versies vergelijken"
|
||||
status: completed
|
||||
- id: markdown
|
||||
content: Markdig-referentie + MarkdownRenderer naar FlowDocument
|
||||
status: completed
|
||||
- id: installer-dl
|
||||
content: "UpdateInstaller: download met voortgang en stille start"
|
||||
status: completed
|
||||
- id: tab-ui
|
||||
content: Update-tab in SettingsWindow (xaml + code-behind)
|
||||
status: completed
|
||||
- id: app-exit
|
||||
content: "App: TryCloseAllWindows en --updated-argument"
|
||||
status: completed
|
||||
- id: iss
|
||||
content: "Kniip.iss: herstart na stille installatie"
|
||||
status: completed
|
||||
- id: readme
|
||||
content: "README: releasenotes en publiek-vereiste documenteren"
|
||||
status: completed
|
||||
isProject: false
|
||||
---
|
||||
|
||||
# Update-tab met changelog
|
||||
|
||||
## Uitgangspunten
|
||||
- git.hibbit.net heeft een Gitea/Forgejo-API (`/api/v1/version` geeft `28.3.0`). Releases: `GET https://git.hibbit.net/api/v1/repos/rogier/kniip/releases?limit=20`. De repo moet **publiek** worden; nu geeft die URL 404.
|
||||
- Per release gebruiken we deze velden: `tag_name` (`v1.2.0`), `name`, `body` (markdown-changelog), `published_at`, `draft`, `prerelease`, `html_url` en `assets[]`. Uit `assets[]` zoeken we `name` = `Kniip-Setup-*.exe` en de bijbehorende `browser_download_url` op.
|
||||
- Alleen handmatig controleren: bij het openen van de tab en met de knop "Opnieuw controleren". Er komt geen achtergrondcontrole.
|
||||
- Huidige versie: `Assembly.GetEntryAssembly().GetName().Version`, gezet via `-p:Version` in [build.ps1](build.ps1). Niet `InformationalVersion`, want daar zet de .NET 8 SDK een `+commithash` achter.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Tab[Update-tab geopend] --> Api["GET releases API"]
|
||||
Api --> Compare{"Nieuwere versie?"}
|
||||
Compare -->|ja| Show["Changelog van alle nieuwere versies + knop Updaten"]
|
||||
Compare -->|nee| Current["'Je hebt de nieuwste versie' + changelog huidige versie"]
|
||||
Show --> Download["Installer downloaden naar TEMP met voortgang"]
|
||||
Download --> Exit["Vensters sluiten, installer /VERYSILENT starten, kniip afsluiten"]
|
||||
Exit --> Restart["Installer start kniip --updated"]
|
||||
```
|
||||
|
||||
## Nieuwe bestanden
|
||||
- `src/Kniip/Update/UpdateChecker.cs`
|
||||
- Record `ReleaseInfo(Version Version, string Tag, string Title, DateTimeOffset? Date, string Body, string HtmlUrl, string? InstallerUrl, long InstallerSize)`.
|
||||
- `Task<IReadOnlyList<ReleaseInfo>> GetReleasesAsync(CancellationToken)`: haalt de releases op via één statische `HttpClient` (zoals in [ZiplineUploader.cs](src/Kniip/Upload/ZiplineUploader.cs)) met User-Agent `kniip/<versie>`. Drafts, prereleases en tags die niet als versie te lezen zijn vallen af. Gesorteerd van nieuw naar oud.
|
||||
- `static Version CurrentVersion`, genormaliseerd naar 3 delen voor de vergelijking.
|
||||
- `src/Kniip/Update/UpdateInstaller.cs`
|
||||
- `Task<string> DownloadAsync(ReleaseInfo, IProgress<double>, CancellationToken)` downloadt naar `%TEMP%\kniip-update\Kniip-Setup-<versie>.exe`. Daarna controleren we of de bestandsgrootte gelijk is aan `size` van de asset.
|
||||
- `Start(string path)` start de installer met `/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS`. `UsePreviousTasks` behoudt de eerder gekozen integraties.
|
||||
- `src/Kniip/Update/MarkdownRenderer.cs`: zet markdown om naar een WPF `FlowDocument` via **Markdig** (nieuwe NuGet-referentie in [Kniip.csproj](src/Kniip/Kniip.csproj)). Een eigen walker over de AST ondersteunt:
|
||||
- koppen, alinea's, opsommingen (ook genummerd en genest) en citaten
|
||||
- codeblokken en inline code (Consolas, grijze achtergrond), vet, cursief en doorhalen
|
||||
- links: `Hyperlink` die de browser opent, met `Process.Start` zoals `OpenUrl` in `SettingsWindow`
|
||||
- horizontale lijnen
|
||||
- kleuren en lettertypen uit de bestaande resources (`AccentBrush`, `SubtleTextBrush`, Segoe UI)
|
||||
|
||||
## Wijzigingen
|
||||
- [src/Kniip/Settings/SettingsWindow.xaml](src/Kniip/Settings/SettingsWindow.xaml): nieuwe `TabItem Header="Update"` na "Editor", met:
|
||||
- `CardTitle` "Update", met daaronder "Geïnstalleerde versie: 1.0.0" en een statusregel (`Hint`).
|
||||
- Knoppen `AccentButton` "Updaten naar x.y.z" (verborgen als er geen update is), `SecondaryButton` "Opnieuw controleren" en `FlatButton` "Releasepagina".
|
||||
- `ProgressBar` (verborgen) voor de download.
|
||||
- Changelog in een `FlowDocumentScrollViewer` met vaste hoogte (~300) en een rand. De tab staat al in een `ScrollViewer`, dus de viewer heeft een vaste hoogte nodig.
|
||||
- [src/Kniip/Settings/SettingsWindow.xaml.cs](src/Kniip/Settings/SettingsWindow.xaml.cs):
|
||||
- In `Tabs_SelectionChanged` start de eerste keer dat de Update-tab wordt gekozen de controle (`CheckForUpdatesAsync`). Het resultaat blijft bewaard zolang het venster open is.
|
||||
- Changelog: per nieuwere release een kop "Versie x.y.z, d MMMM yyyy" met de body eronder. Is er geen update, dan tonen we de notes van de huidige versie. Is er een fout of offline, dan tonen we een melding in de statusregel.
|
||||
- `Update_Click`:
|
||||
1. Bevestigen met "kniip wordt afgesloten en bijgewerkt".
|
||||
2. Downloaden met voortgang. Tijdens het downloaden zijn de knoppen uitgeschakeld en annuleert sluiten van het venster de download.
|
||||
3. `App.Instance.TryExitForUpdate()`. Lukt dat, dan `UpdateInstaller.Start` en `Shutdown`.
|
||||
- [src/Kniip/App.xaml.cs](src/Kniip/App.xaml.cs):
|
||||
- Splits `ExitApplication` op in `bool TryCloseAllWindows()`. Die stopt als er een screencast loopt of als een editor het sluiten tegenhoudt, zodat we de installer pas starten als kniip echt kan stoppen.
|
||||
- Nieuw argument `--updated` in `HandleArguments`: toont de ballon "kniip is bijgewerkt naar versie x.y.z" en gedraagt zich verder als `--tray`.
|
||||
- [installer/Kniip.iss](installer/Kniip.iss): extra `[Run]`-regel die kniip opnieuw start na een stille installatie:
|
||||
`Filename: "{app}\{#AppExe}"; Parameters: "--updated"; Flags: nowait; Check: WizardSilent`
|
||||
- [README.md](README.md), sectie "Een nieuwe versie publiceren": de releasebeschrijving (markdown) wordt de changelog in kniip, de installerbijlage moet `Kniip-Setup-<versie>.exe` heten, en de repo moet publiek zijn voor de updatecontrole.
|
||||
|
||||
## Randgevallen
|
||||
- Draai je kniip als losse exe (niet geïnstalleerd), dan installeert de update in `%LOCALAPPDATA%\Programs\Kniip`. Dat is acceptabel; het staat in de bevestiging.
|
||||
- Een release zonder installerbijlage: geen knop Updaten, wel een link naar de releasepagina.
|
||||
- Een oude download in `%TEMP%\kniip-update` wordt overschreven.
|
||||
Reference in new issue
Block a user