1 Commits
Author SHA1 Message Date
rogier 534262a4c7 2.1.0 2026-11-11 17:01:01 +01:00
11 changed files with 263 additions and 38 deletions

No files matched your search

@@ -0,0 +1,78 @@
---
name: Printknop in editor
overview: Een icoonknop Printen links van het tandwiel in de editorwerkbalk (plus Ctrl+P) die het knipsel met annotaties via het standaard Windows-printvenster afdrukt, passend op de pagina.
todos:
- id: xaml-button
content: Icoonknop Printen (ItemId Print, FlatButton) links van het tandwiel in EditorWindow.xaml
status: completed
- id: toolbar-lists
content: Print invoegen voor Settings in DefaultSplitOrder
status: completed
- id: print-method
content: Print() + Print_Click + Ctrl+P in EditorWindow.xaml.cs (PrintDialog, passend op pagina)
status: completed
- id: docs
content: CHANGELOG-sectie 2.1.0 en README (Delen, build-voorbeeld) bijwerken
status: completed
- id: version
content: Versie naar 2.1.0 in Kniip.csproj, installer/Kniip.iss en build.ps1
status: completed
isProject: false
---
# Printknop in de editor
## Aanpak
Het knipsel wordt al plat gemaakt voor Opslaan en Kopiëren via `DocumentRenderer.Export(_doc)`. Printen gebruikt dezelfde afbeelding en stuurt die naar de WPF-`PrintDialog` (`System.Windows.Controls`, geen extra package nodig).
## Wijzigingen
**[src/Kniip/Editor/EditorWindow.xaml](src/Kniip/Editor/EditorWindow.xaml)**
- Nieuwe icoonknop direct links van het tandwiel: tussen `Sep5` en `SettingsButton` (regel ~495), in dezelfde stijl als Instellingen:
```xml
<Button local:ToolbarPanel.ItemId="Print" local:ToolbarPanel.Title="Printen"
Style="{StaticResource FlatButton}" ToolTip="Printen (Ctrl+P)" Click="Print_Click">
<TextBlock Text="&#xE749;" Style="{StaticResource IconText}" />
</Button>
```
**[src/Kniip/Editor/EditorWindow.xaml.cs](src/Kniip/Editor/EditorWindow.xaml.cs)**
- In `DefaultSplitOrder` (regel 50-55) `"Print"` invoegen tussen `"SplitSpacer2"` en `"Settings"`, zodat de knop in de gesplitste indeling rechtsboven links van het tandwiel staat. Niet toevoegen aan `SplitBottomIds`.
- Geen label, dus niets toevoegen aan `UpdateActionLabels`.
- `Print_Click` naast `Save_Click`, en `case Key.P: Print();` in de Ctrl-sneltoetsen (regel ~2916). Ctrl+P is nog vrij.
- Nieuwe methode `Print()`:
- `CommitTextEdit()`, daarna `DocumentRenderer.Export(_doc)`
- `new PrintDialog()`; als de gebruiker annuleert, gebeurt er niets
- Afbeelding in een `DrawingVisual` tekenen, gecentreerd in het afdrukbare gebied (`PrintableAreaWidth/Height`), met behouden verhouding en alleen verkleind als het knipsel niet past (kleine knipsels worden niet uitvergroot)
- `dialog.PrintVisual(visual, "kniip - knipsel")`, daarna `ShowTemporaryHint("Naar de printer gestuurd.")`
- Fouten tonen via `MessageBox` op dezelfde manier als `WriteTo` ("Printen is mislukt: ...")
Bestaande gebruikers krijgen de knop automatisch te zien: `MergeToolbarOrder` voegt nieuwe ID's in na hun standaardvoorganger (`Sep5` bij één werkbalk, `SplitSpacer2` in de gesplitste indeling), dus direct links van het tandwiel. De knop is te verslepen en te verbergen via het bestaande werkbalkmenu.
**[CHANGELOG.md](CHANGELOG.md)**
- Nieuwe sectie bovenaan, in de stijl van 2.0.0:
```markdown
## 2.1.0 - 2026-11-11
### Nieuw
- **Printen.**\
Druk een knipsel met je aantekeningen af. De knop met het printericoon staat links van het tandwiel, of druk op Ctrl+P. Je kiest de printer en de afdrukstand in het printvenster van Windows. Het knipsel komt in het midden van de pagina; is het te groot, dan wordt het verkleind.
```
**Versienummer naar 2.1.0**
- [src/Kniip/Kniip.csproj](src/Kniip/Kniip.csproj) regel 21: `<Version>2.1.0</Version>`
- [installer/Kniip.iss](installer/Kniip.iss) regel 8: `#define AppVersion "2.1.0"`
- [build.ps1](build.ps1) regel 15: `[string]$Version = "2.1.0",`
**[README.md](README.md)**
- Bij "Delen" (regel 28) printen toevoegen: "Opslaan, kopiëren naar het klembord, printen of uploaden ...".
- Regel 83: `.\build.ps1 # versie 2.1.0`.
- De downloadtabel (regel 37) blijft op 2.0.0 tot de release van 2.1.0 echt op git.hibbit.net staat (stap 4 van "Een nieuwe versie publiceren").
## Niet in scope
- Geen eigen afdrukvoorbeeld of pagina-instellingen; afdrukstand en printer kies je in het Windows-printvenster.
- Geen printknop in het screencastvenster.
+13
View File
@@ -2,6 +2,19 @@
Alle noemenswaardige wijzigingen in kniip staan in dit bestand. De nieuwste versie staat bovenaan.
## 2.1.0 - 2026-11-11
### Nieuw
- **Printen.**\
Druk een knipsel met je aantekeningen af. De knop met het printericoon staat links van het tandwiel, of druk op Ctrl+P. Je kiest de printer en de afdrukstand in het printvenster van Windows. Het knipsel komt in het midden van de pagina; is het te groot, dan wordt het verkleind.
- **Mappen openen.**\
Links van de printknop staat een knop met een mapicoon. Klik erop en kies **Open Screenshot map** of **Open Screencast map**. Je krijgt dezelfde mappen als in het systeemvakmenu: de opslagmap uit de instellingen, anders de map waarin je het laatst hebt opgeslagen.
- Staan de linialen aan, dan zit er ook een mapknop in het hoekje waar de linialen samenkomen. Die opent hetzelfde menu, met **Screenshotmap openen** en **Screencastmap openen**. Rechtsklik op het hoekje toont nog steeds het menu om hulplijnen te wissen of de linialen te verbergen.
- Is er nog geen screencastmap, dan maakt kniip die aan (`Video's\kniip`). Daardoor kun je **Screencasts** in het systeemvakmenu nu ook kiezen voordat je je eerste screencast hebt opgeslagen.
- **Meer opslagopties onder de Opslaan-knop.**\
Rechts in de Opslaan-knop staat een klein pijltje. Klik erop voor een menu met de andere manier van opslaan en **Opslaan als...**. Staat de standaardknop in de instellingen op **Opslaan en kopiëren**, dan kies je hier **Opslaan** zonder te kopiëren; staat hij op **Opslaan**, dan kies je hier **Opslaan en kopiëren**. **Opslaan als...** vraagt altijd waar het bestand moet komen. Het menu staat ook in het screencastvenster, met het gekozen formaat erbij, zoals **Opslaan als MP4**.
## 2.0.0 - 2026-11-10
### Nieuw
+2 -2
View File
@@ -25,7 +25,7 @@ kniip is een annotatie-editor die naast het Windows Knipprogramma werkt. Maak ee
- **Knippen tot op de pixel.** Rechthoek of venster, met een vergrootglas voor precieze hoeken en een instelbare vertraging om eerst een menu of tooltip te openen.
- **Aantekenen.** Pijlen en lijnen die je kunt buigen, tekst, vormen, genummerde stappen, markeerstift, emoji en vervaging.
- **Screencasts.** Neem een deel van je scherm op en exporteer als video of GIF.
- **Delen.** Opslaan, kopiëren naar het klembord of uploaden en de link meteen delen.
- **Delen.** Opslaan, kopiëren naar het klembord, printen of uploaden en de link meteen delen.
- **Geschiedenis.** Vind eerdere knipsels en uploads terug, met miniaturen en zoeken.
- **Jouw werkbalk.** Kies een of twee werkbalken, versleep knoppen en verberg wat je niet gebruikt.
- **Altijd bij.** kniip meldt zelf wanneer er een nieuwe versie is en werkt zichzelf bij met een klik.
@@ -80,7 +80,7 @@ Vereisten:
Bouwen:
```powershell
.\build.ps1 # versie 2.0.0
.\build.ps1 # versie 2.1.0
.\build.ps1 -Version 1.2.0 # andere versie
```
+1 -1
View File
@@ -12,7 +12,7 @@
# .\build.ps1 -SkipTest -> zonder testexe
param(
[string]$Version = "2.0.0",
[string]$Version = "2.1.0",
[string]$Runtime = "win-x64",
[switch]$SkipTest
)
+1 -1
View File
@@ -5,7 +5,7 @@
#define AppName "kniip"
#define AppExe "Kniip.exe"
#ifndef AppVersion
#define AppVersion "2.0.0"
#define AppVersion "2.1.0"
#endif
#ifndef PublishDir
#define PublishDir "..\artifacts\publish"
+18 -13
View File
@@ -562,20 +562,25 @@ public partial class App : Application
BringToFront(_historyWindow);
}
private IReadOnlyList<(string Label, string? Path)> TrayFolders()
{
static string? Existing(params string?[] folders) =>
folders.FirstOrDefault(folder => folder is { Length: > 0 } && Directory.Exists(folder));
/// <summary>Map met knipsels: de opslagmap, anders de laatst gebruikte map, anders Afbeeldingen.</summary>
public string SnipFolder =>
ExistingFolder(Settings.SnipSaveFolder, Settings.LastSaveFolder)
?? Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
return new (string, string?)[]
{
("Schermafbeeldingen", Existing(CaptureCoordinator.ScreenshotsFolder)),
("Knipsels", Existing(Settings.SnipSaveFolder, Settings.LastSaveFolder,
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))),
("Screencasts", Existing(Settings.VideoSaveFolder, Settings.LastVideoFolder,
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "kniip")))
};
}
/// <summary>Map met screencasts: de opslagmap, anders de laatst gebruikte map, anders Video's\kniip (bestaat mogelijk nog niet).</summary>
public string VideoFolder =>
ExistingFolder(Settings.VideoSaveFolder, Settings.LastVideoFolder)
?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "kniip");
private static string? ExistingFolder(params string?[] folders) =>
folders.FirstOrDefault(folder => folder is { Length: > 0 } && Directory.Exists(folder));
private IReadOnlyList<(string Label, string? Path)> TrayFolders() => new (string, string?)[]
{
("Schermafbeeldingen", ExistingFolder(CaptureCoordinator.ScreenshotsFolder)),
("Knipsels", SnipFolder),
("Screencasts", VideoFolder)
};
public void ShowBalloon(string title, string text) => _tray?.ShowBalloon(title, text);
+19 -3
View File
@@ -493,6 +493,14 @@
<TextBlock Text="&#xE8A3;" Style="{StaticResource IconText}" />
</Button>
<local:ToolbarSeparator local:ToolbarPanel.ItemId="Sep5" />
<Button x:Name="FoldersButton" local:ToolbarPanel.ItemId="Folders" local:ToolbarPanel.Title="Mappen openen"
Style="{StaticResource FlatButton}" ToolTip="Screenshot- of screencastmap openen" Click="Folders_Click">
<TextBlock Text="&#xE8B7;" Style="{StaticResource IconText}" />
</Button>
<Button local:ToolbarPanel.ItemId="Print" local:ToolbarPanel.Title="Printen"
Style="{StaticResource FlatButton}" ToolTip="Printen (Ctrl+P)" Click="Print_Click">
<TextBlock Text="&#xE749;" Style="{StaticResource IconText}" />
</Button>
<Button x:Name="SettingsButton" local:ToolbarPanel.ItemId="Settings" local:ToolbarPanel.Title="Instellingen"
Style="{StaticResource FlatButton}" ToolTip="Instellingen" Click="Settings_Click">
<Grid>
@@ -503,10 +511,13 @@
</Grid>
</Button>
<Button x:Name="SaveButton" local:ToolbarPanel.ItemId="Save" local:ToolbarPanel.Title="Opslaan"
Style="{StaticResource SecondaryButton}" ToolTip="Opslaan (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als" Click="Save_Click">
Style="{StaticResource SecondaryButton}" ToolTip="Opslaan (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als; het pijltje toont meer opties" Click="Save_Click">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74E;" Style="{StaticResource IconText}" FontSize="14" />
<TextBlock x:Name="SaveLabel" Text="Opslaan" Margin="6,0,0,0" />
<TextBlock x:Name="SaveMenuChevron" Text="&#xE70D;" Style="{StaticResource IconText}" FontSize="9"
Background="Transparent" Padding="4,2,0,2" Margin="2,0,0,0"
ToolTip="Meer opslagopties" PreviewMouseLeftButtonDown="SaveMenu_MouseDown" />
</StackPanel>
</Button>
<Button x:Name="UploadButton" local:ToolbarPanel.ItemId="Upload" local:ToolbarPanel.Title="Uploaden"
@@ -748,8 +759,13 @@
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Border x:Name="RulerCorner" Width="20" Height="20" Background="{DynamicResource ToolbarBrush}"
BorderBrush="{DynamicResource DividerBrush}" BorderThickness="0,0,1,1" ToolTip="Rechtsklik om de hulplijnen te wissen"
MouseRightButtonUp="RulerCorner_MouseRightButtonUp" />
BorderBrush="{DynamicResource DividerBrush}" BorderThickness="0,0,1,1"
MouseRightButtonUp="RulerCorner_MouseRightButtonUp">
<Button x:Name="RulerFolderButton" Style="{StaticResource FlatButton}" MinWidth="0" MinHeight="0" Margin="0"
Padding="0" BorderThickness="0" ToolTip="Map openen (rechtsklik: hulplijnen wissen)" Click="RulerFolder_Click">
<TextBlock Text="&#xE8B7;" Style="{StaticResource IconText}" FontSize="12" />
</Button>
</Border>
<local:RulerControl x:Name="HRuler" Grid.Column="1" Height="20" Orientation="Horizontal"
Background="{DynamicResource ToolbarBrush}" ImageBackground="{DynamicResource CardBrush}"
Foreground="{DynamicResource SubtleTextBrush}" BorderBrush="{DynamicResource DividerBrush}"
+93 -11
View File
@@ -50,7 +50,7 @@ public partial class EditorWindow : Window
private static readonly string[] DefaultSplitOrder =
{
"SplitSpacer1", "Select", "Sep1", "Rectangle", "Ellipse", "Shape", "Line", "Arrow", "Text", "Step", "Cursor", "Emoji", "Highlight", "Blur",
"Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", "SplitSpacer2", "Settings",
"Sep2", "Crop", "Sep3", "Undo", "Redo", "Delete", "Sep4", "Clear", "SplitSpacer2", "Folders", "Print", "Settings",
"New", "Screencast", "OcrSnip", "Spacer", "Save", "Upload", "Copy", "Sep5", "Spacer2", "Rulers", "ZoomOut", "Zoom", "ZoomIn"
};
@@ -1571,6 +1571,19 @@ public partial class EditorWindow : Window
e.Handled = true;
}
private void RulerFolder_Click(object sender, RoutedEventArgs e)
{
var menu = new ContextMenu { PlacementTarget = RulerFolderButton, Placement = PlacementMode.Bottom };
menu.Items.Add(MenuItem("Screenshotmap openen", "\uE91B", "", () => Kniip.History.HistoryActions.OpenFolder(ScreenshotFolder)));
menu.Items.Add(MenuItem("Screencastmap openen", "\uE714", "", () => Kniip.History.HistoryActions.OpenFolder(App.Instance.VideoFolder)));
menu.IsOpen = true;
}
private string ScreenshotFolder =>
new[] { _settings.SnipSaveFolder, _settings.LastSaveFolder, Kniip.Capture.CaptureCoordinator.ScreenshotsFolder }
.FirstOrDefault(folder => folder is { Length: > 0 } && System.IO.Directory.Exists(folder))
?? Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
private bool SnapEnabled => _settings.ShowRulers && !Keyboard.Modifiers.HasFlag(ModifierKeys.Alt);
/// <summary>Kleinste verschuiving waarmee een van de waarden op een hulplijn of op de rand of het midden van de afbeelding valt.</summary>
@@ -2461,8 +2474,8 @@ public partial class EditorWindow : Window
SaveLabel.Text = label;
ToolbarPanel.SetTitle(SaveButton, label);
SaveButton.ToolTip = copy
? "Opslaan en naar het klembord kopiëren (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als"
: "Opslaan (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als";
? "Opslaan en naar het klembord kopiëren (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als; het pijltje toont meer opties"
: "Opslaan (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als; het pijltje toont meer opties";
UpdateToolbarLayout();
}
@@ -2584,11 +2597,13 @@ public partial class EditorWindow : Window
private static string DefaultName => $"Knipsel {DateTime.Now:yyyy-MM-dd HHmmss}";
private bool Save()
private bool Save() => Save(CopiesOnSave);
private bool Save(bool copy)
{
if (_settings.SnipSaveFolder is not { Length: > 0 } target)
{
return SaveAs();
return SaveAs(copy);
}
CommitTextEdit();
@@ -2601,13 +2616,15 @@ public partial class EditorWindow : Window
{
MessageBox.Show(this, $"De opslagmap uit de instellingen is niet bruikbaar:\n{target}\n\n{ex.Message}\n\nKies zelf waar je het knipsel opslaat.",
"kniip", MessageBoxButton.OK, MessageBoxImage.Warning);
return SaveAs();
return SaveAs(copy);
}
return WriteTo(path);
return WriteTo(path, copy);
}
private bool SaveAs()
private bool SaveAs() => SaveAs(CopiesOnSave);
private bool SaveAs(bool copy)
{
CommitTextEdit();
string folder = _settings.LastSaveFolder is { } last && System.IO.Directory.Exists(last)
@@ -2627,7 +2644,7 @@ public partial class EditorWindow : Window
return false;
}
if (!WriteTo(dialog.FileName))
if (!WriteTo(dialog.FileName, copy))
{
return false;
}
@@ -2636,7 +2653,7 @@ public partial class EditorWindow : Window
return true;
}
private bool WriteTo(string path)
private bool WriteTo(string path, bool copy)
{
try
{
@@ -2647,7 +2664,7 @@ public partial class EditorWindow : Window
_dirty = false;
_exported = true;
string name = System.IO.Path.GetFileName(path);
if (CopiesOnSave)
if (copy)
{
ShowTemporaryHint(ClipboardWriter.SetImage(image, path)
? $"Opgeslagen en gekopieerd: {name}."
@@ -2681,6 +2698,68 @@ public partial class EditorWindow : Window
}
}
private void SaveMenu_MouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (!SaveButton.IsEnabled)
{
return;
}
bool copy = CopiesOnSave;
string ellipsis = string.IsNullOrEmpty(_settings.SnipSaveFolder) ? "..." : string.Empty;
var menu = new ContextMenu { PlacementTarget = SaveButton, Placement = PlacementMode.Bottom };
menu.Items.Add(copy
? MenuItem("Opslaan" + ellipsis, "\uE74E", "", () => Save(false))
: MenuItem("Opslaan en kopiëren" + ellipsis, "\uE74E", "", () => Save(true)));
menu.Items.Add(MenuItem("Opslaan als...", "\uE792", "Ctrl+Shift+S", () => SaveAs()));
menu.IsOpen = true;
}
private void Folders_Click(object sender, RoutedEventArgs e)
{
var menu = new ContextMenu { PlacementTarget = FoldersButton, Placement = PlacementMode.Bottom };
menu.Items.Add(MenuItem("Open Screenshot map", "\uE91B", "", () => Kniip.History.HistoryActions.OpenFolder(App.Instance.SnipFolder)));
menu.Items.Add(MenuItem("Open Screencast map", "\uE714", "", () => Kniip.History.HistoryActions.OpenFolder(App.Instance.VideoFolder)));
menu.IsOpen = true;
}
private void Print_Click(object sender, RoutedEventArgs e) => Print();
private void Print()
{
CommitTextEdit();
var dialog = new PrintDialog();
if (dialog.ShowDialog() != true)
{
return;
}
try
{
BitmapSource image = DocumentRenderer.Export(_doc);
double pageWidth = dialog.PrintableAreaWidth;
double pageHeight = dialog.PrintableAreaHeight;
double scale = Math.Min(1, Math.Min(pageWidth / image.Width, pageHeight / image.Height));
double width = image.Width * scale;
double height = image.Height * scale;
var visual = new DrawingVisual();
RenderOptions.SetBitmapScalingMode(visual, BitmapScalingMode.HighQuality);
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawImage(image, new Rect((pageWidth - width) / 2, (pageHeight - height) / 2, width, height));
}
dialog.PrintVisual(visual, "kniip - knipsel");
ShowTemporaryHint("Naar de printer gestuurd.");
}
catch (Exception ex)
{
MessageBox.Show(this, $"Printen is mislukt:\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
private void Undo_Click(object sender, RoutedEventArgs e) => Undo();
private void Redo_Click(object sender, RoutedEventArgs e) => Redo();
@@ -2916,6 +2995,9 @@ public partial class EditorWindow : Window
case Key.S:
Save();
break;
case Key.P:
Print();
break;
case Key.U when CanUpload:
Upload();
break;
+1 -1
View File
@@ -18,7 +18,7 @@
<ApplicationManifest>app.manifest</ApplicationManifest>
<Product>kniip</Product>
<Description>Annotatie-editor naast het Windows Knipprogramma</Description>
<Version>2.0.0</Version>
<Version>2.1.0</Version>
<SatelliteResourceLanguages>nl;en</SatelliteResourceLanguages>
<!-- WPF regelt DPI via app.manifest; de WinForms-analyzer is hier niet van toepassing. -->
<NoWarn>$(NoWarn);WFAC010</NoWarn>
@@ -111,6 +111,9 @@
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74E;" Style="{StaticResource IconText}" FontSize="14" Margin="0,0,6,0" />
<TextBlock x:Name="SaveText" Text="Opslaan als MP4..." VerticalAlignment="Center" />
<TextBlock Text="&#xE70D;" Style="{StaticResource IconText}" FontSize="9"
Background="Transparent" Padding="4,2,0,2" Margin="6,0,0,0"
ToolTip="Meer opslagopties" PreviewMouseLeftButtonDown="SaveMenu_MouseDown" />
</StackPanel>
</Button>
</StackPanel>
+34 -6
View File
@@ -8,6 +8,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Threading;
using Kniip.Editor;
@@ -346,13 +347,13 @@ public partial class ScreencastWindow : Window
Mp4Toggle.IsChecked = format == ScreencastFormat.Mp4;
GifToggle.IsChecked = format == ScreencastFormat.Gif;
GifOptions.Visibility = format == ScreencastFormat.Gif ? Visibility.Visible : Visibility.Collapsed;
bool copy = _settings.SaveButton == SaveButtonChoice.SaveAndCopy;
bool copy = CopiesOnSave;
string ellipsis = string.IsNullOrEmpty(_settings.VideoSaveFolder) ? "..." : string.Empty;
string action = copy ? "Opslaan en kopiëren als " : "Opslaan als ";
SaveText.Text = action + (format == ScreencastFormat.Gif ? "GIF" : "MP4") + ellipsis;
SaveButton.ToolTip = copy
? "Slaat op en kopieert het bestand naar het klembord. Shift+klik = altijd vragen waar je opslaat."
: "Shift+klik = altijd vragen waar je opslaat";
? "Slaat op en kopieert het bestand naar het klembord. Shift+klik = altijd vragen waar je opslaat; het pijltje toont meer opties."
: "Shift+klik = altijd vragen waar je opslaat; het pijltje toont meer opties";
UploadButton.Visibility = _settings.Uploader is { IsConfigured: true } ? Visibility.Visible : Visibility.Collapsed;
UpdateInfo();
}
@@ -395,7 +396,36 @@ public partial class ScreencastWindow : Window
private static string DefaultFolder =>
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "kniip");
private async void Save_Click(object sender, RoutedEventArgs e)
private bool CopiesOnSave => _settings.SaveButton == SaveButtonChoice.SaveAndCopy;
private async void Save_Click(object sender, RoutedEventArgs e) =>
await SaveAsync(Keyboard.Modifiers.HasFlag(ModifierKeys.Shift), CopiesOnSave);
private void SaveMenu_MouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
if (IsBusy || !SaveButton.IsEnabled)
{
return;
}
bool copy = CopiesOnSave;
string format = Format == ScreencastFormat.Gif ? "GIF" : "MP4";
string ellipsis = string.IsNullOrEmpty(_settings.VideoSaveFolder) ? "..." : string.Empty;
var menu = new ContextMenu { PlacementTarget = SaveButton, Placement = PlacementMode.Bottom };
menu.Items.Add(SaveMenuItem((copy ? "Opslaan als " : "Opslaan en kopiëren als ") + format + ellipsis, false, !copy));
menu.Items.Add(SaveMenuItem("Opslaan als...", true, copy));
menu.IsOpen = true;
}
private MenuItem SaveMenuItem(string header, bool ask, bool copy)
{
var item = new MenuItem { Header = header };
item.Click += async (_, _) => await SaveAsync(ask, copy);
return item;
}
private async Task SaveAsync(bool ask, bool copy)
{
if (IsBusy)
{
@@ -403,7 +433,6 @@ public partial class ScreencastWindow : Window
}
SetPlaying(false);
bool ask = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift);
string? target = ask ? null : FixedTarget();
if (target is null)
{
@@ -421,7 +450,6 @@ public partial class ScreencastWindow : Window
_kept = true;
RememberChoices();
AddToHistory(target, null, target);
bool copy = _settings.SaveButton == SaveButtonChoice.SaveAndCopy;
bool copied = !copy || ClipboardWriter.SetFile(target);
App.Instance.ShowBalloon(copy && copied ? "Screencast opgeslagen en gekopieerd" : "Screencast opgeslagen", target);
if (!copied)