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
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.1.5</VersionPrefix>
<VersionPrefix>1.2.0</VersionPrefix>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
31 changes: 26 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ How the project is developed and shipped is documented separately:

- Low-latency, pressure-aware WPF wet ink, including rear-eraser detection on any pen that reports it
- A normal cursor for physical mouse input, and a pen-hover indicator that shows what a tap would do: the laser with its halo and speed trail, a dashed square around what the eraser would clear, and a high-contrast dot for everything else. All of them disappear on contact
- Optional mouse drawing (default when Windows reports neither a pen tablet nor a touchscreen): the left button uses the current tool, Ctrl and the left button move and resize a container, and Eraser and Pan appear on the toolbar. A mouse reports no pressure, so ink is drawn at an even width and Calligraphy is the one tool that still varies, because its width comes from speed. Nothing about the pen changes when it is on
- Touch panning and two-finger pinch zoom
- Optional finger drawing (default when no pen is detected): one finger uses the current tool, two fingers still pan and pinch-zoom, and Eraser and Pan appear on the toolbar
- A notice at startup when Windows reports neither a pen tablet nor a touchscreen: the application still opens, but there is nothing to draw with, and [discussion 78](https://github.com/sql-bi/SQLBI-Whiteboard/discussions/78) collects votes for mouse-only drawing. Dismissable from the notice itself or from Preferences, since the tablet list Windows reports can miss a pen that has never been in range
- A notice at startup when Windows reports neither a pen tablet nor a touchscreen, saying which pointing device the session is drawing with and what a pen would add. Dismissable from the notice itself or from Preferences, since the tablet list Windows reports can miss a pen that has never been in range
- Basic palm rejection: touch navigation is suspended when the pen makes contact
- Mouse-wheel zoom and middle-button or temporary Space-key panning
- Whole-stroke erasing
Expand All @@ -30,7 +31,7 @@ How the project is developed and shipped is documented separately:
- Markdown `.wimport` recipes that build image and text containers from headings
- An intentionally small floating toolbar
- A File / Edit / View / Help tab strip. Click a tab for a one-row command strip over the canvas
- Preferences for the startup monitor, full-screen start, finger drawing, the pen button, snippet format order, laser trail timing and weight, toolbar position and layout, and (except Store installs) a daily new-version check
- Preferences for the startup monitor, full-screen start, finger drawing, mouse drawing, the pen button, snippet format order, laser trail timing and weight, toolbar position and layout, and (except Store installs) a daily new-version check
- About, with version and channel

## Build and run
Expand Down Expand Up @@ -179,8 +180,9 @@ Use **Copy settings** after finding a useful combination so the exact values can
| Pen hover | Show the small red pointer dot and hide the arrow |
| Pen contact | Hide both the pointer dot and arrow |
| Physical mouse movement | Show the normal arrow |
| Left mouse | Temporarily select/move/resize a container; return to the previous drawing tool on release |
| Double-click container | Center and fit the image, text, or LiveView to the canvas |
| Left mouse | With Mouse drawing off, temporarily select/move/resize a container and return to the previous drawing tool on release. With it on, the current tool: ink, erase, select, pan, or the laser |
| Ctrl + left mouse | Select/move/resize a container and return to the previous drawing tool — what the left button does on its own when Mouse drawing is off |
| Double-click container | Center and fit the image, text, or LiveView to the canvas. With Mouse drawing on and an ink or eraser tool selected, hold Ctrl: two plain clicks are two strokes |
| Double-click empty canvas | Center and fit all board content, or reset an empty board |
| Pen eraser | Erase complete strokes. The upper side button erases too: Windows reports it the same way as a pen turned round |
| Pen barrel | Hold the barrel button for the action assigned in Preferences: Laser (default) or Straight line. Laser returns to the previous tool on release |
Expand All @@ -203,7 +205,7 @@ Use **Copy settings** after finding a useful combination so the exact values can
| Delete | Delete the selected container and its linked strokes |
| Alt+L | Laser pointer |
| File / Edit / View / Help | Tab strip. Click a tab for a one-row command strip over the canvas. Click the canvas to hide it |
| Help > Preferences | Searchable settings: startup monitor, full screen, no-pen warning, finger drawing, pen button, snippet format order, laser trail, toolbar, update checks |
| Help > Preferences | Searchable settings: startup monitor, full screen, no-pen warning, finger drawing, mouse drawing, pen button, snippet format order, laser trail, toolbar, update checks |
| View > Bring to front / Send to back | Reorder the selected image, text, or LiveView (and its linked strokes) |
| Help > About | Version, channel, license, the product site, and a download link when a newer release is known |
| View > LiveView | Capture, freeze, disconnect, or reconnect a window or display |
Expand All @@ -212,6 +214,8 @@ Use **Copy settings** after finding a useful combination so the exact values can

With the mouse, selection is automatic: click a container to move it, or drag the circular bottom-right handle to resize it while preserving its aspect ratio. Double-click a container to center it and fit it to the canvas. Releasing the mouse returns to the previously selected drawing tool.

**Help → Preferences → Mouse drawing** changes what the left button means, and it defaults to on when Windows reports neither a pen tablet nor a touchscreen. With it on the left button uses the selected tool, the tool stays selected rather than being handed back, and Eraser and Pan join the toolbar as they do for finger drawing. Everything above then moves to Ctrl: Ctrl and the left button select, move, and resize a container and return to the previous drawing tool, and Ctrl with a double-click centers and fits one. Two plain clicks with an ink tool are two strokes, which is why framing moves out of the way. Shift still constrains a stroke to horizontal or vertical, and Alt+L is still the laser. A mouse reports no pressure, so ink is drawn at an even width; Calligraphy still varies, because its width comes from speed. The pen path is untouched, so Mouse drawing can be left on beside a pen.

Imported images, LiveViews, and text objects act as containers. A completed stroke is linked when it touches exactly one container, including crossing its edge; a stroke touching multiple containers remains independent. Moving or resizing a container transforms its linked strokes with it. **View → Bring to front** and **View → Send to back** reorder the selected container and those linked strokes. Deleting a container also deletes all of its linked strokes. Undo/redo treats each complete container operation as one action.

Paste plain text to create a selected text container in display mode. **Help → Preferences** has Snippet format order: paste tries those languages from top to bottom and uses the first that accepts the text. Plain text always accepts, so leaving it first keeps every paste as plain text. Recognized extensions (`.dax`, `.sql`, `.txt`) keep their language; other dropped text files use the same order. Choose **Plain text**, **DAX**, or **SQL Server** from the title-bar chip afterward. Press **F6** to format DAX or SQL on the selected container without entering edit. Press **F2** to edit the body; the same list is in the title bar while editing. In F2, **F6** formats in place; **Ctrl+Enter** commits that edit (including the format) and returns to display. **Escape** restores the previous text, language, and dimensions. Text reflows while its edit-mode resize grip changes the width, and the height grows automatically when necessary. Double-click still centers and fits the container. Syntax highlighting applies in both edit and display modes. A language-aware title identifies a defined DAX or SQL object when possible. SQL Server mode targets SQL Server 2025 T-SQL, preserves `GO` batch separators, and leaves invalid scripts unchanged. In display mode, resizing preserves the aspect ratio and scales the complete text visual without reflowing it.
Expand Down Expand Up @@ -275,3 +279,20 @@ Test these on the target device before tuning stroke algorithms:
5. Draw near all display edges and across the Windows display-scaling boundary, if multiple monitors use different scaling.

Wacom driver settings can remap the barrel and eraser controls, so validate both Windows Ink mode and the intended application profile.

## Mouse drawing validation

Mouse drawing cannot be covered by the smoke tests, which are UI-free. Walk this after
touching any mouse handler:

1. On a machine with no pen and no touchscreen, confirm the default turns it on and the
startup notice describes it.
2. Draw with Pen, Highlighter, and Calligraphy. Only Calligraphy should vary its width.
3. Click without moving, and confirm a dot is drawn rather than nothing.
4. Press and release Shift mid-stroke and confirm the constraint starts and ends there.
5. Erase, and confirm the dashed square matches what is removed.
6. Ctrl-drag a container, and confirm the drawing tool comes back on release.
7. Two quick clicks with the Pen, and confirm the board does not reframe.
8. Select the Eraser, pan with the right button, and confirm the Eraser is still selected.
9. On a pen machine with Mouse drawing **On**, draw with the pen and confirm nothing about
it changed. This is the regression that matters.
7 changes: 5 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,17 @@ The delivery chain works end to end: a merge to `main` builds, signs, and publis
pre-release to GitHub Releases, and one approval promotes that same build to a release.
<https://whiteboard.sqlbi.com> reads its download links from the release manifest
deployed beside it and needs no edit per release. The current product version is `VersionPrefix` in `Directory.Build.props`
(1.1.5). Identity version for the Store package is `VersionPrefix.0` (`1.1.5.0`).
(1.2.0). Identity version for the Store package is `VersionPrefix.0` (`1.2.0.0`).

Declaring that number is decision 20 in [docs/decisions.md](docs/decisions.md). What 1.0
was waiting on shipped during 0.9.x: Preferences, `.wimport`, Explorer and VS Code
previews, the public documentation site, and Finger drawing (default when no pen is
detected).

No numbered work remains. The video teaser is recorded and served from the landing page
No numbered work remains. 1.2.0 answered
[discussion 78](https://github.com/sql-bi/SQLBI-Whiteboard/discussions/78) with Mouse
drawing — decision 23, with the alternatives kept in
[docs/mouse-mode.md](docs/mouse-mode.md). The video teaser is recorded and served from the landing page
itself as `site/teaser-av1.mp4` / `site/teaser-h264.mp4` — the Vimeo-embed plan was
reversed, see decision 19 in [docs/decisions.md](docs/decisions.md); the production
script and staging assets are in `docs/teaser/`. The release manifests and the Store
Expand Down
55 changes: 55 additions & 0 deletions docs/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,61 @@ was several hundred lines and never converged.

---

## 23. A mouse gets the tools, not the gestures

**Implemented** in 1.2.0. The proposal it came from, with the alternatives that were
weighed and rejected, is [mouse-mode.md](mouse-mode.md).

The application was built so that no input device imitates another: the pen inks, touch
navigates, and the mouse moves things. That was not a gap. It is why the pen path is as
direct as it is, and it stays the rule for the pen.

What it cost was people who downloaded a whiteboard onto a laptop with no pen and no
touchscreen and found the toolbar did nothing. 1.1 conceded the point at startup and
collected votes in
[discussion 78](https://github.com/sql-bi/SQLBI-Whiteboard/discussions/78). So there is now
a **Mouse drawing** setting, on by default when Windows reports neither a stylus nor a
touchscreen, under which the left button does what the selected tool does.

One sentence governs it, and any later change to it: **a mouse gets the tools, not the
gestures.** Everything on the toolbar becomes reachable with a mouse. Nothing that exists
because of what a hand and a pen can do — pressure, hover, the reverse end, the barrel
button, palm rejection, two fingers — is simulated with modifiers and timers. Where a
gesture has no honest mouse equivalent the mouse does without it, and the documentation
says so. That is what stops mouse support becoming a tax on every future input feature.

Four consequences are worth recording, because each was a choice with a live alternative:

- **`Ctrl` is the old mouse.** Letting the left button draw takes away the one genuinely
good thing about mouse input — moving an image without leaving the Pen — so it is handed
straight back on a modifier rather than lost. Giving it to the right button instead was
rejected: right-drag pan is the only pan that needs no keyboard.
- **Framing moves behind `Ctrl` too, but only where it has to.** Double-click is tested
before the tool branch, so two quick dabs with the Pen would otherwise reframe the board.
With Select or Pan active, and whenever Mouse drawing is off, a plain double-click still
frames.
- **Pressure is the constant the straight-line constraint already uses.** Deriving it from
speed was rejected as a default: the width would vary for a reason the hand cannot feel,
and a wobble nobody asked for reads as a bug. Calligraphy is unaffected, because its width
comes from speed rather than from pressure, and the highlighter already ignores pressure.
- **The tool becomes sticky.** Nothing is handed back after a mouse gesture that was not a
`Ctrl` borrow — including a right-button pan, which would otherwise take someone who chose
the Eraser and quietly leave them holding a pen.

The reason this was a few hundred lines rather than a subsystem is decision 22. Because pen
ink is collected from raw points rather than from the InkCanvas, `AppendInkPoint` takes a
screen point and a pressure and has no idea what device it is serving; the mouse calls it,
and gets the straight-line constraint and the calligraphy dynamics without a second
implementation. The erase, pan and container paths already existed on the mouse handlers —
`PointerAction.Erase` was written and unreachable.

Not one line of the pen path changed, and that was the condition for building it at all.
Every mouse handler already returned early on a non-null `StylusDevice`, so pen-promoted
mouse events never enter the mouse path. Mouse drawing can therefore be left on beside a
pen, which is why **On** is offered and not only the automatic default.

---

## Open questions

- arm64 is not built; add it if Surface devices matter for a pen application.
Expand Down
Loading