Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -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.
-->
<VersionPrefix>1.7.6</VersionPrefix>
<VersionPrefix>1.7.7</VersionPrefix>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion site/guide.html
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,7 @@ <h3 id="ink">Ink and tools</h3>
<div class="toolrow">
<svg class="glyph" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m15.87 2.67 4.97 4.97c.88.88.88 2.3 0 3.18l-8.68 8.68h6.1c.37 0 .69.28.74.65v.1c0 .38-.28.7-.64.74l-.1.01H9.83a2.24 2.24 0 0 1-1.71-.65l-4.97-4.97a2.25 2.25 0 0 1 0-3.18l9.53-9.53c.88-.88 2.3-.88 3.18 0Zm-10.16 9.1-1.49 1.49c-.3.29-.3.76 0 1.06l4.97 4.96c.15.15.34.22.53.22h.07a.75.75 0 0 0 .46-.22l1.49-1.48-6.03-6.03Zm8.04-8.04L6.77 10.7l6.03 6.03 6.98-6.98c.29-.3.29-.77 0-1.06L14.8 3.73a.75.75 0 0 0-1.06 0Z"/></svg>
<span class="name">Eraser</span>
<span class="role">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.</span>
<span class="role">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. <span class="ui">Edit → Clear strokes</span> removes every stroke on the board at once.</span>
</div>
<div class="toolrow">
<svg class="glyph" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.28 6.03c-.3.3-.77.3-1.06 0l-1.47-1.47v3.69a.75.75 0 0 1-1.5 0V4.56L9.78 6.03a.75.75 0 0 1-1.06-1.06l2.75-2.75a.75.75 0 0 1 1.06 0l2.75 2.75c.3.3.3.77 0 1.06Zm-9.25 8.19a.75.75 0 1 1-1.06 1.06l-2.75-2.75a.75.75 0 0 1 0-1.06l2.75-2.75a.75.75 0 0 1 1.06 1.06l-1.47 1.47h3.69a.75.75 0 0 1 0 1.5H4.56l1.47 1.47Zm11.94 1.06a.75.75 0 0 1 0-1.06l1.47-1.47h-3.69a.75.75 0 0 1 0-1.5h3.69l-1.47-1.47a.75.75 0 0 1 1.06-1.06l2.75 2.75a.75.75 0 0 1 0 1.06l-2.75 2.75c-.3.3-.77.3-1.06 0Zm-2.69 2.69a.75.75 0 0 0-1.06 0l-1.47 1.47v-3.69a.75.75 0 0 0-1.5 0v3.69l-1.47-1.47a.75.75 0 0 0-1.06 1.06l2.75 2.75a.75.75 0 0 0 1.06 0l2.75-2.75c.3-.3.3-.77 0-1.06Z"/></svg>
Expand Down
2 changes: 1 addition & 1 deletion site/shortcuts.html
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ <h2><span class="secico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none"
<div class="keyrow"><span><kbd>Alt</kbd><span class="plus">+</span><kbd>L</kbd></span><span class="act">Laser pointer.</span></div>
<div class="keyrow"><span><kbd>F11</kbd></span><span class="act">Fill the current monitor and hide the title and tabs. Press again or <kbd>Escape</kbd> to leave.</span></div>
<div class="keyrow"><span><kbd>Ctrl</kbd><span class="plus">+</span><kbd>F11</kbd></span><span class="act">Canvas only: hide the title and tabs, keep this window’s size and place. Press again or <kbd>Escape</kbd> to leave.</span></div>
<div class="keyrow"><span><kbd>Alt</kbd><span class="plus">+</span><kbd>F</kbd> <span class="plus">/</span> <kbd>E</kbd> <span class="plus">/</span> <kbd>V</kbd> <span class="plus">/</span> <kbd>I</kbd> <span class="plus">/</span> <kbd>H</kbd></span><span class="act">Open 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.</span></div>
<div class="keyrow"><span><kbd>Alt</kbd><span class="plus">+</span><kbd>F</kbd> <span class="plus">/</span> <kbd>E</kbd> <span class="plus">/</span> <kbd>V</kbd> <span class="plus">/</span> <kbd>I</kbd> <span class="plus">/</span> <kbd>H</kbd></span><span class="act">Open 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.</span></div>
</div>
</section>

Expand Down
28 changes: 28 additions & 0 deletions src/SQLBI.Whiteboard/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -4163,6 +4164,30 @@ private void DeleteSelection()
SceneSurface.InvalidateVisual();
}

/// <summary>
/// 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.
/// </summary>
private void ClearStrokes()
{
if (_textEditBefore is not null ||
_labelEditBefore is not null ||
_shapeEditBefore is not null)
{
return;
}

BoardObject[] strokes = _document.Objects.OfType<InkStrokeObject>().ToArray<BoardObject>();
if (strokes.Length == 0)
{
return;
}

_history.Execute(DeleteCommandFor(strokes), _document);
SceneSurface.InvalidateVisual();
}

/// <summary>
/// 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
Expand Down Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions src/SQLBI.Whiteboard/SessionChrome.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,24 @@
Text="Ctrl+V" />
</StackPanel>
</Button>
<Button x:Name="ClearStrokesButton"
Style="{StaticResource SessionCommandButton}"
ToolTip="Remove every ink stroke from the board"
Tag="ClearStrokes"
Click="Command_Click">
<StackPanel HorizontalAlignment="Center">
<Path Width="18"
Height="18"
Stretch="Uniform"
Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Button}}"
Data="{StaticResource EraserGeometry}" />
<TextBlock Margin="0,4,0,0"
HorizontalAlignment="Center"
Text="Clear strokes" />
<TextBlock Style="{StaticResource SessionShortcutHint}"
Text="S" />
</StackPanel>
</Button>
</StackPanel>
<StackPanel x:Name="ViewRow"
Orientation="Horizontal"
Expand Down
13 changes: 13 additions & 0 deletions src/SQLBI.Whiteboard/SessionChrome.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public enum SessionCommand
Redo,
Copy,
Paste,
ClearStrokes,
FullScreen,
CanvasOnly,
ToggleGrid,
Expand Down Expand Up @@ -50,6 +51,7 @@ public SessionChrome()
{
InitializeComponent();
SetEditEnabled(canUndo: false, canRedo: false);
SetClearStrokesEnabled(hasStrokes: false);
SetLiveViewCommands(selected: false, hasTarget: false, frozen: false);
SetZOrderEnabled(canBringToFront: false, canSendToBack: false);
}
Expand Down Expand Up @@ -107,6 +109,16 @@ public void SetEditEnabled(bool canUndo, bool canRedo)
RedoButton.IsEnabled = canRedo;
}

public void SetClearStrokesEnabled(bool hasStrokes)
{
if (ClearStrokesButton is null)
{
return;
}

ClearStrokesButton.IsEnabled = hasStrokes;
}

/// <summary>
/// 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
Expand Down Expand Up @@ -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,
Expand Down
Loading