diff --git a/README.md b/README.md index 9b0538f..1e515ee 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ How the project is developed and shipped is documented separately: - Undo and redo for strokes, erasing, containers, text edits, and transformations - Versioned ZIP-based `.wboard` documents with an embedded `preview.png`. Explorer shows that picture as the file thumbnail in the released install. The VS Code extension in `vscode/sqlbi-whiteboard` opens the same picture instead of the ZIP. - Markdown `.wimport` recipes that build image and text containers from headings -- **File → Export** to PowerPoint or PDF: the board is cut into areas where it is empty, one slide or page per area, with an overview first. A deck carries the text containers in the speaker notes, or, as Editable slides, puts images and text containers on the slide as objects with the ink over them; a PDF has a bookmark per page, can put the whole board on one page to zoom into, and as Vector pages carries the ink as paths and the text as selectable text. The dialog shows the areas numbered on the board and updates as the settings change. [docs/export.md](docs/export.md) explains how areas are chosen +- **File → Export** to PowerPoint or PDF: the board is cut into areas where it is empty, one slide or page per area, with an overview first. A deck carries the text containers in the speaker notes, or, as Editable slides, puts images and text containers on the slide as objects with the ink over them; a PDF has a bookmark per page, can put the whole board on one page to zoom into, and as Vector pages carries the ink as paths and the text as selectable text. The dialog shows the areas numbered on the board and updates as the settings change. **View → Frame** draws a slide on the board by hand: whatever sits inside a frame is that slide, and the rest of the board is cut automatically. [docs/export.md](docs/export.md) explains how areas are chosen - 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, mouse drawing, the pen button, snippet format order, laser trail timing and weight, toolbar position and layout, keeping the Eraser on the toolbar for a pen that has no reverse end, and (except Store installs) a daily new-version check @@ -196,7 +196,8 @@ Use **Copy settings** after finding a useful combination so the exact values can | Ctrl+Z / Ctrl+Y | Undo / redo | | Ctrl+C | Copy the selection. Copying a LiveView copies its last frame as a bitmap | | Ctrl+V | Paste prefers an image (including a file on the clipboard) over text. Otherwise create a text container from plain text | -| F2 | Edit the selected text container | +| F2 | Edit the selected text container, or rename the selected frame | +| View > Frame | Add a frame the size of the screen: a slide drawn on the board, selected by its edge or its tab, which Export takes as it is | | Language chip | Choose Plain text, DAX, or SQL Server on a selected text container | | F6 | Format DAX or SQL on the selected text container. In F2, formats in place | | Ctrl+Enter | Commit the F2 edit, including an F6 format done in that session, and return to display mode | diff --git a/docs/decisions.md b/docs/decisions.md index f55ea9c..7f4878d 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -604,6 +604,30 @@ later, because the driver, not the application, asks for the file name. --- +## 27. A frame is a slide drawn on the board, and it is not a container + +**Implemented.** Phase E5 of [export.md](export.md); the smaller calls are under E5 in +[export-decisions.md](export-decisions.md). + +The automatic cut (decision 26) serves a board that was drawn without a deck in mind. +Someone preparing a board for a deck wants to say where the slides are, and the way to +say it on a whiteboard is to draw a rectangle. **View → Frame** adds one the size of the +screen; it can be moved, resized, renamed, and reordered like anything else selectable, +and Export takes it as it is: whatever sits inside a frame is that slide, frames come +first, and the rest of the board is cut automatically. + +A frame is deliberately not a container. The one rule the board has about containers is +that a stroke touching exactly one of them is linked to it, and a frame around a picture +would break that rule for every stroke on the picture. So a frame links nothing, is +selected only by its edge or its title tab, and moving it moves nothing inside it: it is +a label over content, read at export time. + +Frames are the first object to change the file format since 1.0, and the change is kept +as small as it can be: a board is written as version 6 only when it holds a frame, so a +board without one still opens in every release since format 5. + +--- + ## Open questions - arm64 is not built; add it if Surface devices matter for a pen application. diff --git a/docs/export-decisions.md b/docs/export-decisions.md index 236ae36..448f6b2 100644 --- a/docs/export-decisions.md +++ b/docs/export-decisions.md @@ -123,3 +123,36 @@ which phase made it and why. a future language service names falls back to Segoe UI until it is added to the resolver. - **The overview page stays a picture** in both modes; it is a map, not content. + +## E5 — Frames + +- **A frame is not a container.** It implements no container interface, so strokes never + link to it and it never takes part in the single-container test: a frame drawn around + a picture does not stop ink from linking to the picture. Deleting a frame deletes only + the frame. +- **A frame is selected by its edge or its title tab, never by its inside**, so + everything inside it stays reachable to the pen and the mouse. The band is 8 screen + pixels either side of the edge and the tab 160 by 22 screen pixels at the top-left + corner, both divided by the zoom so they feel the same at any magnification. +- **View → Frame** (mnemonic A) adds a frame the size of the visible board, inset by 8% + so its edge is under the pen and not under the window's edge, titled "Slide n", and + selects it. F2 on a selected frame renames it through a small dialog. There is no + shortcut for adding one; the command strip is reachable with Alt+V. +- **Moving or resizing a frame moves nothing inside it.** A frame is a label over + content, and the export reads what it covers at export time. Resizing keeps the + aspect, as the resize gesture does for everything else, which for a frame created at + the screen's shape means it stays slide-shaped. +- **Frames are drawn over everything on screen** as a dashed outline with a filled tab, + and left out of every export picture, the overview, and `preview.png`. +- **Frames win in the partitioner.** Every unit whose center lies inside a frame belongs + to that frame, frames come first (creation order under Drawing order, top-left to + bottom-right under Reading order), the frame's own rectangle is the area, its title is + the slide title when it has one, and whatever is left is partitioned as before. A frame + is never an object of an area, so it never appears in an export. +- **Bring to front and Send to back work on a frame**, and since drawing order sorts + frames by z-index, they are also how the slide order is changed. +- **The archive version moves to 6 only for a board that holds a frame.** A board + without one is still written as version 5 and keeps opening in every release since + format 5; a board with frames asks for this release. The frame's title travels in the + DTO's text title field rather than a new one. +- **A frame is not copied** by Ctrl+C: there is nothing on the clipboard a frame could be. diff --git a/docs/export.md b/docs/export.md index 5d802c2..70f132b 100644 --- a/docs/export.md +++ b/docs/export.md @@ -1,11 +1,13 @@ # Export: PowerPoint, PDF, and Replay -**Proposed. Nothing below is implemented.** This document is the plan for three ways of -getting a board out of the application: a PowerPoint deck, a PDF, and a replay of the -session. The first two share almost everything and are planned to be built; the third is -sketched at the level of modules and file format so that it can be judged and scheduled, -not started. When any part is accepted it becomes a numbered entry in -[decisions.md](decisions.md), and this document is kept for the alternatives. +**PowerPoint and PDF are implemented (phases E1 to E5); Replay is not.** This document is +the plan for three ways of getting a board out of the application: a PowerPoint deck, a +PDF, and a replay of the session. The first two are built as described here, with the +recommendations below taken as decisions: decisions 26 and 27 in +[decisions.md](decisions.md) are the summary, and [export-decisions.md](export-decisions.md) +lists every smaller call made while implementing. The third is sketched at the level of +modules and file format so that it can be judged and scheduled, not started. This document +is kept for the reasoning and the alternatives. Background: [README.md](../README.md) for what the application does, and [decisions.md](decisions.md) for the constraints a new dependency has to meet — decision 21 diff --git a/site/guide.html b/site/guide.html index 7640485..f4dec57 100644 --- a/site/guide.html +++ b/site/guide.html @@ -691,6 +691,7 @@

