diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a76c3..b4b2388 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,13 @@ broke. The heading is parsed by `scripts/release-notes.ps1`, so keep its shape; under it is ordinary Markdown, and the renderer handles paragraphs, lists, links, `code` and **bold**. +## 1.7.7 - 29 October 2026 + +### Clear strokes +**Edit → Clear strokes** removes every ink stroke on the board in one step, including strokes +linked to a container, and leaves images, text, shapes, and frames in place. Undo brings the +strokes back, so a board can be exported without its ink and then restored. + ## 1.7.6 - 20 October 2026 ### Panning with a mouse diff --git a/Directory.Build.props b/Directory.Build.props index c791ca0..1f0747a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,7 +5,7 @@ scripts/build-installer.ps1 both read it from here, so releasing is a reviewed change to this line rather than an edit in a pipeline variable group. --> - 1.7.6 + 1.7.7 latest enable enable diff --git a/README.md b/README.md index bdce648..2355bcb 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,7 @@ Use **Copy settings** after finding a useful combination so the exact values can | Ctrl+E | Export the board to PowerPoint or PDF | | Delete | Delete the selected container and its linked strokes | | Ctrl+A / Ctrl+Shift+A | Select everything an area could take, or the ink strokes only | +| Edit > Clear strokes | Remove every ink stroke on the board, including strokes linked to containers, as one step that Undo restores. Letter S while the Edit strip is open | | Ctrl+D | Duplicate the selection 24 pixels down and to the right, and select the copy | | … on the property bar | Delete, Copy, Duplicate, and the four depth commands for whatever is selected | | Alt+L | Laser pointer | diff --git a/site/guide.html b/site/guide.html index 7b414b1..4b08f76 100644 --- a/site/guide.html +++ b/site/guide.html @@ -911,7 +911,7 @@

Ink and tools

Eraser - Removes whole strokes. The eraser end of a pen does the same — and so does the upper side button, because Windows reports the two identically — and hovering with it draws a dashed square around what a tap would clear. + Removes whole strokes. The eraser end of a pen does the same — and so does the upper side button, because Windows reports the two identically — and hovering with it draws a dashed square around what a tap would clear. Edit → Clear strokes removes every stroke on the board at once.
diff --git a/site/shortcuts.html b/site/shortcuts.html index 0fc244b..271bad4 100644 --- a/site/shortcuts.html +++ b/site/shortcuts.html @@ -134,7 +134,7 @@

F11Fill the current monitor and hide the title and tabs. Press again or Escape to leave.
Ctrl+F11Canvas only: hide the title and tabs, keep this window’s size and place. Press again or Escape to leave.
-
Alt+F / E / V / I / HOpen or switch the File, Edit, View, Insert, or Help strip. Alt always selects a tab. With a strip open, letters without Alt run a command. File: N New, O Open, S Save, A Save As, I Import, E Export. Edit: Z Undo, Y Redo, C Copy, V Paste. View: F Full screen, C Canvas only, G Grid, B Bring to front, W Bring forward, K Send backward, S Send to back, A Frame, H Show frames, L LiveView, Z Freeze, D Disconnect, R Reconnect. Insert: T Text, P Palette. Help: P Preferences, A About. Left, right, Home, and End move between commands.
+
Alt+F / E / V / I / HOpen or switch the File, Edit, View, Insert, or Help strip. Alt always selects a tab. With a strip open, letters without Alt run a command. File: N New, O Open, S Save, A Save As, I Import, E Export. Edit: Z Undo, Y Redo, C Copy, V Paste, S Clear strokes. View: F Full screen, C Canvas only, G Grid, B Bring to front, W Bring forward, K Send backward, S Send to back, A Frame, H Show frames, L LiveView, Z Freeze, D Disconnect, R Reconnect. Insert: T Text, P Palette. Help: P Preferences, A About. Left, right, Home, and End move between commands.
diff --git a/src/SQLBI.Whiteboard/MainWindow.xaml.cs b/src/SQLBI.Whiteboard/MainWindow.xaml.cs index 9db8dd3..4f5419a 100644 --- a/src/SQLBI.Whiteboard/MainWindow.xaml.cs +++ b/src/SQLBI.Whiteboard/MainWindow.xaml.cs @@ -617,6 +617,7 @@ private void Document_Changed(object? sender, EventArgs e) } SessionBar.SetFramesChecked(_document.ShowFrames); + SessionBar.SetClearStrokesEnabled(_document.Objects.Any(item => item is InkStrokeObject)); PublishSelection(); SceneSurface.InvalidateVisual(); UpdateLiveViewActionOverlay(); @@ -4163,6 +4164,30 @@ private void DeleteSelection() SceneSurface.InvalidateVisual(); } + /// + /// Every ink stroke on the board, including those linked to a container, as + /// one step, so one undo brings them all back. The rest of the selection + /// stays selected. + /// + private void ClearStrokes() + { + if (_textEditBefore is not null || + _labelEditBefore is not null || + _shapeEditBefore is not null) + { + return; + } + + BoardObject[] strokes = _document.Objects.OfType().ToArray(); + if (strokes.Length == 0) + { + return; + } + + _history.Execute(DeleteCommandFor(strokes), _document); + SceneSurface.InvalidateVisual(); + } + /// /// A copy of the selection, 24 screen pixels down and to the right of it and /// above everything on the board, which becomes the selection: pressing the @@ -7307,6 +7332,9 @@ private void SessionChrome_CommandRequested(SessionCommand command) case SessionCommand.Paste: PasteButton_Click(this, new RoutedEventArgs()); break; + case SessionCommand.ClearStrokes: + ClearStrokes(); + break; case SessionCommand.FullScreen: SetChromeMode( _chromeMode == SessionChromeMode.FullScreen diff --git a/src/SQLBI.Whiteboard/SessionChrome.xaml b/src/SQLBI.Whiteboard/SessionChrome.xaml index 01523b5..e35a591 100644 --- a/src/SQLBI.Whiteboard/SessionChrome.xaml +++ b/src/SQLBI.Whiteboard/SessionChrome.xaml @@ -222,6 +222,24 @@ Text="Ctrl+V" /> + /// The four depth commands need two flags, because a selection can be brought /// to the front exactly when it has something above it to pass, and sent to @@ -493,6 +505,7 @@ item.Tag is string name && 'Y' when EditRow.Visibility == Visibility.Visible => SessionCommand.Redo, 'C' when EditRow.Visibility == Visibility.Visible => SessionCommand.Copy, 'V' when EditRow.Visibility == Visibility.Visible => SessionCommand.Paste, + 'S' when EditRow.Visibility == Visibility.Visible => SessionCommand.ClearStrokes, 'F' when ViewRow.Visibility == Visibility.Visible => SessionCommand.FullScreen, 'C' when ViewRow.Visibility == Visibility.Visible => SessionCommand.CanvasOnly, 'G' when ViewRow.Visibility == Visibility.Visible => SessionCommand.ToggleGrid,