From 89b84d8479aaceae0c20001c3e353320473e2d9e Mon Sep 17 00:00:00 2001 From: R0GGER Date: Mon, 9 Nov 2026 17:57:31 +0100 Subject: [PATCH] 1.1.5 --- .../schermafdruk_vertraging_0a5ac2a4.plan.md | 2 +- CHANGELOG.md | 4 +-- src/Kniip/Capture/MagnifierControl.xaml.cs | 30 +++++++++++++++++-- src/Kniip/Editor/EditorWindow.xaml | 4 +++ src/Kniip/Editor/EditorWindow.xaml.cs | 23 ++++++++------ src/Kniip/Settings/AppSettings.cs | 4 +-- src/Kniip/Settings/SettingsWindow.xaml | 2 +- 7 files changed, 52 insertions(+), 17 deletions(-) diff --git a/.cursor/plans/schermafdruk_vertraging_0a5ac2a4.plan.md b/.cursor/plans/schermafdruk_vertraging_0a5ac2a4.plan.md index 0a038f2..280bbd2 100644 --- a/.cursor/plans/schermafdruk_vertraging_0a5ac2a4.plan.md +++ b/.cursor/plans/schermafdruk_vertraging_0a5ac2a4.plan.md @@ -19,7 +19,7 @@ todos: status: completed - id: release content: CHANGELOG 1.1.5-item, build.ps1 draaien, commit/tag 1.1.5 en pushen - status: in_progress + status: completed isProject: false --- diff --git a/CHANGELOG.md b/CHANGELOG.md index ce3e9a9..6d53b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,9 @@ Alle noemenswaardige wijzigingen in kniip staan in dit bestand. De nieuwste vers ### Nieuw -- **Werkbalkindeling zoals ShareX.** De editor kan nu ook twee werkbalken tonen: bovenaan de gereedschappen met daaronder de eigenschappen (kleur, dikte, lijnstijl), en onderaan een balk met **Nieuw** en **Screencast** links, de zoomknoppen in het midden en **Instellingen**, **Opslaan**, **Uploaden** en **Kopiëren** rechts. Kies de indeling in de instellingen onder **Editor** > **Werkbalk**, of klik met rechts op een werkbalk en kies **Indeling**. +- **Split-weergave.** De editor kan nu ook twee werkbalken tonen. Bovenaan staan de gereedschappen in het midden, met **Instellingen** rechts en daaronder de eigenschappen (kleur, dikte, lijnstijl). Onderaan staan **Nieuw** en **Screencast** links, **Opslaan**, **Uploaden** en **Kopiëren** in het midden en de zoomknoppen rechts. Kies de indeling in de instellingen onder **Editor** > **Werkbalk**, of klik met rechts op een werkbalk en kies **Indeling**. - In beide werkbalken kun je knoppen verslepen (na ontgrendelen) en verbergen, net als bij één werkbalk. Beide indelingen onthouden hun eigen volgorde. - - De standaardindeling blijft één werkbalk. + - Split-weergave is de nieuwe standaard. Wil je de vertrouwde indeling terug, kies dan **Eén werkbalk**. - **Vergrootglas bij het kiezen van een gebied.** Bij het knippen van een rechthoek en bij het kiezen van een opnamegebied voor een screencast loopt naast de muisaanwijzer een rond vergrootglas mee. Je ziet de pixels rond de aanwijzer vergroot met een raster en een blauwe kruisdraad, en daaronder de schermcoördinaten (X en Y). Zo zet je een hoek precies op de goede pixel. Bij **Venster knippen** verschijnt het vergrootglas niet. - Het vergrootglas staat standaard aan. Wil je het niet, zet dan in de instellingen onder **Sneltoetsen** > **Gebied kiezen** het vinkje **Vergrootglas tonen bij het kiezen van een gebied** uit. - **Schermafdruk vertraging.** In het systeemvakmenu staat **Schermafdruk vertraging: 0s**. Stel daar met de schuifbalk of het getalveld 0 tot 60 seconden in. **Rechthoek knippen** en **Venster knippen** wachten dan zo lang voordat het scherm bevriest, ook via de sneltoets. Zo kun je eerst een menu openklappen of een tooltip laten verschijnen. diff --git a/src/Kniip/Capture/MagnifierControl.xaml.cs b/src/Kniip/Capture/MagnifierControl.xaml.cs index d3ce183..e4bcc0e 100644 --- a/src/Kniip/Capture/MagnifierControl.xaml.cs +++ b/src/Kniip/Capture/MagnifierControl.xaml.cs @@ -12,14 +12,19 @@ public partial class MagnifierControl : UserControl private const int Pixels = 15; private const double CursorOffset = 20; + private static MagnifierControl? _visible; + private readonly WriteableBitmap _zoom = new(Pixels, Pixels, 96, 96, PixelFormats.Bgra32, null); private readonly byte[] _buffer = new byte[Pixels * Pixels * 4]; + private readonly TranslateTransform _offset = new(); public MagnifierControl() { InitializeComponent(); Zoom.Source = _zoom; + RenderTransform = _offset; Visibility = Visibility.Collapsed; + Unloaded += (_, _) => Hide(); } /// Vastgelegd beeld van het scherm. @@ -29,6 +34,19 @@ public partial class MagnifierControl : UserControl /// Grootte van het venster (DIP). public void Show(BitmapSource frozen, System.Drawing.Point relative, System.Drawing.Point screen, Point cursor, Size area) { + // Elk scherm heeft een eigen overlay; een overlay krijgt soms muisbewegingen terwijl de aanwijzer op een ander scherm staat. + if (relative.X < 0 || relative.Y < 0 || relative.X >= frozen.PixelWidth || relative.Y >= frozen.PixelHeight) + { + Hide(); + return; + } + + if (_visible != this) + { + _visible?.Hide(); + _visible = this; + } + CopyPixels(frozen, relative); CoordinateText.Text = $"X: {screen.X} Y: {screen.Y}"; Visibility = Visibility.Visible; @@ -47,10 +65,18 @@ public partial class MagnifierControl : UserControl top = cursor.Y - CursorOffset - size.Height; } - Margin = new Thickness(Math.Max(0, left), Math.Max(0, top), 0, 0); + _offset.X = Math.Max(0, left); + _offset.Y = Math.Max(0, top); } - public void Hide() => Visibility = Visibility.Collapsed; + public void Hide() + { + Visibility = Visibility.Collapsed; + if (_visible == this) + { + _visible = null; + } + } private void CopyPixels(BitmapSource frozen, System.Drawing.Point center) { diff --git a/src/Kniip/Editor/EditorWindow.xaml b/src/Kniip/Editor/EditorWindow.xaml index 6c24577..3368f97 100644 --- a/src/Kniip/Editor/EditorWindow.xaml +++ b/src/Kniip/Editor/EditorWindow.xaml @@ -355,6 +355,10 @@ + + + + diff --git a/src/Kniip/Editor/EditorWindow.xaml.cs b/src/Kniip/Editor/EditorWindow.xaml.cs index bf041c3..68c148e 100644 --- a/src/Kniip/Editor/EditorWindow.xaml.cs +++ b/src/Kniip/Editor/EditorWindow.xaml.cs @@ -38,17 +38,20 @@ public partial class EditorWindow : Window /// Standaardvolgorde in de gesplitste indeling: eerst de bovenste werkbalk, dan de onderste. private static readonly string[] DefaultSplitOrder = { - "Select", "Sep1", "Rectangle", "Ellipse", "Line", "Arrow", "Text", "Step", "Cursor", "Emoji", "Highlight", "Blur", - "Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", - "New", "Screencast", "Spacer", "ZoomOut", "Zoom", "ZoomIn", "Spacer2", "Settings", "Sep5", "Save", "Upload", "Copy" + "SplitSpacer1", "Select", "Sep1", "Rectangle", "Ellipse", "Line", "Arrow", "Text", "Step", "Cursor", "Emoji", "Highlight", "Blur", + "Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", "SplitSpacer2", "Settings", + "New", "Screencast", "Spacer", "Save", "Upload", "Copy", "Sep5", "Spacer2", "ZoomOut", "Zoom", "ZoomIn" }; /// Items die in de gesplitste indeling op de onderste werkbalk staan. private static readonly HashSet SplitBottomIds = new() { - "New", "Screencast", "Spacer", "ZoomOut", "Zoom", "ZoomIn", "Spacer2", "Settings", "Sep5", "Save", "Upload", "Copy" + "New", "Screencast", "Spacer", "Save", "Upload", "Copy", "Sep5", "Spacer2", "ZoomOut", "Zoom", "ZoomIn" }; + /// Items die alleen in de gesplitste indeling op een werkbalk staan. + private static readonly HashSet SplitOnlyIds = new() { "SplitSpacer1", "SplitSpacer2" }; + private readonly EditorDocument _doc; private readonly UndoStack _undo = new(); private readonly AppSettings _settings; @@ -160,7 +163,10 @@ public partial class EditorWindow : Window foreach (UIElement item in ToolbarItems.Items) { _toolbarItems[ItemId(item)] = item; - _defaultToolbarOrder.Add(ItemId(item)); + if (!SplitOnlyIds.Contains(ItemId(item))) + { + _defaultToolbarOrder.Add(ItemId(item)); + } } _defaultSplitOrder.AddRange(DefaultSplitOrder.Where(_toolbarItems.ContainsKey)); @@ -192,12 +198,11 @@ public partial class EditorWindow : Window ToolbarItems.Children.Clear(); ActionItems.Children.Clear(); - foreach (string id in order) + foreach (string id in order.Where(id => split || !SplitOnlyIds.Contains(id))) { (split && SplitBottomIds.Contains(id) ? ActionItems : ToolbarItems).Children.Add(_toolbarItems[id]); } - ToolbarItems.HorizontalAlignment = split ? HorizontalAlignment.Center : HorizontalAlignment.Stretch; ActionBar.Visibility = split && !_toolbarsHidden ? Visibility.Visible : Visibility.Collapsed; ApplyToolbarPosition(); } @@ -348,8 +353,8 @@ public partial class EditorWindow : Window var layout = new MenuItem { Header = "Indeling" }; foreach ((EditorLayout value, string label) in new[] { - (EditorLayout.Single, "Eén werkbalk"), - (EditorLayout.Split, "Gesplitst: gereedschappen boven, opslaan onder (zoals ShareX)") + (EditorLayout.Split, "Split-weergave: gereedschappen boven, opslaan onder"), + (EditorLayout.Single, "Eén werkbalk") }) { var item = new MenuItem { Header = label, IsCheckable = true, IsChecked = _settings.EditorLayout == value }; diff --git a/src/Kniip/Settings/AppSettings.cs b/src/Kniip/Settings/AppSettings.cs index 5c4bcba..09196f4 100644 --- a/src/Kniip/Settings/AppSettings.cs +++ b/src/Kniip/Settings/AppSettings.cs @@ -38,7 +38,7 @@ public enum EditorLayout /// Eén werkbalk met gereedschappen en acties. Single, - /// Gereedschappen boven, opslaan/kopiëren en zoom onder (zoals ShareX). + /// Split-weergave: gereedschappen boven, opslaan/kopiëren en zoom onder. Split } @@ -105,7 +105,7 @@ public sealed class AppSettings public List ToolbarOrder { get; set; } = new(); /// Indeling van de werkbalk(en) in de editor. - public EditorLayout EditorLayout { get; set; } = EditorLayout.Single; + public EditorLayout EditorLayout { get; set; } = EditorLayout.Split; /// Volgorde van de werkbalkitems in de gesplitste indeling (boven, dan onder); leeg betekent de standaardvolgorde. public List SplitToolbarOrder { get; set; } = new(); diff --git a/src/Kniip/Settings/SettingsWindow.xaml b/src/Kniip/Settings/SettingsWindow.xaml index 28390e1..91af73d 100644 --- a/src/Kniip/Settings/SettingsWindow.xaml +++ b/src/Kniip/Settings/SettingsWindow.xaml @@ -256,8 +256,8 @@ + -