This commit is contained in:
rogier committed 2026-11-09 17:57:31 +01:00
1 parent 6d19b91963
commit 89b84d8479
7 files changed
+52 -17

No files matched your search

@@ -19,7 +19,7 @@ todos:
status: completed status: completed
- id: release - id: release
content: CHANGELOG 1.1.5-item, build.ps1 draaien, commit/tag 1.1.5 en pushen content: CHANGELOG 1.1.5-item, build.ps1 draaien, commit/tag 1.1.5 en pushen
status: in_progress status: completed
isProject: false isProject: false
--- ---
+2 -2
View File
@@ -6,9 +6,9 @@ Alle noemenswaardige wijzigingen in kniip staan in dit bestand. De nieuwste vers
### Nieuw ### 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. - 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. - **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. - 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. - **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.
+28 -2
View File
@@ -12,14 +12,19 @@ public partial class MagnifierControl : UserControl
private const int Pixels = 15; private const int Pixels = 15;
private const double CursorOffset = 20; private const double CursorOffset = 20;
private static MagnifierControl? _visible;
private readonly WriteableBitmap _zoom = new(Pixels, Pixels, 96, 96, PixelFormats.Bgra32, null); private readonly WriteableBitmap _zoom = new(Pixels, Pixels, 96, 96, PixelFormats.Bgra32, null);
private readonly byte[] _buffer = new byte[Pixels * Pixels * 4]; private readonly byte[] _buffer = new byte[Pixels * Pixels * 4];
private readonly TranslateTransform _offset = new();
public MagnifierControl() public MagnifierControl()
{ {
InitializeComponent(); InitializeComponent();
Zoom.Source = _zoom; Zoom.Source = _zoom;
RenderTransform = _offset;
Visibility = Visibility.Collapsed; Visibility = Visibility.Collapsed;
Unloaded += (_, _) => Hide();
} }
/// <param name="frozen">Vastgelegd beeld van het scherm.</param> /// <param name="frozen">Vastgelegd beeld van het scherm.</param>
@@ -29,6 +34,19 @@ public partial class MagnifierControl : UserControl
/// <param name="area">Grootte van het venster (DIP).</param> /// <param name="area">Grootte van het venster (DIP).</param>
public void Show(BitmapSource frozen, System.Drawing.Point relative, System.Drawing.Point screen, Point cursor, Size area) 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); CopyPixels(frozen, relative);
CoordinateText.Text = $"X: {screen.X} Y: {screen.Y}"; CoordinateText.Text = $"X: {screen.X} Y: {screen.Y}";
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
@@ -47,10 +65,18 @@ public partial class MagnifierControl : UserControl
top = cursor.Y - CursorOffset - size.Height; 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) private void CopyPixels(BitmapSource frozen, System.Drawing.Point center)
{ {
+4
View File
@@ -355,6 +355,10 @@
<TextBlock x:Name="CopyLabel" Text="Kopiëren" Margin="6,0,0,0" /> <TextBlock x:Name="CopyLabel" Text="Kopiëren" Margin="6,0,0,0" />
</StackPanel> </StackPanel>
</Button> </Button>
<!-- Alleen in de gesplitste indeling: gereedschappen in het midden, Instellingen rechts -->
<local:ToolbarSpacer local:ToolbarPanel.ItemId="SplitSpacer1" />
<local:ToolbarSpacer local:ToolbarPanel.ItemId="SplitSpacer2" />
</local:ToolbarPanel> </local:ToolbarPanel>
</Border> </Border>
+14 -9
View File
@@ -38,17 +38,20 @@ public partial class EditorWindow : Window
/// <summary>Standaardvolgorde in de gesplitste indeling: eerst de bovenste werkbalk, dan de onderste.</summary> /// <summary>Standaardvolgorde in de gesplitste indeling: eerst de bovenste werkbalk, dan de onderste.</summary>
private static readonly string[] DefaultSplitOrder = private static readonly string[] DefaultSplitOrder =
{ {
"Select", "Sep1", "Rectangle", "Ellipse", "Line", "Arrow", "Text", "Step", "Cursor", "Emoji", "Highlight", "Blur", "SplitSpacer1", "Select", "Sep1", "Rectangle", "Ellipse", "Line", "Arrow", "Text", "Step", "Cursor", "Emoji", "Highlight", "Blur",
"Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", "Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", "SplitSpacer2", "Settings",
"New", "Screencast", "Spacer", "ZoomOut", "Zoom", "ZoomIn", "Spacer2", "Settings", "Sep5", "Save", "Upload", "Copy" "New", "Screencast", "Spacer", "Save", "Upload", "Copy", "Sep5", "Spacer2", "ZoomOut", "Zoom", "ZoomIn"
}; };
/// <summary>Items die in de gesplitste indeling op de onderste werkbalk staan.</summary> /// <summary>Items die in de gesplitste indeling op de onderste werkbalk staan.</summary>
private static readonly HashSet<string> SplitBottomIds = new() private static readonly HashSet<string> 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"
}; };
/// <summary>Items die alleen in de gesplitste indeling op een werkbalk staan.</summary>
private static readonly HashSet<string> SplitOnlyIds = new() { "SplitSpacer1", "SplitSpacer2" };
private readonly EditorDocument _doc; private readonly EditorDocument _doc;
private readonly UndoStack _undo = new(); private readonly UndoStack _undo = new();
private readonly AppSettings _settings; private readonly AppSettings _settings;
@@ -160,7 +163,10 @@ public partial class EditorWindow : Window
foreach (UIElement item in ToolbarItems.Items) foreach (UIElement item in ToolbarItems.Items)
{ {
_toolbarItems[ItemId(item)] = item; _toolbarItems[ItemId(item)] = item;
_defaultToolbarOrder.Add(ItemId(item)); if (!SplitOnlyIds.Contains(ItemId(item)))
{
_defaultToolbarOrder.Add(ItemId(item));
}
} }
_defaultSplitOrder.AddRange(DefaultSplitOrder.Where(_toolbarItems.ContainsKey)); _defaultSplitOrder.AddRange(DefaultSplitOrder.Where(_toolbarItems.ContainsKey));
@@ -192,12 +198,11 @@ public partial class EditorWindow : Window
ToolbarItems.Children.Clear(); ToolbarItems.Children.Clear();
ActionItems.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]); (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; ActionBar.Visibility = split && !_toolbarsHidden ? Visibility.Visible : Visibility.Collapsed;
ApplyToolbarPosition(); ApplyToolbarPosition();
} }
@@ -348,8 +353,8 @@ public partial class EditorWindow : Window
var layout = new MenuItem { Header = "Indeling" }; var layout = new MenuItem { Header = "Indeling" };
foreach ((EditorLayout value, string label) in new[] foreach ((EditorLayout value, string label) in new[]
{ {
(EditorLayout.Single, "Eén werkbalk"), (EditorLayout.Split, "Split-weergave: gereedschappen boven, opslaan onder"),
(EditorLayout.Split, "Gesplitst: gereedschappen boven, opslaan onder (zoals ShareX)") (EditorLayout.Single, "Eén werkbalk")
}) })
{ {
var item = new MenuItem { Header = label, IsCheckable = true, IsChecked = _settings.EditorLayout == value }; var item = new MenuItem { Header = label, IsCheckable = true, IsChecked = _settings.EditorLayout == value };
+2 -2
View File
@@ -38,7 +38,7 @@ public enum EditorLayout
/// <summary>Eén werkbalk met gereedschappen en acties.</summary> /// <summary>Eén werkbalk met gereedschappen en acties.</summary>
Single, Single,
/// <summary>Gereedschappen boven, opslaan/kopiëren en zoom onder (zoals ShareX).</summary> /// <summary>Split-weergave: gereedschappen boven, opslaan/kopiëren en zoom onder.</summary>
Split Split
} }
@@ -105,7 +105,7 @@ public sealed class AppSettings
public List<string> ToolbarOrder { get; set; } = new(); public List<string> ToolbarOrder { get; set; } = new();
/// <summary>Indeling van de werkbalk(en) in de editor.</summary> /// <summary>Indeling van de werkbalk(en) in de editor.</summary>
public EditorLayout EditorLayout { get; set; } = EditorLayout.Single; public EditorLayout EditorLayout { get; set; } = EditorLayout.Split;
/// <summary>Volgorde van de werkbalkitems in de gesplitste indeling (boven, dan onder); leeg betekent de standaardvolgorde.</summary> /// <summary>Volgorde van de werkbalkitems in de gesplitste indeling (boven, dan onder); leeg betekent de standaardvolgorde.</summary>
public List<string> SplitToolbarOrder { get; set; } = new(); public List<string> SplitToolbarOrder { get; set; } = new();
+1 -1
View File
@@ -256,8 +256,8 @@
<TextBlock Text="Editor" Style="{StaticResource CardTitle}" /> <TextBlock Text="Editor" Style="{StaticResource CardTitle}" />
<CheckBox x:Name="StraightHighlightBox" Content="Markeerstift trekt standaard een rechte horizontale streep (Shift wisselt)" /> <CheckBox x:Name="StraightHighlightBox" Content="Markeerstift trekt standaard een rechte horizontale streep (Shift wisselt)" />
<TextBlock Text="Werkbalk" Style="{StaticResource CardTitle}" Margin="0,16,0,6" /> <TextBlock Text="Werkbalk" Style="{StaticResource CardTitle}" Margin="0,16,0,6" />
<RadioButton x:Name="LayoutSplitRadio" GroupName="EditorLayout" Content="Split-weergave: gereedschappen boven, opslaan onder" />
<RadioButton x:Name="LayoutSingleRadio" GroupName="EditorLayout" Content="Eén werkbalk met gereedschappen en acties" /> <RadioButton x:Name="LayoutSingleRadio" GroupName="EditorLayout" Content="Eén werkbalk met gereedschappen en acties" />
<RadioButton x:Name="LayoutSplitRadio" GroupName="EditorLayout" Content="Gesplitst zoals ShareX: gereedschappen boven, opslaan onder" />
<TextBlock Style="{StaticResource Hint}" <TextBlock Style="{StaticResource Hint}"
Text="Ook te wisselen via rechtsklik op de werkbalk in de editor. Daar kun je knoppen ook verslepen of verbergen." /> Text="Ook te wisselen via rechtsklik op de werkbalk in de editor. Daar kun je knoppen ook verslepen of verbergen." />
</StackPanel> </StackPanel>