Commit Graph
374 Commits
Author SHA1 Message Date
Brandon Thomas 30d282d510 Merge PR #348 from marcoarnulfo: Open: a password-protected presentation says so, and open errors show on the start screen 2026-10-14 12:57:23 -04:00
Brandon Thomas fc74794394 Merge PR #306 from FabPei: fix: DeckCraft upstream issue #104 2026-10-14 12:57:23 -04:00
Brandon Thomas 1256ee1022 Merge PR #226 from xmaks82: Text: draw shrink-on-overflow at the scale the file was saved with 2026-10-14 12:57:21 -04:00
Brandon Thomas 2ae8fe1839 Merge PR #201 from justinjohn0306: Slide Size: choose Portrait or Landscape (#198) 2026-10-14 12:57:20 -04:00
Brandon Thomas c57d25e8d3 Merge PR #97 from mikl0s: Commands: an invalid shape id is an error instead of the selection 2026-10-14 12:57:19 -04:00
Brandon Thomas 6d57610489 Merge PR #96 from mikl0s: Slides: going to a slide that does not exist is an error 2026-10-14 12:57:19 -04:00
Brandon Thomas 7862974cad Merge PR #95 from mikl0s: Export: an unknown format is an error instead of a deckcraft file 2026-10-14 12:57:19 -04:00
Brandon Thomas 3635bdc8ba Merge PR #713 from nagasakimark: Slide show: click-triggered animations, per-slide state and hit testing 2026-10-14 12:53:34 -04:00
Brandon Thomas 9ab6a3a35c Merge PR #716 from switch87: CLI: convert and run refuse output formats DeckCraft can't write (#715) 2026-10-14 12:53:34 -04:00
Brandon Thomas e3a654d446 Merge PR #459 from MarekSpodBiedry: Slide: leading tabs in a new slide's body set the outline level (#370) 2026-10-14 12:53:33 -04:00
Brandon Thomas d184eb7927 Merge PR #455 from MarekSpodBiedry: Table: split and cell fill stay inside the table (#400) 2026-10-14 12:53:33 -04:00
Brandon Thomas 3046d49e56 Merge PR #454 from MarekSpodBiedry: Engine: a command that fails after editing puts the presentation back (#405) 2026-10-14 12:53:33 -04:00
Brandon Thomas 9b94481481 Merge PR #446 from MarekSpodBiedry: Engine: moving the selection to another text body settles the composition (#421) 2026-10-14 12:53:32 -04:00
Gert Pellin cf640c4b08 CLI: convert and run refuse output formats DeckCraft can't write (#715)
convert, run --save and run --export picked the format from the output
extension and fell back to native .deckcraft bytes for any extension
they didn't know, so out.odp, out.gif, out.svg and out.outline were
zips with exit status 0. They now fail before writing anything, with
the extension and the supported ones in the error.
2026-10-14 13:07:49 +02:00
Claude 887ea1e706 Slide show: click-triggered animations, per-slide state and hit testing
Make the slide show behave like PowerPoint for interactive decks.

- Hit testing resolves the topmost visible shape under the pointer.
  Non-interactive shapes block shapes beneath them; the hand cursor
  shows only over interactive shapes.
- Click-triggered animations (interactive sequences) play on shape
  click, repeat after their last step, and apply in click order so
  cycling "score ring" shapes work.
- Each slide keeps its own progress: returning to a slide through a
  link or Back restores hidden shapes and animation state.
- A shape with a link and an animation follows the link immediately;
  its animation clock only runs while the slide is shown and resumes
  with the remaining time on return.
- With advance-on-click off, background clicks still play animation
  steps but never change slide.
- A click on a playing step completes it at once.

