Skip to content

Draw slides on the board as frames, which Export takes as they are - #96

Open
marcosqlbi wants to merge 2 commits into
feature/export-e4-vector-pdffrom
feature/export-e5-frames
Open

Draw slides on the board as frames, which Export takes as they are#96
marcosqlbi wants to merge 2 commits into
feature/export-e4-vector-pdffrom
feature/export-e5-frames

Conversation

@marcosqlbi

Copy link
Copy Markdown
Collaborator

Why

Phase E5 of docs/export.md, on top of #95 (base is the E4 branch; retarget to main once it merges). The automatic cut serves a board drawn without a deck in mind. Someone preparing a board for a deck wants to say where the slides are, and on a whiteboard the way to say it is to draw a rectangle. Decision 27 is the summary.

What it does

  • View → Frame (mnemonic A) adds a frame the size of the visible board, titled "Slide n", and selects it. Drag its edge to move it, the handle to resize it (aspect kept, so it stays slide-shaped), F2 to rename it, Delete to remove it, Bring to front and Send to back to reorder it, which under Drawing order is also the slide order.
  • A frame is selected by its edge or its title tab, never by its inside, so everything in it stays reachable to the pen and the mouse. Moving a frame moves nothing inside it: it is a label over content, read at export time.
  • A frame is not a container. It links no strokes and takes no part in the single-container test, so a frame drawn around a picture does not stop ink from linking to the picture.
  • Frames win in the partitioner: whatever sits inside one is that slide, with the frame's rectangle and title; frames come first; the rest of the board is cut as before. Frames appear in no export picture, no overview, and no preview.png.
  • 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.

Where the code is

  • Core/Model: FrameBoardObject with its edge-and-tab hit test; BoardDocument.HitTestTopContainer takes the zoom and reaches frames by their edge; BoardArchive writes and reads frame, choosing the version per board.
  • Core/Export/BoardPartitioner: frames first.
  • SQLBI.Whiteboard: BoardSurface draws frames over everything when asked and the rasterizer and preview renderer ask it not to; MainWindow gains the command, the rename, and frame cases in the gesture code; FrameTitleWindow is the rename dialog.
  • Smoke tests: archive round trip and version choice, partition with a frame, hit testing.

The smaller calls are under E5 in docs/export-decisions.md.

🤖 Generated with Claude Code

marcosqlbi and others added 2 commits September 3, 2026 03:14
View > Frame adds a frame the size of the screen: a dashed rectangle with
a title tab, selected by its edge or its tab and never by its inside, so
everything in it stays reachable. It moves, resizes, renames with F2,
reorders, and deletes like anything else selectable, and moves nothing
inside it: a frame is a label over content, read at export time.

A frame is not a container. It links no strokes and takes no part in
the single-container test, so a frame around a picture does not stop ink
from linking to the picture. In the partitioner frames win: whatever
sits inside one is that slide, frames come first, and the rest of the
board is cut automatically. Frames appear in no export and no preview.

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 opens in every
release since.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant