From b780c6a116eb95686257b54d7a37799776b0a5b5 Mon Sep 17 00:00:00 2001 From: R0GGER Date: Mon, 9 Nov 2026 17:00:58 +0100 Subject: [PATCH] 1.1.4 Update-melding, rechtermuisknopmenu in de editor. Co-authored-by: Cursor --- CHANGELOG.md | 10 + README.md | 2 + src/Kniip/App.xaml.cs | 5 + src/Kniip/Editor/AnnotationClipboard.cs | 49 +++++ src/Kniip/Editor/EditorDocument.cs | 7 + src/Kniip/Editor/EditorWindow.xaml | 11 +- src/Kniip/Editor/EditorWindow.xaml.cs | 215 ++++++++++++++++++++-- src/Kniip/Editor/ImageExporter.cs | 8 + src/Kniip/Settings/AppSettings.cs | 3 + src/Kniip/Settings/SettingsWindow.xaml | 11 +- src/Kniip/Settings/SettingsWindow.xaml.cs | 11 ++ src/Kniip/Update/UpdateNotifier.cs | 97 ++++++++++ 12 files changed, 405 insertions(+), 24 deletions(-) create mode 100644 src/Kniip/Editor/AnnotationClipboard.cs create mode 100644 src/Kniip/Update/UpdateNotifier.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2db70ac..2c3c6ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ Alle noemenswaardige wijzigingen in kniip staan in dit bestand. De nieuwste vers ### Nieuw +- **Melding bij een nieuwe versie.** kniip kijkt bij het starten en daarna elke dag of er een nieuwere versie is. Is die er, dan staat er een blauwe stip op de knop **Instellingen** in de editor en op de tab **Update** in de instellingen. Wil je dat niet, zet dan in de tab **Update** het vinkje **Automatisch controleren op nieuwe versies** uit. +- **Uitgebreid rechtermuisknopmenu in de editor.** Klik met rechts op het canvas, ook op een leeg stuk, voor een menu met iconen en sneltoetsen. Wat op dat moment niet kan, staat grijs. + - **Ongedaan maken** en **Opnieuw**. + - **Verwijder**, **Verwijder alles** (Shift+Delete, de afbeelding blijft staan) en **Samenvoegen** (Ctrl+Shift+F). Samenvoegen maakt de annotaties deel van de afbeelding en kun je ongedaan maken. + - **Knip** (Ctrl+X), **Kopieer** (Ctrl+Shift+C), **Plak** (Ctrl+V) en **Dupliceren** (Ctrl+D). Plak via het menu zet de annotatie op de plek waar je rechts klikte. Kopiëren en plakken werkt ook tussen twee editorvensters. + - **Naar voorgrond** (Home), **Naar voren** (PageUp), **Naar achteren** (PageDown) en **Naar achtergrond** (End). + - **Werkbalken verbergen** (Ctrl+H). Via hetzelfde menu of Ctrl+H haal je ze terug. Bij een nieuwe start zijn ze er altijd weer. - **Lijnen en pijlen buigen.** Selecteer een lijn of pijl. Midden op elk stuk staat dan een klein rondje. Sleep dat rondje en het wordt een buigpunt. De lijn loopt daarna als vloeiende kromme door alle punten. Zo kun je zoveel buigpunten toevoegen als je wilt. - Dubbelklik op een buigpunt om het weer te verwijderen. - Bij een pijl draait de punt mee met de richting van het laatste stuk. @@ -14,6 +21,9 @@ Alle noemenswaardige wijzigingen in kniip staan in dit bestand. De nieuwste vers ### Gewijzigd +- kniip zoekt nu standaard zelf op de achtergrond naar updates. Tot nu toe gebeurde dat alleen als je de tab **Update** opende of op **Opnieuw controleren** klikte. Een mislukte controle, bijvoorbeeld zonder internet, geeft geen foutmelding. +- **Ctrl+V** plakt nu eerst een gekopieerde annotatie. Heb je daarna iets anders gekopieerd, dan opent Ctrl+V zoals voorheen de afbeelding van het klembord. +- Het rechtermuisknopmenu van de werkbalk heeft dezelfde nieuwe stijl gekregen. - **Testversie naast kniip.** `build.ps1` maakt nu ook `KniipTest-.exe`. Die testversie heeft eigen instellingen en registervermeldingen, zodat hij naast de geïnstalleerde kniip kan draaien zonder die te raken. De testversie werkt zichzelf niet bij. Met `-SkipTest` sla je hem over. ## 1.1.3 - 2026-11-09 diff --git a/README.md b/README.md index 6cb380d..ad9a012 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,8 @@ Draaien beide versies tegelijk, dan reageren ze allebei op dezelfde sneltoetsen Onder **Instellingen > Update** controleert kniip via de API van git.hibbit.net of er een nieuwere release is en toont de changelog van alle nieuwere versies. **Updaten** downloadt de installer, sluit kniip, installeert stil en start kniip opnieuw. De eerder gekozen integraties blijven behouden. +kniip controleert ook zelf bij het starten en daarna elke 24 uur. Is er een nieuwere versie, dan staat er een blauwe stip op de knop **Instellingen** in de editor en op de tab **Update**. Dit zet je uit met **Automatisch controleren op nieuwe versies** in die tab. + Voorwaarden: - De repository `rogier/kniip` is publiek; kniip gebruikt geen token. diff --git a/src/Kniip/App.xaml.cs b/src/Kniip/App.xaml.cs index cbf1cbc..82775de 100644 --- a/src/Kniip/App.xaml.cs +++ b/src/Kniip/App.xaml.cs @@ -38,6 +38,9 @@ public partial class App : Application /// Toetsenbordhaak voor alle sneltoetsen (knipsels en screencasts). internal GlobalHotkeyHook? HotkeyHook { get; private set; } + /// Achtergrondcontrole op nieuwe versies; stuurt de blauwe stip bij Instellingen. + public UpdateNotifier Updates { get; } = new(); + protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); @@ -105,6 +108,7 @@ public partial class App : Application HotkeyHook = new GlobalHotkeyHook(Dispatcher); ApplyHotkeys(); + Updates.Apply(Settings.CheckForUpdates); _singleInstance.StartServer(received => Dispatcher.BeginInvoke(() => HandleArguments(received, false))); HandleArguments(args, true); @@ -440,6 +444,7 @@ public partial class App : Application SettingsStore.Save(Settings); Capture.ApplySettings(Settings); ApplyHotkeys(); + Updates.Apply(Settings.CheckForUpdates); } private static void BringToFront(Window window) diff --git a/src/Kniip/Editor/AnnotationClipboard.cs b/src/Kniip/Editor/AnnotationClipboard.cs new file mode 100644 index 0000000..9664f1e --- /dev/null +++ b/src/Kniip/Editor/AnnotationClipboard.cs @@ -0,0 +1,49 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows; +using Kniip.Editor.Annotations; + +namespace Kniip.Editor; + +/// +/// Gekopieerde annotatie, gedeeld tussen editorvensters. Op het Windows-klembord staat alleen een markering, +/// zodat iets wat daarna in een ander programma wordt gekopieerd bij plakken voorgaat. +/// +internal static class AnnotationClipboard +{ + private const string MarkerFormat = "Kniip.Annotation"; + + private static Annotation? _item; + private static string? _token; + + public static bool Set(Annotation item) + { + string token = Guid.NewGuid().ToString("N"); + if (!ClipboardWriter.SetMarker(MarkerFormat, token)) + { + return false; + } + + _item = item.Clone(); + _token = token; + return true; + } + + /// Een kopie van de annotatie, of null als het klembord inmiddels iets anders bevat. + public static Annotation? Get() + { + if (_item == null) + { + return null; + } + + try + { + return Clipboard.GetData(MarkerFormat) as string == _token ? _item.Clone() : null; + } + catch (ExternalException) + { + return null; + } + } +} diff --git a/src/Kniip/Editor/EditorDocument.cs b/src/Kniip/Editor/EditorDocument.cs index a2aa417..4d2dc3d 100644 --- a/src/Kniip/Editor/EditorDocument.cs +++ b/src/Kniip/Editor/EditorDocument.cs @@ -59,6 +59,13 @@ public sealed class EditorDocument } } + /// Vervangt het knipsel door de platgemaakte versie; de annotaties zitten daarna in de pixels. + public void Flatten(BitmapSource rendered) + { + SetPixels(PixelUtil.ToOpaqueBgra(rendered), rendered.PixelWidth, rendered.PixelHeight); + Items = new List(); + } + public string GetStepLabel(StepAnnotation step) { int ordinal = 0; diff --git a/src/Kniip/Editor/EditorWindow.xaml b/src/Kniip/Editor/EditorWindow.xaml index 8a2fc6f..9a04cb2 100644 --- a/src/Kniip/Editor/EditorWindow.xaml +++ b/src/Kniip/Editor/EditorWindow.xaml @@ -315,9 +315,14 @@ -