Docs (gaps, animation and slide show parity, roadmap) are updated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 17:22:23 +09:00
Nikita RakitinandCursor 084e076c1d Undo: cap the history by memory as well as by steps
Undo kept up to 500 steps whatever their size. Steps share what an edit didn't touch, so most
are small, but a deck-wide edit (slide size, theme, find-and-replace style changes) keeps a copy
of every slide: 500 of those on a big deck could hold hundreds of copies. Each step's cost is now
estimated when it is pushed (the slides, masters and media it doesn't share with the document
after it), and the oldest steps are dropped while the total passes History::byte_limit
(UNDO_BYTE_BUDGET, 256 MiB, by default). The newest step always stays.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:41:16 +03:00
Nikita RakitinandCursor fa4b80ed65 UI: Slide Master Preserve and Title or Footers placeholders
Preserve the open master or layout, and turn its title and footer
placeholders on or off. Each change is one undo step, and a value that
is already set is not.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:40:11 +03:00
Nikita RakitinandCursor 5d9f47c81a Clipboard: rich text and pictures for other apps
Copy puts HTML on the pasteboard with the same plain words, so Pages keeps
bold, italic and underline, and a paste of that HTML keeps them here. A
shape with no text copies out as a picture.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:37:49 +03:00
Nikita RakitinandCursor 26d8bfdd3a UI: Design Effects applies a theme effect scheme
design.effects replaces the theme's format scheme (fills, lines and
effects) with DeckCraft, Soft, Crisp, Lift, Glow or Plain. Colours and
fonts stay. The scheme already in use is not an undo step.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:21:07 +03:00
Nikita RakitinandCursor 1e6292306a UI: Format Background picture fill sets transparency and tiling
A picture background can set transparency, tile, offset, scale,
alignment and mirror. A solid fill can set transparency. Apply to All
copies the current slide's background, including a picture, onto every
slide. Unchanged options are not an undo step.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:08:40 +03:00
Nikita RakitinandCursor 0fcaabc370 UI: Create New Theme Fonts dialog edits the theme in one step
Design › Fonts › Customize Fonts… opens Create New Theme Fonts.
Empty design.fonts params open the dialog; a name and heading or body
faces apply to the open master in one undo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:45:53 +03:00
Nikita Rakitin 8c0147cfa7 UI: Hyperlink dialog follows the selection
Insert Hyperlink opened on https:// with an empty ScreenTip, so OK
replaced a web address, email, slide link or tip. The dialog now
starts from the link it would edit, and leaves actions it cannot
edit in place.
2026-10-14 05:40:06 +03:00
Nikita RakitinandCursor d04df05249 Export: record slide resolution in PNG and JPEG pictures
A default export is 2 pixels per point. Without a resolution, Preview
treats those pixels as 72 dpi and the picture opens at twice the slide's
size. PNG pHYs and JPEG JFIF density now say scale times 72, so the
default is 144 dpi. Screenshots stay untagged.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:35:37 +03:00
Nikita RakitinandCursor 65e465a611 UI: Create New Theme Colors dialog edits the theme in one step
Design › Colors › Customize Colors… opens the dialog when design.colors
is called with no name and no colours. Save applies that scheme name and
the twelve theme colours together, as one undo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:24:47 +03:00
Nikita RakitinandCursor 3f82866aaf Export: image exports keep the whole slide; partial failures say what was written
The renderer caps a picture at MAX_SIDE (16,000 px) by clipping, so an image export whose
slide × scale passed that (4× of a 4032 pt slide) came out cropped. file.export and file.render
now lower the scale to fit (cmd::file::image_scale). When exporting every slide and one file
can't be written, the error says which slides already were, and slide numbers are checked
before anything is written.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:20:06 +03:00
Nikita Rakitin ef858b710f Merge Shapes: a text box merges as its letters; a picture keeps its place (#653) 2026-10-14 05:07:18 +03:00
Nikita Rakitin c2e770ab53 Show: Show Media Controls hides the playback bar
The Slide Show checkbox wrote nothing. show.setup now stores
showMediaControls, and the show draws the playback bar and GIF button
only while that setting is on.
2026-10-14 05:07:12 +03:00
Nikita RakitinandCursor a9e7747ea5 Canvas: a two-finger twist rotates the selection
macOS delivers a trackpad rotation as egui's Rotate event. While the
pointer is over the canvas, that twist turns the selected shapes, and
the whole gesture is one undo step. Pinch-zoom and scrolling are unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 04:55:33 +03:00
Nikita RakitinandCursor b6aa6ab4e4 UI: Date and Time dialog inserts a format in one step
Insert › Date & Time opens the format list instead of placing a date
immediately. With no format, update flag or language, insert.dateTime
opens the dialog and does not edit. OK applies one undo: a field when
Update automatically is on, or the shown text when it is off.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 04:41:01 +03:00
Nikita Rakitin f0647e1bd8 Review: previous and next comment
Walk every comment in the deck from the Review tab, and list every slide in the Comments pane.
2026-10-14 04:37:49 +03:00
Nikita Rakitin dfee72e742 Show: play a custom show 2026-10-14 04:19:36 +03:00
Nikita RakitinandCursor dbffbab59d UI: Edit Photo Album reflows the album in one step
Reopen the Photo Album dialog on the current album and replace those slides
in one undo, with black and white, rotation, brightness, contrast and a theme.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 04:16:00 +03:00
Nikita RakitinandCursor 4575d19ac7 UI: Photo Album dialog inserts pictures as slides
Insert › Images opens Photo Album. insert.photoAlbum adds the pictures
and text boxes as slides in the open presentation, one undo step, with
layouts, frames and captions. Omitting pictures opens the dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 03:43:28 +03:00
Nikita RakitinandCursor c583480010 Startup: survive damaged settings, font folders, recovery folders and small texture limits
- ui.json / prefs.json are read through a new settings module: regular files only, 4 MiB
  cap, parse errors logged, values sanitized (a saved zoom of 1e30 aborted start-up,
  1e4 panicked in egui); writes are atomic.
- The canvas and the control protocol clamp stray zooms; the status bar shows the zoom in use.
- The canvas texture is cut to the GPU's max texture side (zoom 400% on a 2048 limit panicked).
- The system font scan opens only regular files of sane size (a FIFO named *.ttf in ~/.fonts
  hung start-up), with depth and entry caps.
- AutoRecover skips non-regular entries and reopens at most 32 per start, newest first.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 03:27:57 +03:00
Nikita RakitinandCursor bd017b861d UI: Size and Position dialog sets geometry in one step
Shape Format › Size and the shape menu open a dialog for position,
size, rotation, scale and lock aspect ratio. One command writes them
together, so undo restores the whole change.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 03:20:35 +03:00
Nikita RakitinandCursor e4022e6702 UI: Paragraph dialog sets alignment, indents and spacing
format.paragraphDialog applies alignment, first-line and hanging
indents, spacing and line spacing in one undo step. With no fields it
opens the dialog from the Home › Paragraph launcher. Tabs… opens a
standalone Tabs dialog and returns to Paragraph.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:59:40 +03:00
Nikita Rakitin b1ce243806 Spelling: notes right-click menu, Review > Language with Do Not Check Spelling, repeated words 2026-10-14 02:47:34 +03:00
Nikita Rakitin a4ed08b687 SmartArt: layout thumbnails in galleries and live preview on hover 2026-10-14 02:47:28 +03:00
Nikita RakitinandCursor 68ab3a4839 UI: Font dialog sets character formatting in one step
format.fontDialog applies family, size, bold, italic, underline, colour,
strikethrough, baseline, caps and spacing together, so one undo restores
them. With no fields it asks the UI to open the dialog, seeded from the
selection. Home › Font, the shape menu and Cmd+T open it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:41:28 +03:00
Nikita RakitinandCursor 33252f28db SmartArt: Convert to SmartArt gallery on Home, Convert to Text keeps the text size
Home > Paragraph gets a Convert to SmartArt button whose menu lists every layout by category (List, Process, Cycle, Hierarchy, Relationship, Matrix, Pyramid, Picture); a click converts the selected text. Convert to Text sets the text box's titles and bullets to the sizes the graphic showed them at. Icon toggles carry their tooltip as their accessible name.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:34:55 +03:00
Nikita Rakitin 8bc7e55561 Spelling: squiggles in table cells and notes; UI-thread checking on the web 2026-10-14 02:34:33 +03:00
Nikita RakitinandCursor 304bf06290 Insert: Lucide icon gallery as stroked shapes
Insert › Icons places seventy Lucide 1.56.0 stroke icons as custom
geometry: no fill, round caps, and a line width scaled from the
24-unit design. The gallery searches by name. SVG paths, including
arcs, are converted when the icon is inserted so the renderer strokes
the outline.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:31:54 +03:00
Nikita RakitinandCursor 7764c27cc4 SmartArt: Name and Title org chart, closer Half Circle, ten more layouts, convert to and from text and shapes
Name and Title Organization Chart with a title box per node (DiagramNode.title, smartArt.setNodes title; written as the title box's presentation point text and read back). Half Circle Org Chart draws two half rings per node. New layouts: Vertical Box List, Trapezoid List, Table List, Accent Process, Continuous Block Process, Basic Bending Process, Linear Venn, Stacked Venn, Nested Target. smartArt.fromText (Convert to SmartArt), smartArt.toText and smartArt.toShapes, with a Convert menu in SmartArt Design.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:26:58 +03:00
Nikita RakitinandCursor b4c03f0a75 SmartArt: organisation charts with assistants, segmented and multidirectional cycles, cycle matrix, segmented pyramid, pie
Organization Chart and Half Circle Organization Chart with elbow connectors; assistant nodes (Add Assistant, written as asst points and read back) sit beside their parent on a row of their own. Segmented Cycle, Multidirectional Cycle, Cycle Matrix, Segmented Pyramid and Basic Pie. Venn labels move further out so the third circle's no longer runs into the overlap.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:16:40 +03:00
Nikita RakitinandCursor 06c275d136 Animations: check effect options and accept direction words
animation.add stored any `option` string as given, and the renderer reads
direction codes letter by letter, so "fromBottom" (r, t, b) flew in from the
bottom right. The option is now checked against the effect's list; direction
words ("fromBottom", "topLeft", "upRight") map to the stored codes ("b", "lt",
"ru"), and anything else is an error listing the valid options.
animation.options applies the option to each target in its own effect's terms
and leaves targets without such an option alone.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:15:42 +03:00
Nikita RakitinandCursor eb7e346ea1 Text: underline an IME composition in a table cell
The preedit was already stored in the cell. It is now laid out the same
way the cell is drawn, and the editor underlines it in place, thicker
under the part being converted. The caret and the input method's
candidate window sit in that cell. Notes stay an egui text field.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:08:14 +03:00
Nikita RakitinandCursor 00dd069678 SmartArt: six more layouts, clear Venn labels, read back older Picture Accent Process files
Text Cycle, Continuous Cycle, Horizontal Hierarchy, Grid Matrix, Gear and Funnel. Venn labels sit further out, clear of the overlaps. Files where Picture Accent Process was written as pList2 (with DeckCraft's process-category layout part) import as Picture Accent Process again. Round shapes' text shrinks to the inscribed width.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:07:51 +03:00
Nikita Rakitin a29e200a4e Spelling: background squiggles, Add to Dictionary, per-run languages, compounds 2026-10-14 02:05:22 +03:00
Nikita RakitinandCursor c5a63fc8b7 SmartArt: node pictures from the data model, Brick Scene camera, four more layouts
Node pictures are written on the data model's presentation points (blip through the data part's rels) and read back into the outline on import. Picture Accent Process is hProcess10, not pList2 (checked against PowerPoint's layout list); pList2 is now Horizontal Picture List. Brick Scene looks through an isometric camera. New layouts: Horizontal Picture List, Basic Timeline, Basic Venn, Basic Target.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:02:42 +03:00
Nikita RakitinandCursor 6f19e0bd07 SmartArt: shrink text to fit, picture layouts, 3-D styles and more colours
Each shape's text shrinks so its longest word fits on a line (the pyramid tip no longer breaks words). Three picture layouts (Vertical Picture List, Picture Caption List, Picture Accent Process) with a picture placeholder per node and smartArt.picture to fill it. Five 3-D SmartArt Styles (Polished, Inset, Cartoon, Powder, Brick Scene) drawn with lit bevels, and Colorful Range and Gradient Range colours; all written to and read from the .pptx quickStyle and colors parts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 01:56:36 +03:00