Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
534262a4c7 |
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="" 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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -493,6 +493,14 @@
|
||||
<TextBlock Text="" 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="" 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="" 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="" Style="{StaticResource IconText}" FontSize="14" />
|
||||
<TextBlock x:Name="SaveLabel" Text="Opslaan" Margin="6,0,0,0" />
|
||||
<TextBlock x:Name="SaveMenuChevron" Text="" 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="" 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}"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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="" Style="{StaticResource IconText}" FontSize="14" Margin="0,0,6,0" />
|
||||
<TextBlock x:Name="SaveText" Text="Opslaan als MP4..." VerticalAlignment="Center" />
|
||||
<TextBlock Text="" 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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user