Commit Graph
1356 Commits
Author SHA1 Message Date
Brandon Thomas a37fa65852 Merge pull request #1479
review.compare says which side each change is on; an absent box is not a rotation
2026-10-30 15:42:10 -04:00
Brandon Thomas 21bbb4127d Merge pull request #1478
A group's box follows its children after a command moves or resizes one

# Conflicts:
#	crates/engine/src/tests.rs
2026-10-30 15:42:10 -04:00
Brandon Thomas 36eaa7e051 Merge pull request #1477
Inserts in the master views: insert.dateTime fills the master's date placeholder; answers say a master or layout was edited (part of #298)

# Conflicts:
#	crates/engine/src/tests.rs
2026-10-30 15:41:59 -04:00
Brandon Thomas 932ec7bef6 Merge pull request #1475
table.cellAlign takes a horizontal align
2026-10-30 15:41:42 -04:00
Dylan M. Taylor 505a6f28ac Update prompt shows the app icon and accent color instead of a letter (#1561)
UPDATE_APP (native builds; craft-update is a native-only dependency) carries our 128 px icon and accent (#f07a1e, its colour in ArtCraft Launcher). The updater, the self-update
helper and craft-update's startup prompt all get them through crate::UPDATE_APP; the
prompt draws the icon, the accent and "by ArtCraft" (craft-update's default developer).

craft-update is pinned to storytold/craft-libs main at 1065653e7 (#434).
Clippy fixes for Rust 1.99 in untouched code (same logic):
- crates/engine/src/tools/click.rs
- crates/engine/src/tools/pointer.rs
- crates/metafile/src/emfplus.rs
- crates/model/src/trendline.rs
- crates/pptx/src/read/dml.rs
- xtask/src/layers.rs
2026-10-30 01:28:38 -04:00
Dylan M. Taylor 8c6c72e39f Refactor ui-egui for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 1a203c4a73 Refactor engine for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 7f1ebc2a5c Refactor render for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 8e4d0e6b4c Refactor pptx for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 3f853db3f6 Refactor av1 for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor d9749fbcc5 Refactor h264 for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 0e7cd01381 Refactor hevc for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 9c52950536 Refactor vp9 for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor c58f19f1b5 Refactor opus for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 4de3a4dc8b Refactor text for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor f441ea93a2 Refactor metafile for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor 6a59eb8cef Refactor model for strict Clippy checks 2026-10-28 06:02:27 +00:00
Dylan M. Taylor e03ff82504 Refactor geom for strict Clippy checks 2026-10-28 06:02:27 +00:00
Zach BerryandClaude Sonnet 5.5 cd5ff01810 [NN6] review.compare treats an absent box like an unrotated, unflipped one
slide.reset drops a placeholder's stored box, and compare called that
"rotated" because None differed from a stored rotation of 0. Absent now
equals 0 for rotation and no flips; a real flip difference reads "flipped".
PowerPoint's Compare reports a rotation only when the angle differs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 21:43:36 -05:00
Zach BerryandClaude Sonnet 5.5 2cad063d1d [MM4] A group's box follows its children after a command moves one
shape.move or shape.setBounds on a group's child left the group's box as it
was, so inspect_slide reported stale bounds. After any edit that changes a
child's box or the child list, the group's box is refitted to the union of its
children (its child space too, so every child keeps its place on the slide).
A group that was itself moved or resized, and SmartArt groups (regenerated
inside their own box), are left alone.

PowerPoint: a group's bounding box always hugs its children; dragging one
child out grows the group, dragging it back shrinks it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 20:38:41 -05:00
Zach BerryandClaude Sonnet 5.5 f58ec39968 [CC3] table.cellAlign takes a horizontal align
align: left|center|right|justify sets every paragraph of the target cells;
anchor stays the vertical alignment and is optional when align is given.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 20:31:46 -05:00
Zach BerryandClaude Fable 5.1 4c83fb9abe [CCC2] Insert answers say when they edited a master or layout
PowerPoint shows the Slide Master tab while a master or layout is open,
so inserting there is never mistaken for editing a slide. DeckCraft's
insert commands answered the same in both views. Session::execute now
adds editing: {kind, name} (as slide.inspect does) to the answers of
insert.*, shape.insert, shape.freeform, shape.connect and slide.new in
master, layout, handout and notes-master view; answers on slides are
unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-27 18:55:41 -05:00
Zach BerryandClaude Fable 5.1 6a1b8f1e39 [ZZ1] insert.dateTime in the Handout/Notes Master view fills the master's date placeholder
PowerPoint: Header and Footer > Notes and Handouts > Date and time puts a date field in the
date placeholder of the notes and handout masters, and every handout and notes page shows it.
Before, with no text caret the command wrote the current slide's date placeholder (design
.headerFooter) even in those views, so the handout PDF showed nothing. Now it writes the selected
date placeholder, else the master's own, as a field (update) or plain text, answers where:
master, and refuses (changing nothing) when the master has no date placeholder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-27 18:55:41 -05:00
Zach BerryandClaude Sonnet 5.5 48535be970 [JJ1] review.compare says which side each change is on
Each change now carries number (the editor's slide number beside the 0-based
slide) and onlyIn (deck or file; absent for a change in both). Shape details
say (only in the deck) / (only in the file). The docs say review.accept takes
the file's side.

PowerPoint: Compare marks the other file's differences as revisions that
Accept applies and Reject discards, so accepting takes the file's side; kept.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 18:24:31 -05:00
aiongg 88c2ceff5f Merge pull request #1461 from Silvertree2010/perf/export-speed
Speed up PDF export by reusing equal slide backdrops
2026-10-27 13:42:02 -04:00
NetterSilverandClaude Opus 5.5 2f4a6d906a Speed up PDF export by reusing equal slide backdrops
PDF export rasterises every slide as a backdrop and a content layer and
hands both to the writer. Profiling (gdb stack sampling) showed most of
the main thread outside rendering going to per-pixel work on those
rasters: compositing the backdrop onto white (not vectorised), the
writer hashing every backdrop to deduplicate it, and the straight-alpha
conversion scanning every content pixel.

- Composite the backdrop with saturating adds and skip 16-pixel blocks
  that are already opaque; skip blocks with no partly transparent pixel
  in the straight-alpha conversion. Same formulas, same bytes.
- Keep the last opaque backdrops (up to 32 MiB of pixels) and hand the
  writer the same image again when a slide renders an identical
  backdrop. The writer stored equal backdrops once already; now it also
  skips hashing and compressing the copies. Output is byte-identical.

deckcraft-cli bench, export .pdf step, 15 interleaved runs each on a
16-thread Ryzen (A/A noise +0.9 %):
- sample x4 (32 slides): median 531 -> 322 ms (-39 %), min 529 -> 317 ms
- same deck, every slide a different background: 557 -> 441 ms (-21 %)
- sample (8 slides): 149 -> 103 ms (-31 %)
Exported PDFs are byte-identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:39:31 +01:00
aiongg 2c9edcc394 refactor(ui): use craft-ui's ComboBox for every dropdown (#1457)
* ui: use craft_ui::ComboBox so dropdown menus grow back (egui#5225); repin craft-libs

* chore(deps): craft-libs 60d60d48 (dropdown fixes)

* chore(deps): craft-libs 6af63481 (dropdown fixes)

* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)

* chore(deps): craft-libs 92d392cf (#387 merged)

* chore(xtask): pdf-deps expects craft-libs 92d392cf
2026-10-27 10:26:51 -04:00
aiongg 12001d14e7 refactor(engine): split cmd/shape.rs into cmd/shape/{size,appearance,picture,freeform}.rs 2026-10-26 22:10:40 +00:00
aiongg 96f0ac204e test(engine): read past #[cfg(test)] imports in the file-system scan 2026-10-26 22:08:44 +00:00
aiongg 6b57773373 refactor(geom): split preset.rs into preset/{catalog,builder,build,shapes}.rs 2026-10-26 22:08:44 +00:00
aiongg 838d51ed59 refactor(text): split lib.rs into {run,style,autonum,shape,symbol,breaking,layout}.rs 2026-10-26 22:08:44 +00:00
aiongg 5b02b1744c refactor(render): split lib.rs into {raster,opts,slide,renderer,geometry,stroke,text_draw}.rs 2026-10-26 22:08:44 +00:00
aiongg 8b456dce41 refactor(engine): split tools.rs into tools/{hit,pointer,drag,click,geometry}.rs 2026-10-26 22:08:44 +00:00
aiongg 15bf821535 refactor(engine): split cmd/text.rs into cmd/text/{ime,layout,editing,autocorrect,caret,formatting}.rs 2026-10-26 22:08:44 +00:00
aiongg d7c06b53eb refactor(engine): split cmd/smartart.rs into cmd/smartart/{nodes,paint,layout,diagrams,edit}.rs 2026-10-26 22:08:44 +00:00
aiongg 97b98767f1 refactor(engine): split cmd/insert.rs into cmd/insert/{picture,album,chart,text_fields,links}.rs 2026-10-26 22:08:44 +00:00
aiongg d5180fbb70 refactor(engine): split cmd/format.rs into cmd/format/{font,text_effects,paragraph,painter,ruler}.rs 2026-10-26 22:08:44 +00:00
aiongg 9c222be711 refactor(engine): split cmd/design.rs into cmd/design/{colors,slide_background,slide_setup,master_view}.rs 2026-10-26 22:08:44 +00:00
aiongg 28371e27d7 refactor(ui-egui): split backstage.rs into backstage/{files,info,print}.rs 2026-10-26 22:08:44 +00:00
aiongg 4bdd5b5bee refactor(ui-egui): split icons.rs into icons/{geometry,draw}.rs 2026-10-26 22:08:44 +00:00
aiongg 99688fe45a refactor(ui-egui): split show.rs into show/{render,keys,ui,media,presenter,zoom}.rs 2026-10-26 22:08:44 +00:00
aiongg ada66524a2 refactor(ui-egui): split panels.rs into one file per pane under panels/ 2026-10-26 22:08:44 +00:00
aiongg e84ba9def1 refactor(ui-egui): split ribbon.rs into one file per tab under ribbon/ 2026-10-26 22:08:44 +00:00
aiongg 9545ff4d61 refactor(ui-egui): move the zoom, trim, about and alt-text test modules to their dialog files 2026-10-26 22:08:44 +00:00
aiongg c8a6363a0f refactor(ui-egui): split dialogs.rs into one file per dialog under dialogs/ 2026-10-26 22:08:44 +00:00
aiongg 462310faed refactor(ui-egui): split canvas.rs into canvas/{input,scroll,ime,media,rulers,guides,overlays,context_menu}.rs 2026-10-26 22:08:44 +00:00
aiongg d428b4804a refactor(ui-egui): move the backstage test files beside backstage.rs 2026-10-26 22:08:44 +00:00
aiongg 9ab4ed9581 refactor(ui-egui): move the sorter test files beside sorter.rs 2026-10-26 22:08:44 +00:00
aiongg a094f37ed9 refactor(ui-egui): move the ribbon test files beside ribbon.rs 2026-10-26 22:08:44 +00:00
aiongg 742e660afd refactor(ui-egui): move the dialogs test files beside dialogs.rs 2026-10-26 22:08:44 +00:00