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
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@ 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.2 - 30 September 2026

### Draw a rectangle with square corners
**Insert** now offers **Rectangle** before **Rounded**. Rectangles imported from Microsoft
Whiteboard keep their square corners.

### Older Microsoft Whiteboard boards look as they did
Highlighter scribbles that filled frames and regions on boards made with older versions of
Microsoft Whiteboard now come across, as pictures. Their handwritten text keeps its Ink Free
font, now one of the label fonts, and the lines it had instead of wrapping onto two.

## 1.7.1 - 29 September 2026

### Import boards made with older versions of Microsoft Whiteboard
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.1</VersionPrefix>
<VersionPrefix>1.7.2</VersionPrefix>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ How the project is developed and shipped is documented separately:
- Image selection, movement, resizing, and deletion
- Text containers created by pasting plain text, with display and in-place edit modes
- Seventeen text-container types: fifteen languages with live syntax highlighting, plus Prompt and Markdown, and local F6 formatting for DAX, SQL Server, and KQL
- An **Insert** tab with eight shapes drawn by dragging, with outline color, fill, line thickness, and text of their own in nine fonts; three connectors that bind wherever an end is dropped on a shape or a container, follow it, and can be drawn from the four arrows on a selected shape; and text labels typed on the board. A shape or a label turns to any angle by its handle, and the pin at the end of the row makes it a palette you can move
- An **Insert** tab with nine shapes drawn by dragging, with outline color, fill, line thickness, and text of their own in ten fonts; three connectors that bind wherever an end is dropped on a shape or a container, follow it, and can be drawn from the four arrows on a selected shape; and text labels typed on the board. A shape or a label turns to any angle by its handle, and the pin at the end of the row makes it a palette you can move
- Selection by area: drag with Select for a rectangle, or hold Select for a freehand outline. Ctrl+A takes everything and Ctrl+Shift+A the ink alone, and the **…** on the selection offers Delete, Copy, Duplicate, and the four depth commands. Ink is taken too, and everything the area takes moves, resizes, recolors, reorders, and deletes as one
- An optional background grid, Lines or Dots, whose spacing is fixed in board pixels and coarsens as the zoom goes out. It is drawn on screen only and never appears in an export or a preview
- Containers automatically carry strokes that touch only that container when moved or resized
Expand Down Expand Up @@ -222,7 +222,7 @@ Use **Copy settings** after finding a useful combination so the exact values can
| … on the property bar | Delete, Copy, Duplicate, and the four depth commands for whatever is selected |
| Alt+L | Laser pointer |
| File / Edit / View / Insert / Help | Tab strip. Click a tab for a one-row command strip over the canvas. Click the canvas to hide it |
| Insert tab | Alt+I: the eight shapes, the three connectors, and Text. The tool returns to Select after one object unless **After inserting an object** says to keep it |
| Insert tab | Alt+I: the nine shapes, the three connectors, and Text. The tool returns to Select after one object unless **After inserting an object** says to keep it |
| Insert > Palette | Pin the Insert row into a floating palette that drags anywhere in the window and comes back where it was left. Letter P while the Insert strip is open, or **Preferences → Toolbar → Insert palette** |
| Hold Select, or tap it again | Switch what a drag on empty canvas takes, between a rectangle and a freehand lasso. The hold is 600 ms; the button's glyph and its tooltip say which one is armed |
| Rotation handle | The circle above a selected shape or label turns it to any angle; Shift snaps to 15°, and the property bar's two buttons step by 45° |
Expand Down
13 changes: 8 additions & 5 deletions docs/design-objects.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ a change to one is a change to this file first.
an object** (Keep the tool / Return to Select), gives the one-shot behaviour.
4. **The shape set** is the eight in the issue's screenshot: rounded rectangle, ellipse,
triangle, pentagon, block arrow, parallelogram, diamond, stadium. The first is a
rectangle with rounded corners, not a square.
rectangle with rounded corners, not a square. 1.7.2 adds a rectangle with square
corners, first in the row, so that imported boards keep their frames square.
5. **Colors.** The six pen swatches for shape outline, connector, and text, and the same
six as a translucent tint plus **None** for a shape's fill. Default outline and
connector color and thickness: the current pen's. Default fill: None. Default text:
Expand All @@ -72,7 +73,8 @@ a change to one is a change to this file first.
drawing, Ctrl at mouse-down still borrows Select, so the gesture starts without it.
7. **Fonts.** A curated list — Segoe UI, Calibri, Arial, Georgia, Times New Roman,
Consolas, Cascadia Mono, Comic Sans MS, Segoe Print — with Segoe UI when a saved font
is not installed. Consolas and Cascadia Mono are the monospace entries.
is not installed. Consolas and Cascadia Mono are the monospace entries. 1.7.2 adds
Ink Free, the handwriting of boards imported from older Microsoft Whiteboard versions.
8. **What an area picks up.** Two settings under **Preferences → Selection**. **Area
selects**: objects partly inside (default) or only objects fully inside. **Extend to
touching**: Ignore (default), Single, or Recursive. An object touches another when its
Expand Down Expand Up @@ -115,7 +117,8 @@ ConnectorAnchor(ObjectId, U, V) // a point on that object's bounds, 0..1 eac
```

- `ShapeKind`: RoundedRectangle, Ellipse, Triangle, Pentagon, BlockArrow, Parallelogram,
Diamond, Stadium, in the flyout's order. The outline geometry of each is a function of its
Diamond, Stadium, and Rectangle. A board stores the kind by name, so a new kind goes at
the end, and the flyout lists them in its own order with Rectangle first. The outline geometry of each is a function of its
`Bounds` in `Core` (`ShapeGeometry`), returned as a polygon or a list of segments and
arcs, so hit testing and the vector export share it with the renderer.
- `ConnectorKind`: Line, Arrow, CurvedArrow. A curved connector is one cubic Bézier whose
Expand Down Expand Up @@ -206,7 +209,7 @@ and they persist in `AppSettings` (`Shape`, `Connector`, `Label`), settings vers
### The Insert tab, and the optional toolbar button

An **Insert** tab joins the tab strip between View and Help (`SessionChrome`, with its
own row and Alt mnemonic like the others). Its row holds the eight shapes, a separator,
own row and Alt mnemonic like the others). Its row holds the shapes, a separator,
the three connectors, a separator, and Text — the issue's screenshot, laid out as one
row of the strip's buttons. Picking one selects that tool, which then behaves as
decision 3 says: it stays until Escape or another tool, unless the **After inserting an
Expand Down Expand Up @@ -508,7 +511,7 @@ The Insert row opens like a menu, far from the pen, and it covers the toolbar. F
designs for a palette were considered:

- **A. Pin the Insert row into a floating palette.** A pin at the end of the Insert row
turns its content, the eight shapes, the three connectors, and Text in two short rows,
turns its content, the shapes, the three connectors, and Text in two short rows,
into a second floating palette that is dragged by a grip, kept anywhere in the window,
remembered in settings, shown or hidden from the pin, the View row, or Preferences. It
reuses the shared button list the toolbar flyout is built from, never touches the main
Expand Down
8 changes: 5 additions & 3 deletions docs/export.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ way on the slide:

| Shape | Preset |
| --- | --- |
| Rectangle | `rect` |
| Rounded rectangle | `roundRect`, corner adjust 20000 |
| Ellipse | `ellipse` |
| Triangle | `triangle` |
Expand Down Expand Up @@ -223,7 +224,7 @@ shape and carries none.

| Preset | Where the board binds, and the site it is |
| --- | --- |
| `rect`, `roundRect` — rounded rectangle, stadium, and a label's box | top 0, left 1, bottom 2, right 3 |
| `rect`, `roundRect` — rectangle, rounded rectangle, stadium, and a label's box | top 0, left 1, bottom 2, right 3 |
| `diamond` | top 0, left 1, bottom 2, right 3 |
| `ellipse` | top 0, left 2, bottom 4, right 6 |
| `triangle` | apex 0, bottom-left corner 2, bottom midpoint 3, bottom-right corner 4 |
Expand Down Expand Up @@ -296,8 +297,9 @@ The faces are read from the Windows fonts folder and embedded, so a label stays
and stays searchable. Segoe UI, Calibri, Arial, Georgia, Times New Roman, Consolas,
Comic Sans MS, and Segoe Print each embed their own regular, bold, italic, and bold
italic; Segoe Print has no italic file on Windows, so an italic Segoe Print label is
upright on the page, and Cascadia Mono is written in Consolas, because Windows ships it
only as a variable font whose bold and italic are axes rather than files. Any other
upright on the page, Ink Free has only its regular face, which every style of it uses,
and Cascadia Mono is written in Consolas, because Windows ships it only as a variable
font whose bold and italic are axes rather than files. Any other
family a board names falls back to Segoe UI, as the page furniture already does.

### Writing the file
Expand Down
42 changes: 29 additions & 13 deletions docs/microsoft-whiteboard-import.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Microsoft Whiteboard import

**Implemented in 1.7.0**, with the objects of older versions of the app in 1.7.1. This
document records what a Microsoft Whiteboard export contains, how the importer maps it
onto a board, and what it cannot carry over. Microsoft retires its standalone Whiteboard
apps on 16 October 2026 (see [retirement](retirement/README.md)), and the export is the
only way to take a board out of it. The format is undocumented. Everything below was established from eight exports of
real teaching boards and one test board holding every kind of object the Windows client
offers, made between 20 and 27 September 2026. Six more teaching boards, exported on 29
September, added the objects that older versions of the app wrote, which 1.7.1 reads.
**Implemented in 1.7.0**, with the objects of older versions of the app in 1.7.1 and
1.7.2. This document records what a Microsoft Whiteboard export contains, how the
importer maps it onto a board, and what it cannot carry over. Microsoft retires its
standalone Whiteboard apps on 16 October 2026 (see [retirement](retirement/README.md)),
and the export is the only way to take a board out of it. The format is undocumented.
Everything below was established from eight exports of real teaching boards and one test
board holding every kind of object the Windows client offers, made between 20 and 27
September 2026. Six more teaching boards, exported on 29 September, added the objects
that older versions of the app wrote.

## Where it starts

Expand Down Expand Up @@ -75,6 +76,12 @@ no model of the board beyond what it draws.
- **Highlighter outline.** The tip is an axis-aligned rectangle twice as tall as it is
wide, drawn once at the start and swept along the centerline. Its height follows
pressure. The fill is the color at 0.4 alpha.
- **Highlighter without a centerline.** Older versions of the app wrote some highlighter
strokes with an empty `polyline` and a scale other than 1/128. The outline is a square
tip followed by the sweep, as overlapping pieces, and the path cannot be recovered from
it reliably. Seven samples on three boards are scribbles that fill a frame, a region,
or a table, or mark a few words. `Whiteboard 1` had lost its three until 1.7.2, with no
message, because such a stroke was taken for an empty one.
- **Arrowheads** on a pen are part of the centerline: it runs out to each barb's tip and
back, so they need nothing of their own.
- **Rainbow and Galaxy** ink fill the outline with a `url(#…)` pattern that uses
Expand Down Expand Up @@ -105,11 +112,13 @@ Windows client offers, from `paleYellowGradient` (#FEE15A) to `grayGradient` (#C
| --- | --- |
| Pen stroke | `InkStrokeObject`, `PenKind.Pen`, the fill as its color |
| Highlighter stroke, or a translucent stroke in a `Mixed` group | `InkStrokeObject`, `PenKind.Highlighter`, the color made opaque |
| Highlighter stroke without a centerline | An SVG asset of its outline, in its color and opacity, in the box it covers |
| Rainbow or Galaxy stroke | A pen stroke in violet (#8B5CF6) or indigo (#312E81) |
| Picture, document page, sticker | `BoardAsset` with the sniffed type, and an `ImageBoardObject` |
| Turned picture | An SVG asset that draws the picture turned, in the box it covers |
| Shape | `ShapeBoardObject` of the kind its outline has, with fill, outline, angle, and text |
| Older ellipse or polygon | `ShapeBoardObject`, an oval with the ellipse's radii or the kind the polygon's corners have, without text |
| Rectangle, in either form | `ShapeBoardObject`, `ShapeKind.Rectangle`, with square corners |
| Sticky note | `ShapeBoardObject`, rounded rectangle in the note's color, with the note's text |
| Note grid | A white rounded rectangle for the panel, a label for the title, and one note per cell |
| Text box | `FreeTextBoardObject`, wrapped into the lines the box showed |
Expand Down Expand Up @@ -138,8 +147,12 @@ anchor's angle and swaps the box's sides.
measure text, so the window passes in `IBoardTextMeasure`, backed by the same WPF layout
that draws labels and containers. A label here keeps the lines it is given, so the importer
wraps the text at the box's width first, word by word. A label's font is the nearest of
the label fonts: Simple (Aptos) and anything unknown become Segoe UI, Handwritten
(Segoe Print, Ink Free) becomes Segoe Print, and a serif family becomes Georgia.
the label fonts: Simple (Aptos) and anything unknown become Segoe UI, Handwritten is
Segoe Print or, on older boards, Ink Free, both of which are label fonts, and a serif
family becomes Georgia. The lines are found by measuring in the family the page names,
because that is where the text box broke them. Until 1.7.2 Ink Free became Segoe Print,
which is wider, and measuring in it split single-line titles in two. A family that is
not installed is measured in WPF's fallback.

**Width.** WPF draws a point at the style's thickness × (0.25 + 1.5 × pressure), so
pressure 0.5 is the thickness itself. Each centerline point takes twice the radius of the
Expand Down Expand Up @@ -173,8 +186,10 @@ parses in about 160 ms.
further out. A vertical highlight comes out four times as wide as the original. A
highlight has one width throughout.
- **Rainbow and Galaxy** are one color each.
- **Rectangles and notes have rounded corners**, because the board's rectangle has them.
The rounding shows most on large frames, such as a template's columns.
- **Notes and note grids have rounded corners**, because they are rounded rectangles here.
- **An old highlighter scribble is a picture**, not ink, because its path is not in the
export. It moves and deletes as a picture, and it keeps the few small gaps the page
shows where the outline's pieces overlap.
- **Note text is centered** in the note, where Microsoft puts it at the top left, and
text too large for its note overflows it rather than being cut off.
- **Elbow connectors are straight.** Their ends stay where they were and stay bound.
Expand Down Expand Up @@ -209,7 +224,8 @@ Each sample was opened in the application and compared with the same page render
Edge, fitted to the same content. Positions, picture sizes, scaled ink groups, and colors
matched on all eight teaching boards. The six later boards were opened in the
application, where the older ellipses, rectangles, and pictures sit in place against the
ink drawn around them. Regions with pressure-drawn handwriting and with highlighters were
ink drawn around them. The highlighter pictures, square frames, and one-line titles of
FEvsSE, Venn diagrams, and Whiteboard 1 were compared with Edge at the same fit. Regions with pressure-drawn handwriting and with highlighters were
compared at 150% against a WPF rendering that uses the application's own drawing
attributes. The test board was compared region by region in the application:
ink, text boxes, notes, the note grid, shapes, connectors, pictures, the template, and the
Expand Down
2 changes: 1 addition & 1 deletion site/export-microsoft-whiteboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ <h2 id="what-comes-across">What comes across</h2>
<li>Text boxes, connectors, and links.</li>
<li>Comments, as text beside the board with the names of their authors.</li>
</ul>
<p>A highlighter stroke has one width, and Rainbow and Galaxy ink become one color. Rectangles and notes have rounded corners, and elbow connectors become straight. The background color and reactions are left out. After the import, a message lists anything the board did not bring across.</p>
<p>A highlighter stroke has one width, and Rainbow and Galaxy ink become one color. Notes have rounded corners, and elbow connectors become straight. The background color and reactions are left out. After the import, a message lists anything the board did not bring across.</p>
<p>SQLBI Whiteboard keeps each board in a file on your PC and has no real-time collaboration. <a href="compare.html">Compare</a> lists the differences from Microsoft Whiteboard.</p>
</article>

Expand Down
2 changes: 1 addition & 1 deletion site/guide.html
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ <h3>Text and code</h3>
<p>The chip also offers Python, C, C++, Java, C#, JavaScript, TypeScript, Visual Basic .NET, R, Rust, and PHP. These are highlighted but not formatted, and paste never picks one for you. <kbd>F6</kbd> on one of them opens a link to that language's issue on GitHub, where thumbs-up votes set the order in which formatters are added.</p>

<h3>Shapes, connectors, and text</h3>
<p>The <span class="ui">Insert</span> tab holds eight shapes, three connectors, and <span class="ui">Text</span>. Drag on the board to draw a shape — hold <kbd>Shift</kbd> for a square — and choose its outline color, fill, and thickness with it selected. Type into it, or press <kbd>F2</kbd>, and the words sit inside the shape, in a font, a size, a color, bold, italic, and underline; the circle above it turns it to any angle, with <kbd>Shift</kbd> for 15° steps. Click with <span class="ui">Text</span> for a label on its own, which takes the same font and the same handle.</p>
<p>The <span class="ui">Insert</span> tab holds nine shapes, three connectors, and <span class="ui">Text</span>. Drag on the board to draw a shape — hold <kbd>Shift</kbd> for a square — and choose its outline color, fill, and thickness with it selected. Type into it, or press <kbd>F2</kbd>, and the words sit inside the shape, in a font, a size, a color, bold, italic, and underline; the circle above it turns it to any angle, with <kbd>Shift</kbd> for 15° steps. Click with <span class="ui">Text</span> for a label on its own, which takes the same font and the same handle.</p>
<p>Drop a connector's end anywhere on a shape and it binds there and follows, so moving the shape takes the arrow with it; hold <kbd>Ctrl</kbd> at release to bind to the nearest point on the border instead, or choose <span class="ui">Anchors → Auto</span> to let a bound end move to the side facing the other end. A selected shape also carries four small arrows, one to a side, and dragging one out draws a bound arrow without leaving <span class="ui">Select</span>.</p>
<p><span class="ui">Select</span> comes back once one object is drawn, and <kbd>Escape</kbd> returns to <span class="ui">Select</span> at any time. <span class="ui">Preferences → Toolbar</span> keeps it for the next one instead, adds <span class="ui">Insert</span> to the floating palette, or pins the Insert row into a second palette you can drag anywhere. Shapes, connectors, and labels are saved in the board, undone with everything else, and exported to a deck or a PDF as objects you can select and change — in PowerPoint the straight arrows are still attached to their shapes.</p>

Expand Down
Loading
Loading