Files
kniip/.cursor/plans/schermafdruk_vertraging_0a5ac2a4.plan.md
2026-11-09 17:57:31 +01:00

6.0 KiB

name, overview, todos, isProject
name overview todos isProject
Schermafdruk vertraging Tray-submenu "Schermafdruk vertraging: Xs" (0-60 s, slider plus getalveld) dat rechthoek- en vensterknipsels uitstelt, met een klein aftelvenster bij de muis dat met Esc te annuleren is.
id content status
setting CaptureDelaySeconds toevoegen aan AppSettings (0-60, standaard 0) completed
id content status
tray Tray-submenu met TrackBar + NumericUpDown, SetCaptureDelay en CaptureDelayChanged in TrayIcon completed
id content status
countdown CountdownWindow (niet-activerend, volgt muis, Elapsed/Cancelled) maken completed
id content status
app BeginDelayedSnip in App.xaml.cs, Esc-binding tijdelijk, StartNewSnip onvertraagd, instelling opslaan completed
id content status
changelog CHANGELOG.md bijwerken completed
id content status
release CHANGELOG 1.1.5-item, build.ps1 draaien, commit/tag 1.1.5 en pushen completed
false

Schermafdruk vertraging (0-60 s)

Gedrag

  • In het tray-menu komt direct onder "Venster knippen" een item Schermafdruk vertraging: 0s met een submenu.
  • In het submenu staan een slider (0-60) en een getalveld (NumericUpDown, 0-60) die met elkaar meelopen. De tekst van het hoofditem werkt meteen bij, bijvoorbeeld Schermafdruk vertraging: 5s.
  • 0 betekent uit: dan werkt alles zoals nu.
  • De vertraging geldt voor "Rechthoek knippen" en "Venster knippen", via de tray en via de sneltoetsen. Screencasts en "Nieuw knipsel" na het sluiten van de editor (StartNewSnip) gaan zonder vertraging.
  • Tijdens het aftellen staat een klein, altijd-bovenop, niet-focusstelend venstertje bij de muis met de resterende seconden. Het scherm wordt pas vastgelegd nadat dat venster weg is, zodat het niet in de schermafdruk komt. Met Esc (of een klik op het venster) annuleer je.
flowchart LR
    trigger["Tray of sneltoets"] --> check{"Delay groter dan 0?"}
    check -->|nee| snip["BeginSnip: scherm bevriezen"]
    check -->|ja| countdown["CountdownWindow bij muis"]
    countdown -->|"Esc of klik"| cancel[Geannuleerd]
    countdown -->|"tijd om"| closeWin["Venster sluiten, korte pauze"] --> snip

Wijzigingen

src/Kniip/Settings/AppSettings.cs

  • Nieuwe instelling public int CaptureDelaySeconds { get; set; } (standaard 0), met een doc-comment in dezelfde stijl. Bij het lezen begrenzen tot 0-60.

src/Kniip/Infrastructure/TrayIcon.cs

  • _delayItem (een ToolStripMenuItem) met in de DropDownItems een ToolStripControlHost om een klein Panel: daarin een TrackBar (0-60, TickFrequency 5) en een NumericUpDown met het label "seconden".
  • public void SetCaptureDelay(int seconds) zet de besturingselementen en de menutekst.
  • public event Action<int>? CaptureDelayChanged: wordt afgevuurd als de waarde wijzigt. Opslaan gebeurt pas bij DropDownClosed, zodat niet elke stap van de slider een schrijfactie wordt.
  • Toetsen in het getalveld mogen het menu niet sluiten. Als dat in de praktijk toch gebeurt, krijgt het hostpaneel focus en geven we Enter/Esc expliciet door.

src/Kniip/App.xaml.cs

  • Bij het opstarten: _tray.SetCaptureDelay(Settings.CaptureDelaySeconds) en CaptureDelayChanged koppelen. De koppeling zet Settings.CaptureDelaySeconds en roept SettingsStore.Save aan.
  • BeginRegionSnip/BeginWindowSnip gaan via een nieuwe BeginDelayedSnip(bool pickWindow):
    • Als de vertraging 0 is, of er al een knipsel loopt, of er al wordt afgeteld, gaat het direct naar BeginSnip. Een tweede sneltoets tijdens het aftellen wordt genegeerd.
    • Anders wordt een CountdownWindow gestart. Na afloop sluit dat venster en volgt een DispatcherTimer van circa 150 ms (zelfde idee als StartNewSnip), daarna BeginSnip(pickWindow).
    • Esc tijdens het aftellen: tijdelijk een Escape-binding toevoegen aan HotkeyHook.Bindings die het aftellen annuleert, en daarna via ApplyHotkeys() herstellen. HotkeyHook.Capture gebruiken we niet, want dat slokt alle toetsen op, en de gebruiker moet tijdens het aftellen juist zijn scherm kunnen klaarzetten.
  • StartNewSnip blijft BeginRegionSnip direct aanroepen, maar dan via de onvertraagde route (BeginSnip(false)).

Nieuw: src/Kniip/Capture/CountdownWindow.xaml(.cs)

  • Een klein, rond-hoekig WPF-venster zonder rand: Topmost, ShowActivated=False, ShowInTaskbar=False, met WS_EX_NOACTIVATE/WS_EX_TOOLWINDOW zodat de focus bij het actieve programma blijft. De opmaak is vergelijkbaar met SnipToast.xaml.
  • Toont een groot getal en de tekst "Esc om te annuleren". Er loopt een DispatcherTimer van 1 s. Het venster schuift mee met de muis (positie bijwerken op dezelfde tick of op een snellere tick van circa 50 ms).
  • Events Elapsed en Cancelled. Een muisklik op het venster telt als annuleren.

Release 1.1.5

De versienummers in build.ps1, installer/Kniip.iss, src/Kniip/Kniip.csproj en README.md staan al op 1.1.5. Tag 1.1.5 bestaat nog niet. Deze functie gaat dus mee in dezelfde release als de ShareX-indeling, het vergrootglas en de geschiedenis.

  • CHANGELOG.md: in de bestaande sectie ## 1.1.5 - 2026-11-09 onder Nieuw een item toevoegen in dezelfde stijl, bijvoorbeeld: Schermafdruk vertraging. In het systeemvakmenu staat Schermafdruk vertraging: 0s. Stel daar met de schuifbalk of het getalveld 0 tot 60 seconden in. Daarna wachten Rechthoek knippen en Venster knippen (ook via de sneltoets) zo lang voordat het scherm bevriest. Bij de muis telt een venstertje af, en met Esc annuleer je. 0 betekent geen vertraging; screencasts wachten niet.
  • .\build.ps1 draaien en controleren dat de build en de installer slagen.
  • Commit "1.1.5" met alle openstaande 1.1.5-wijzigingen, waaronder de nieuwe History- en Magnifier-bestanden. Daarna tag 1.1.5 en pushen, net als bij 1.1.4. De release op git.hibbit.net maak je zelf aan; ik lever de changelogtekst aan.