Drawing with a mouse

Containers

Images, LiveViews, and text blocks are containers. With a mouse, click to move, drag the circular handle to resize while keeping aspect ratio — hold Ctrl too with Mouse drawing on. Releasing the mouse returns to the drawing tool you had. Imported images accept PNG, JPEG, BMP, GIF, and SVG, including clipboard paste and Explorer drag-and-drop. An SVG is kept as its markup and redrawn at every size, so enlarging one costs it nothing.

View → Bring to front and View → Send to back reorder the selected container and its linked strokes. Strokes cannot be reordered on their own.

+

View → Frame adds a frame the size of the screen: a slide drawn on the board. A frame is selected by its dashed edge or by its title tab, never by its inside, so everything in it stays reachable; drag it to move it, drag the handle to resize it, press F2 to rename it, and Delete removes the frame alone. Moving a frame moves nothing inside it: it is a label over content. Export takes frames as they are, first and in the order they were added, and cuts the rest of the board automatically. Frames never appear in an export or in a preview.

Text, SQL, and DAX

Paste prefers an image when the clipboard has one, including a file SnagIt or another capture tool left on the clipboard. Paste plain text to create a selected text container.

diff --git a/site/shortcuts.html b/site/shortcuts.html index 3e53f28..5716527 100644 --- a/site/shortcuts.html +++ b/site/shortcuts.html @@ -121,14 +121,14 @@