Commit Graph
37 Commits
Author SHA1 Message Date
Brandon Thomas 5ed2f808e3 Merge PR #539 from NikitkaRa: Draw: Ink to Shape converts pen strokes into shapes
# Conflicts:
#	crates/engine/src/cmd/shape.rs
#	crates/engine/src/lib.rs
#	crates/ui-egui/src/ribbon.rs
2026-10-14 14:41:19 -04:00
Brandon Thomas 79b3e3693f Merge PR #571 from NikitkaRa: UI: preview slide animations on the editor canvas
# Conflicts:
#	crates/ui-egui/src/canvas.rs
#	crates/ui-egui/src/control.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/show.rs
2026-10-14 14:40:51 -04:00
Brandon Thomas f6661ed15e Merge PR #563 from NikitkaRa: UI: customizable Quick Access Toolbar
# Conflicts:
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/ribbon.rs
2026-10-14 14:16:22 -04:00
Brandon Thomas b3c9cc099c Merge the PPTX writer, notes/handout master, PDF and slide-show PRs integrated on land-r3 (#518 #531 #535 #533 #572 #573 #577 #580 #583 #592 #685 #528 #483 #490 #441 #671 #679 #649 #656 #660 #664 #224)
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/model/src/lib.rs
#	crates/pptx/src/write/mod.rs
#	crates/render/src/lib.rs
#	crates/ui-egui/src/canvas.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/thumbs.rs
2026-10-14 13:56:41 -04:00
Brandon ThomasandClaude Opus 5.5 f9c1000e35 Fix up merged PRs: rustfmt; drop doc rows the union merge left twice
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:51:53 -04:00
Brandon Thomas ee991563c9 Merge PR #441 from NikitkaRa: Show: a laser pointer that leaves no ink
# Conflicts:
#	crates/ui-egui/src/show.rs
2026-10-14 13:45:58 -04:00
Brandon Thomas 0ed74b684a Merge the SmartArt and dialog PRs integrated on land-r1 (#596 #601 #606 #610 #613 #617 #621 #623 #627 #634 #557 #689 #668)
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/dialogs.rs
2026-10-14 13:44:43 -04:00
Brandon ThomasandClaude Opus 5.5 0376c0b0e1 Fix up merged PRs: one parity summary, one dialogs gap entry, no duplicated architecture rows
Recomputed docs/parity-checklist.md's summary with cargo xtask parity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:41:30 -04:00
Brandon Thomas f52bcfa1c8 Merge PR #530 from NikitkaRa: Design: Browse for Themes from a .thmx, .pptx or .potx file
# Conflicts:
#	crates/ui-egui/src/lib.rs
2026-10-14 13:36:45 -04:00
Brandon Thomas d00b01b5a1 Merge PR #540 from NikitkaRa: Table: borders, cell margins and cell text alignment
# Conflicts:
#	crates/engine/src/cmd/table.rs
#	crates/engine/src/tests.rs
2026-10-14 13:36:34 -04:00
Brandon Thomas 84d60009be Merge PR #596 from NikitkaRa: SmartArt: Text Pane, add and remove shapes, promote and demote
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/panes.rs
2026-10-14 13:25:39 -04:00
Brandon Thomas 534925bdf1 Merge PR #547 from NikitkaRa: Pictures: Recolor gallery and Set Transparent Color
# Conflicts:
#	crates/engine/src/cmd/mod.rs
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/ribbon.rs
2026-10-14 13:23:51 -04:00
Brandon Thomas d0fb793954 Merge PR #545 from NikitkaRa: Pictures: Picture Styles gallery and Picture Border
# Conflicts:
#	crates/engine/src/cmd/mod.rs
#	crates/engine/src/tests.rs
2026-10-14 13:23:36 -04:00
Brandon Thomas 058890ed87 Merge PR #518 from NikitkaRa: Pictures: Artistic Effects — apply, change, remove and keep in PPTX
# Conflicts:
#	crates/engine/src/cmd/mod.rs
#	crates/engine/src/tests.rs
#	crates/pptx/src/write/dml.rs
2026-10-14 13:23:07 -04:00
Brandon Thomas 32a2d9e6bd Merge PR #560 from NikitkaRa: UI: View › New Window opens a second window
# Conflicts:
#	crates/ui-egui/src/lib.rs
2026-10-14 13:21:19 -04:00
Brandon Thomas 2bd01910dc Merge PR #558 from NikitkaRa: Edit: Paste Special (destination theme, keep source, picture, text only)
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 13:08:54 -04:00
Brandon Thomas 11e36ed3ac Merge PR #516 from NikitkaRa: Transitions: built-in sounds, Stop Previous Sound and Loop Until Next 2026-10-14 13:08:48 -04:00
Brandon Thomas 02b502b69d Merge PR #514 from NikitkaRa: Shapes: Edit Points — drag, add and delete a shape's vertices
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 13:08:48 -04:00
Nikita RakitinandCursor 6e40335424 SmartArt: Text Pane, add and remove shapes, promote and demote
A SmartArt group now keeps its outline (Shape.diagram: layout + nodes with
levels) and its shapes are regenerated from it inside the group's child
rectangle. New commands: smartArt.nodes, setNodes, addNode (after, before,
above, below), removeNode, promote, demote and layout. Sub-points become
bullets in their parent's shape; the hierarchy layout is a real tree with
connector lines. Text typed into a diagram shape is read back first.

UI: a SmartArt Design contextual tab and a Text Pane (Enter adds a line,
Tab/Shift+Tab demote/promote, Backspace on an empty line removes it).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 01:22:22 +03:00
Nikita RakitinandCursor b89c9cafd7 UI: preview slide animations on the editor canvas
Animations › Preview and Animation Pane › Play All play the current
slide on the canvas instead of opening the slide show. Escape or a
click stops playback. Transitions › Preview still opens the show.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 00:21:42 +03:00
Nikita RakitinandCursor 88bea399e5 UI: customizable Quick Access Toolbar
The title bar's quick access buttons become a list the user controls:
a Customize menu with PowerPoint's common commands and Reset, right-click
any ribbon button to add it, right-click a toolbar button to remove it.
The toolbar is saved with the UI state; app.qat scripts it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 00:04:51 +03:00
Nikita RakitinandCursor f0be1aa767 Edit: Paste Special (destination theme, keep source, picture, text only)
Adds edit.pasteSpecial. Keep Source Formatting bakes the copied shapes'
theme colours and theme fonts into fixed values (captured at copy time),
Picture draws the copied shapes into one PNG picture, and Keep Text Only
pastes plain text. Ctrl+Alt+V, Edit › Paste Special… and the Paste menu
open a Paste Special dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:55:45 +03:00
Nikita RakitinandCursor 4dbea3256f UI: View › New Window opens a second window
The editor had one window, so looking at another slide meant leaving
the one you were editing. View › New Window opens one more window on
the same presentation. That window keeps its own slide and shows edits
from the first window. Closing it leaves the presentation open.
Arrange All is not included.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:52:40 +03:00
Nikita RakitinandCursor 36acf26f1d Pictures: Recolor gallery and Set Transparent Color
The model, renderer and PPTX already handled duotone, black-and-white,
grayscale and a transparent colour, but the Color menu offered only
saturation and grayscale. picture.recolor applies PowerPoint's Recolor
presets (No Recolor, Grayscale, Sepia, Washout, Black and White 25/50/75%,
and dark and light variations of Text 2 and the six accents) replacing
the previous recolour; picture.recolors lists them. picture.transparentColor
makes a colour transparent or clears it. The Color menu shows a Recolor
gallery of preview ramps and a Set Transparent Color colour picker.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:30:59 +03:00
Nikita RakitinandCursor c4c56a6a8b Pictures: Picture Styles gallery and Picture Border
Picture Styles was a menu of six names, each running two or three
separate commands that left the previous style's effects behind. New
picture.style applies one of PowerPoint's 24 picture styles (frames,
shadows, soft edges, reflections, bevels, rounded, snipped and oval
shapes, a rotated frame) as one step that replaces the whole previous
look; picture.styles lists them and "none" clears the style. Picture
Format shows them as a thumbnail gallery, and a Picture Border split
button sets outline colour, weight and dashes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:27:32 +03:00
Nikita RakitinandCursor f3ca5a63b9 Table: borders, cell margins and cell text alignment
The model, renderer and PPTX already carried cell borders, diagonals,
margins and vertical alignment, but nothing set them. New commands:
table.borders (all, outside, inside, inside horizontal/vertical, each
side, diagonals or none, with pen colour, width and dash; the facing
side of a neighbouring cell follows, as in PowerPoint), table.cellMargins
(Normal, None, Narrow, Wide or per side) and table.cellAlign. They act on
the given cells, the selected range, the cell with the caret, or the
whole table. Table Design gains a Borders menu with pen weight, style and
colour; Table Layout's Top/Center/Bottom now align cell text (they set
the text body's anchor, which cells override) and gain Cell Margins.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:17:51 +03:00
Nikita RakitinandCursor 4658042de8 Draw: Ink to Shape converts pen strokes into shapes
Draw > Ink to Shape recognises each pen stroke on the slide's ink layer
as a line, rectangle, oval or isosceles triangle (apex up or down) and
replaces it with that preset shape, outlined in the stroke's colour and
width with no fill. Strokes it can't recognise, and highlighter strokes,
stay ink. The ink shape is removed once it has no strokes left. The
whole conversion is one undo step.

The recogniser (engine/src/inkshape.rs) is pure geometry: ends meeting,
area covered within the bounding box, and spread from the fitted
ellipse. Ribbon big buttons now carry an accessibility label.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:16:49 +03:00
Nikita RakitinandCursor 30c2fe4b6d Design: Browse for Themes from a .thmx, .pptx or .potx file
deckcraft_pptx::import_theme reads the theme of a .thmx (its main document is
a theme part) or of a presentation's first master, with the media its format
scheme uses. design.browseTheme {path | name, data} applies it to the current
master as one undo step, giving the theme's pictures ids of this deck.

Design tab: Browse for Themes… next to the theme gallery and in the Slide
Master Themes menu; the desktop picker offers Office Theme (.thmx) and
presentations. Ribbon small buttons expose their label to accessibility (same
change as #512). Parity row Browse themes M → D.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:04:41 +03:00
Nikita RakitinandCursor 9af5a7d17b Pictures: Artistic Effects — apply, change, remove and keep in PPTX
New picture.artisticEffect applies one of 7 effects (blur, pencil
grayscale, line drawing, film grain, cutout, glow edges, photocopy) to a
picture's pixels, as PowerPoint does: the processed PNG becomes the
picture and the original is kept on PictureFill::artistic, so another
effect starts from the original and `none` (or Reset Picture) restores
it. Change Picture drops the effect.

PPTX: written and read as PowerPoint does, the blip being the processed
picture with the original and the effect name in
a:extLst/a14:imgProps/a14:imgLayer, so a deck from PowerPoint keeps its
effect, original and all, when saved again.

Picture Format gets an Artistic Effects menu.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:35:55 +03:00
Nikita RakitinandCursor 69a4424e75 Transitions: built-in sounds, Stop Previous Sound and Loop Until Next
Follow-up to the transition sound picker. The Sound box now lists
[Stop Previous Sound] and six built-in sounds (Chime, Click, Camera,
Whoosh, Drum Roll, Laser) that are synthesised as small WAVs when
chosen, so no sound files ship with the app; the same built-in sound is
embedded once however many slides use it. Loop Until Next Sound repeats
a sound in the show until another slide's sound or Stop Previous Sound.
PPTX reads and writes p:stSnd loop="1" and p:endSnd, keeps the sound's
file name in p:snd/@name, and setting a slide's transition to None no
longer drops its sound.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:30:19 +03:00
Nikita RakitinandCursor 733522d528 Shapes: Edit Points — drag, add and delete a shape's vertices
New cmd::points with shape.editPoints (enter/leave; a preset becomes a
freeform in shape-local points), shape.points (vertices in slide points),
shape.movePoint, shape.addPoint (splits a line, quadratic or cubic
segment) and shape.deletePoint. After each change the box is fitted
around the outline and kept in place on the slide, rotation and flips
included. Closing edges are made explicit so they take points too.

On the canvas the edited shape shows its vertices as handles: drag one
(one undo step per drag), Cmd/Ctrl-click a vertex to delete it or the
outline to add one; Escape, Enter or a click elsewhere leaves Edit
Points. Shape Format ▸ Edit Shape gets an Edit Points item.

Not yet: smooth/straight/corner point types and Bézier control handles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:22:57 +03:00
Nikita RakitinandCursor 460a2712e4 Transitions: choose a transition sound and play it in the show
Transition sounds were read from and written to .pptx but could not be
set and never played. Transitions › Timing gets a Sound box ([No Sound]
or Other Sound…), backed by a new transition.sound command that embeds
an audio file on the selected slides (or removes it with none). In the
slide show the sound plays as its slide comes in and, as in PowerPoint,
keeps playing into the next slide unless that slide has a sound of its
own. Built-in sounds, Stop Previous Sound and Loop Until Next Sound are
still missing; the parity docs say so.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:07:06 +03:00
NikitaandCursor 0b35b74c4d Show: a laser pointer that leaves no ink
Cmd/Ctrl+L and the on-screen button draw the show's laser colour at the pointer. The pen and the laser are not on together, and a click does not advance the slide while the laser is up.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 18:35:32 +03:00
Brandon ThomasandClaude Opus 5.5 e614f0d6d6 Docs: record the wild shape rendering fixes and partial 3-D rendering
Progress log entry for the wild-case rendering fixes; "Bevel and 3-D
rotation" moves from missing to partial (approximate bevels, cameras and
face lighting; no extrusion, rigs or 3-D pane); gap estimate narrowed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 1660982e58 File tab: PowerPoint's File view (Home, New, Open, Info, Save As, Print, Export, Close) (#76) (#344)
* Engine: file.info and PowerPoint-style print slide ranges (#76)

file.info reports what File › Info shows (name, path, format, unsaved
changes, slide and hidden-slide counts, sections, size on disk,
properties). file.export's PDF `slides` also takes the range typed in
PowerPoint's Print page ("1-3, 5", 1-based); bad or out-of-range text is
an error instead of a silent full export.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* UI: the File tab (Backstage) like PowerPoint's (#76)

File (first ribbon tab) or Alt+F opens a full-window view in place of the
ribbon, slides and status bar: a side menu (Back, Home, New, Open, Info,
Save, Save As, Print, Export, Close; Account and Options at the bottom)
and the chosen page. Esc or Back returns; Up/Down walk the side menu and
show each page as it gets the focus; Enter runs Save/Close/Options.
Laid out after PowerPoint for Windows as observed: 160-pt menu a step
darker than the page, outline icons, current page in the accent colour.

The start screen is now File › Home (as in PowerPoint), with only Home,
New and Open at the top and no Back. Pages call existing commands and
file helpers: file.new {theme} and the sample deck (Home, New); recent
files with search, Browse and Recover Unsaved (Open); file.info and
file.properties, Accessibility Checker, Revert (Info); file.save /
file.saveAs / file.export by type (Save, Save As); a PDF with the Print
page's slides, layout (full page, notes, handouts 1-9), hidden slides and
frames, opened in the system viewer or downloaded on the web, with a
page preview (Print, Ctrl+P); Create PDF, Create Handouts and Change File
Type (Export); appearance and About (Account); Preferences (Options).
Share (cloud) is left out.

Close and Ctrl+W now ask Save / Don't Save / Cancel about unsaved
changes instead of closing at once. The Export dialog shares
SlideApp::export_as with the Export page. New UI commands: app.backstage
{page}, app.closePresentation, app.print; ui.inspect reports the page.
New icons drawn in code: back, save as, account, recent, new file, open
folder.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Docs: File tab (Backstage) in ui-parity, gaps, checklist and progress log (#76)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 23:56:02 -04:00
Brandon ThomasandClaude Opus 5.5 dedb20890b Text: WordArt transforms (prstTxWarp) draw, and their adjusts round-trip (#312)
* Text warps: draw WordArt prstTxWarp presets, round-trip their adjusts

All 40 DrawingML text-warp presets now render instead of drawing flat text.
A warp is a list of bands over the shape's text rectangle (insets ignored):
fill bands stretch the ink of their lines between a top and a bottom guide
(positions by arc length, one horizontal scale for the whole text), follow
bands (arch, circle, button) set lines at natural size along an ellipse arc,
lines stacking outwards on parallel curves, with no wrapping. Lines are
shared over multi-band presets in order (ceil(n/k) per band).

The guide curves were fitted to PowerPoint renders of synthetic decks of
"I" bars (black-box observation, defaults and changed adjusts, 1-3 lines);
most presets match within about a point on a 420 x 200 pt box.

- geom: warp module (guides, presets, band mapping) with unit tests
- render: glyph outlines and underlines flattened, subdivided and mapped
- text: follow warps lay out without wrapping
- model/pptx: BodyProps.warp_adj read from and written to prstTxWarp/avLst

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Text warps: bands with fewer lines keep the fuller band's text height

Multi-band fill warps (Deflate-Inflate, Button Pour) map a box as tall as
the tallest band's ink onto every band, centred on the band's own ink, as
PowerPoint does: a band holding one line next to a band of two keeps the
line at the same size instead of stretching it over the whole band.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 18:12:58 -04:00
Brandon ThomasandClaude Opus 5.5 f44857624e Progress docs: target-app parity, gaps, alpha gate, readiness by audience (#89)
Progress docs per craftrules standards/progress-docs.md: target-app parity, gaps, roadmap with alpha gate, readiness by audience (full / mainstream / essentials) with Opus 5.5 hours, and feature, format, hardware, UI and localization parity docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:09:21 -04:00