Commit Graph
6307 Commits
Author SHA1 Message Date
Khawar Zamman Wani 8bbffe7760 Merge origin/main into fix/font-name-editable-9338 2026-10-26 10:22:36 +05:30
aiongg 59cb4c49bd Panels: remove the native dock's drawing, strip and drag code (#9583)
craft-ui's docking draws every layout, the default one included, so the
native dock's own renderer no longer runs. Remove dock::show with its
per-frame group and strip records, peek, splitter resize, group and tab
drag and drop; the column height solver it used; DockLayout's move_group
and move_tab, which only it called; panel_docking's drag promotion from
the native strip and its extra strip menu; the card widgets that drew the
native groups and the Pro tab strip; and the tab drag and reorder paths
of the strip the Studio Properties card still uses.

The native dock's state, the commands that change it, the default layout
built from it and workspace loading and saving stay as they are. Tests
of the removed code go; the default-height test runs on the drawn layout.
2026-10-25 23:13:32 -04:00
Dylan M. Taylor d3b0a76c3f lint: drop blank lines after doc comments and attributes; tidy IME else, closure, shell tests (#9576)
- Remove blank lines between doc comments or #[test] attributes and the item (S8855, S8856)
- type_tool: drop the redundant else after continue in the IME event arm (S8862)
- ui_state: pass OsStr::to_os_string instead of an equivalent closure (S1612)
- macos packaging: [[ ]] for the attempt test (S7688); bind validate_staple's argument to a local (S7679)
2026-10-25 22:08:50 -04:00
aiongg b078e0e8a6 Panels: review follow-ups to the shared docking and egui 0.37 merges (#9575) 2026-10-25 22:03:26 -04:00
aiongg 6a199e224f Merge pull request #9366 from aiongg/docking-adopt
Panels: move onto craft-ui's shared docking
2026-10-25 21:23:10 -04:00
aiongg da02d0ef2d Merge remote-tracking branch 'upstream/main' into docking-adopt
# Conflicts:
#	Cargo.toml
#	crates/ui-egui/Cargo.toml
2026-10-26 00:12:23 +00:00
aiongg edaa41cf05 Panels: tests find the rail by its own button, since it is drawn inside the canvas panel 2026-10-26 00:07:40 +00:00
aiongg cece50d513 Merge pull request #9386 from davidmann4/integration-batch-8
Integration batch 8: 37 reviewed community PRs on main
2026-10-25 20:04:41 -04:00
Dylan M. Taylor 3877bb1dbe chore: resolve SonarCloud maintainability issues (#9044)
* chore: resolve SonarCloud maintainability issues

* fix: format imports and fix effect_entry argument type

* fix: restore test closure and wildcard import that broke compilation

* refactor: split composite_to_surface to reduce cognitive complexity
2026-10-25 19:38:31 -04:00
skylar taylor-barrick 718950cab6 chore(deps): refresh safe dependency bumps (#9558)
serde_json 1.0.154, proptest 1.12, criterion 0.8, crc32fast 1.5.3, rmcp 3.6,
tokio 1.54.1, base64 0.23 (direct deps), schemars 1.2.3, wat 1.262, libc 0.2.191,
objc2 =0.6.5, arboard 3.7, open 5.4.5, muda =0.21.2, winresource 0.1.34.
2026-10-25 19:30:07 -04:00
ccff1361b5 Integration: the other font picker tests let the menu settle too (#9197)
a2ab774eb raised the limit for the hover preview test only; on the PR's CI
options_bar_menu_arrows_walk_on_while_recording_recent_fonts then failed the
same way ("Harness::run exceeded max_steps (4). It would have settled after
6 steps", repaints from font_preview.rs:152). Every font picker harness that
opens the menu now allows SETTLE_STEPS (16) frames; Harness::run still fails
if the menu never settles.

Co-authored-by: hectorviov <1501713+hectorviov@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 23:40:45 +01:00
David MannandClaude Opus 5.5 a2ab774eb4 Tests: the font-menu hover preview test lets the menu settle
Opening the menu on the current family (#9197) paints rows whose font
samples load over a few frames; on CI's font set that takes 6 steps,
past egui_kittest's default of 4. Raise max_steps as other harnesses do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 22:59:53 +01:00
Dylan M. Taylor 5bb8536541 build: pin craft-update to craft-libs main (495e597) (#9548)
Picks up the startup prompt without the glyphs a font may lack (storytold/craft-libs#343, #344): the close mark is painted and the version pill is ASCII, so apps that panic on a missing glyph no longer take the prompt down.

Part of tracking issue storytold/craft-libs#319
2026-10-25 17:55:21 -04:00
4bb367750e Integration: histogram panel tests wait up to 60 s for a count (#9139)
uncached_refresh_counts_every_pixel_for_the_current_state counts an 18 MP
document pixel by pixel (the proxy only starts above 16 Mi pixels). In a
debug build on fork CI's loaded Linux runner that took over the 5 s
settle() allowed ("the histogram never settled"); locally it takes well
under a second. settle() returns as soon as the histogram lands, so the
longer limit only matters on a slow machine.

Co-authored-by: mathildalabs <347373177+mathildalabs@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 22:23:18 +01:00
David MannandClaude Opus 5.5 8aa8e4f0cb Integration: docs status lines follow the revision history
brush-parity.md, gaps.md and ui-parity.md had 2026-10-25 revision rows
under a 2026-10-23/24 "Last updated" header; the headers now carry the
latest row. gaps.md (24 of 171), ui-parity.md and target-app-parity.md
(46 of 149) quoted stale counts of preferences that do nothing; they now
quote the scorecard's 12 of 178. target-app-parity.md still listed the
Camera Raw Calibration panel as missing, which landed on 2026-10-13
(#5128); the row now names per-camera colour for non-DNG cameras, as
gaps.md G14 does.

Found by CodeRabbit on #9386.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
e9af3b71b6 Integration: the options bar shows the paragraph at a collapsed caret (#9179)
With a text edit and no selected range, styles_at read the paragraph at
byte 0, so the alignment and direction buttons showed the first
paragraph wherever the caret was: in "First\rSecond" with the second
paragraph right-aligned, a caret in "Second" lit Left. A collapsed caret
now picks the paragraph it is in, as Photoshop's options bar and
Paragraph panel do.

Found by CodeRabbit on #9386.

Co-authored-by: Hector Villarreal <1501713+hectorviov@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
4183f91dda Integration: the Adjustment Composite histogram has its own cache tag (#9139)
The tone histogram cache tag gave HistSource::UpTo(layer) kind 6, which
#3297 also gave the filter-mask Curves target, so both sources of one
layer had the same tag and the cache could hand one's histogram out as
the other's. UpTo now has kind 7, and a test checks every source of a
layer has its own tag.

Found by CodeRabbit on #9386.

Co-authored-by: mathildalabs <347373177+mathildalabs@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
7664d960e6 Integration: a Mixer Brush Alt-press that loads paint never paints (#3627)
An Alt-press with the Mixer Brush loaded paint and returned, but left
no state for the press: if Alt was let go before egui recognised the
drag, the drag's start reached the tool as a plain press and painted a
Mixer stroke from the sampled point (Alt-press, release Alt, move 20 px,
release: one edit). The press now stays a sample press until it is
released, as #7802 made it for the Brush's Alt eyedropper.

Found by CodeRabbit on #9386.

Co-authored-by: durtyrobbin <76844303+durtyrobbin@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
bf3ff9ce60 Integration: Camera Raw GPU tests fail on a shader that doesn't build (#6923)
The tests' setup returned None, without a message, when the device
request or the pipeline build failed, so every test passed early: with
a type error appended to camera_raw.wgsl all 13 tests still passed on a
machine with a GPU. A pipeline that doesn't build on a supported adapter
now fails the tests, a missing device skips with a message (and fails
with WGPU_BACKEND set, as in parity.rs), and a naga validation of the
shader fails on runners without a GPU too.

Found by CodeRabbit on #9386.

Co-authored-by: p0rps <134095787+fjamesprice@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
0f8521851e Integration: Vanishing Point clone dabs stay on the canvas (#3281)
Clone strokes painted every dab where its points lay, up to 1e7 px off
the canvas: on the layer itself without "newLayer", and on the work
surface with it, so each far dab allocated up to 4096x4096 px of tiles.
A stroke with points [[100,100],[-30,100],[9e6,9e6]] on a 200x200
canvas painted 3 dabs and left pixels left of the canvas. The dabs are
now cut to the canvas before any read or write.

Found by CodeRabbit on #9386.

Co-authored-by: Valentin Klein <271991477+vangel76@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:00 +01:00
ae4b778258 Integration: TIFF warns when extra samples past the cap are left out (#7415)
A decode kept the first MAX_EXTRA_SAMPLES (16) extra samples and dropped
the rest without a warning, though files with up to 64 samples a pixel
open: an RGB TIFF with 20 extra samples opened with 16 and no notice, and
a save then lost the other 4. The decode now adds ExtraSamplesOverLimit
with the count left out.

Found by CodeRabbit on #9386.

Co-authored-by: Jason DeBoever <615848+jasallen@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:00 +01:00
cfadb4c33f Integration: a test that tells pinned corpus counts from doc comments (#8658)
The PR's test compares the rendered scorecard with the tree, where the
corpus.rs doc comments and the sha256 manifests agree, so it still passes
with the PR's code reverted. The manifest loop is now pinned_file_counts,
and a synthetic root whose doc comment says 999 files and whose manifest
lists 3 must give 3 (an unpinned corpus keeps its doc comment count). It
fails with the loop skipped.

Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:27:53 +01:00
David MannandClaude Opus 5.5 178d6c2235 Integration: rustfmt the egui 0.37 merge
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:27:53 +01:00
Dylan M. Taylor 669a7f8a94 feat(updates): add startup self-update prompt modal (#9322)
* feat(updates): startup update prompt modal and direct self-updating

Release checks and the install go through craft-update's Updater: the engine's Help ▸ Check for Updates command keeps its status machine, its transport asks craft-update instead of a private GitHub client, and a found release opens the startup prompt. An install holds back while documents are unsaved, and a finished update closes through the guarded close path. craft-update stays out of the wasm build.

Ref: storytold/craft-libs#319

* fix(updates): address review feedback

Wake the UI when a manual check is queued from a menu callback; the update prompt owns the keyboard while it is open (LightCraft); Download opens through the desktop URL hook (FilmCraft); the Help menu dispatches through menus::invoke (FigCraft); print jobs and comment drafts hold an install back (WordCraft); Check for Updates is a registered command (GridCraft); an install holds back while documents are unsaved.
2026-10-25 15:55:45 -04:00
David MannandClaude Opus 5.5 8812fe1e73 Merge main (egui 0.37, #9363)
Conflicts: the batch's wheel reads (#5547 Animated Zoom) keep their extra
argument with main's ids (`Id::unique`, `ui.scope_id()`); crop presets keep
#6620's `apply_choice` with main's accessible name; Bevel & Emboss keeps
#9370's per-mode id with main's name argument; the Stroke field keeps
#7203's gradients with main's name; tone.rs keeps #9139's move of the
Histogram panel to histogram_panel.rs (main only renamed ids there);
translation catalogs as unions.

Not flagged by git, the batch's new code follows egui 0.37 too: dropdowns
take an accessible name (Histogram Channel/Source #9139, tool Mode #5504,
Art History Style #1610, New Snapshot From #3567), MouseWheel events carry
`source`, `WidgetType` is `Role` (ColorButton is ColorWell, #7203),
`Id::new`/`Ui::id` are `Id::unique`/`Ui::scope_id`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 20:53:11 +01:00
aiongg 4f8382f56e Merge remote-tracking branch 'upstream/main' into docking-adopt
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/panel_docking.rs
#	crates/ui-egui/src/panel_docking_tests.rs
2026-10-25 19:14:09 +00:00
5c9192bbe2 Migrate PhotoCraft to egui 0.37 (#9363)
* egui037: name each control for what it sets, and order the eager fonts for the UI

CodeRabbit review follow-ups on the migration: the Artboard X/Y fields, the CAF
dropdowns, the channel Solidity field, the GPU backend/adapter dropdowns, the
corner radius fields and the canvas extension colour all had an accessible name
that named another control (or was shared by four). The eager craft-fonts
registration now puts the UI Japanese face first, as the lazy loader does, so
Japanese UI is not drawn in the manifest's Mincho face and shared Han characters
do not take Japanese forms.

Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>

* egui037: rustfmt the eager craft-font order

---------

Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
Co-authored-by: Codebuff <noreply@codebuff.com>
2026-10-25 15:04:35 -04:00
David Mann 6baf1586ba Merge PR #1610: Art History Brush in the Y-group flyout 2026-10-25 19:50:57 +01:00
aiongg c580637749 Merge remote-tracking branch 'upstream/egui037' into docking-adopt
# Conflicts:
#	crates/ui-egui/src/layer_props_ui.rs
2026-10-25 18:49:13 +00:00
7e98763436 Integration: Art History Brush source sampling, History source, erased patches, silent no-op, Normal mode only (#1610)
- Each tile still copied a source window of (tile +- halo) clipped to the
  dab bounds, but a rotated read can land up to a dab diameter away: a
  leftward drag [[110,40],[20,40]] at size 40 read empty pixels at x = 64
  (seam), and a large click still copied about the whole dab per tile.
  The stamp now samples the history state directly (no window, no
  StampParams::halo), and bilinear reads at pixel centres, so an
  unrotated dab copies the history pixel instead of a 2x2 blend.
- Tolerance compared colour only, so an erased patch (the Eraser keeps the
  colour, lowers alpha 1 -> 0.6) was skipped at tolerance 25: the
  difference is now the larger of the mean colour change and the alpha
  change.
- The brush had its own history lookup (row 0 unless `state` was passed):
  it now uses the History Brush's source (history.setSource, snapshots,
  redo rows, refusal after a canvas size change).
- A stroke that wrote nothing at tolerance 0 (wholly outside the
  selection, or on Lock Transparency over transparent pixels) failed
  with "no stroke points"; it is now the same quiet no-op as a stroke
  under the tolerance (damage null, no History step).
- A mode other than Normal (agents only: the options bar sends none)
  blended each dab with the already-mixed result at full strength, so
  Multiply with a white source over 0.5 grey fell to 0.33 five pixels
  from a dab's centre instead of staying 0.5. Other modes are refused
  until the stroke is buffered, and the wrong path is removed.
- TOOL-213-20 is partial (8 of 10 styles, Area scales spacing); docs follow.

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 19:48:32 +01:00
Dylan M. Taylor 54a0bc46fa egui037: rustfmt the eager craft-font order 2026-10-25 14:48:19 -04:00
aiongg 3154f079bb Panels: skip the main window's clipboard keys while a panel window types; lock gates Open Panel in Own Window 2026-10-25 18:47:47 +00:00
Dylan M. Taylor 6e4f85e161 egui037: name each control for what it sets, and order the eager fonts for the UI
CodeRabbit review follow-ups on the migration: the Artboard X/Y fields, the CAF
dropdowns, the channel Solidity field, the GPU backend/adapter dropdowns, the
corner radius fields and the canvas extension colour all had an accessible name
that named another control (or was shared by four). The eager craft-fonts
registration now puts the UI Japanese face first, as the lazy loader does, so
Japanese UI is not drawn in the manifest's Mincho face and shared Han characters
do not take Japanese forms.

Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-25 14:37:46 -04:00
Dylan M. Taylor b1f73ab821 Merge origin/main into the egui 0.37 migration
Reconcile 39 upstream commits: keep main's off-menu gallery zoom, folder-field
picker and Transform edit tolerance while keeping the migration's accessible
names, and use Id::unique for the ids main added.

The Windows legs build with the suite's craft-fonts input: the runner has no
Japanese or Simplified Chinese system font, and egui 0.37 panics on a missing
glyph, which failed the localized UI tests. The background-redraw test now
holds the worker after its first batch, so an edit during a redraw cannot lose
the race on a fast machine.

Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-25 14:33:46 -04:00
aiongg 1992d65e82 Panels: read the native dock width from its parent-scoped key for egui 0.37
egui 0.37 keeps a panel's size under its parent's scope, reports an immediate viewport's commands from its own pass in that pass's output, and deprecates Id::new for Id::unique (same hash).
2026-10-25 18:26:21 +00:00
David Mann 6c35275a30 Merge PR #9197: fix(ui): the font menu opens on the current family's recent row (#9160)
# Conflicts:
#	docs/ui-parity.md
2026-10-25 18:55:13 +01:00
David Mann 0dede9f952 Merge PR #9451: raw: faster lossless JPEG scan loop (inline diff, 2-component loop, shared tables) 2026-10-25 18:54:57 +01:00
aiongg 292f869d8a Merge remote-tracking branch 'upstream/egui037' into docking-adopt
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	crates/ui-egui/src/gallery_ui.rs
#	crates/ui-egui/src/layer_props_ui.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/panel_docking.rs
#	crates/ui-egui/src/panel_docking_tests.rs
#	crates/ui-egui/src/view_cmds.rs
#	crates/ui-egui/tests/it/batch_export_options.rs
2026-10-25 17:51:11 +00:00
Matt Van Horn 45c303ba5c Art History Brush: count only the sampling margin against coverage
The stamp now reads each dab's bounds plus one pixel, but the coverage
check still inflated the stroke bounds by the full halo, so a single
Loose Curl click of size 1400 or more on a 2600x2600 canvas failed with
"stroke too large". Inflate by one pixel instead, and add a test for
size 2000 Loose Curl and size 2400 Tight Medium clicks.

Also make the documented tolerance default match the engine's (0).
2026-10-25 10:47:09 -07:00
David Mann 0134d2dc70 Revert "Merge PR #9455: raw: develop the default rendering band by band, without the f32 RGB frame"
This reverts commit ddb92be1fa, reversing
changes made to f12be92413.
2026-10-25 18:38:22 +01:00
10e20c4751 Integration: the font menu scrolls to the marked row, and a missing font doesn't jump the list later (#9197)
- The open scroll brings the marked row itself into view, keeping the recent
  group's top in view when the row fits below it: with Font Preview Size Huge
  and 10 recents, recent #8 opened below the fold.
- The open scroll is armed for the first laid-out pass only, whether or not a
  row matched: with a missing font or a mixed selection the scrolled list
  jumped later, once the font loaded or the selection settled.

Co-authored-by: hectorviov <1501713+hectorviov@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 18:00:52 +01:00
David Mann 92f592684c Revert "Merge PR #9454: raw: develop_half, a fused half-size preview develop (part of #9433)"
This reverts commit f12be92413, reversing
changes made to ba503e3584.
2026-10-25 17:49:19 +01:00
David Mann 02074c9a87 Revert "Merge PR #9183: fix(cms): Resolve .cube files with a 1D shaper and a 3D table load (#9177)"
This reverts commit 3c1f33d73e, reversing
changes made to 5d91c0025a.
2026-10-25 17:32:33 +01:00
Erica Franco 938542c78b Security: pin and verify the Windows signing client (#2936) (#3938)
sign.ps1 downloaded Microsoft.Trusted.Signing.Client from the unversioned
NuGet URL and loaded its dlib into signtool, next to the Azure signing
secrets, with no version or integrity check.

Download a pinned version (1.0.95, which the unversioned URL serves today)
and refuse it unless its SHA-256 matches, so upgrading the client is a
deliberate change in the repository. The release docs say where the pin
lives.
2026-10-25 12:32:10 -04:00
Dylan M. Taylor 122e368c7b Merge pull request #8979 from storytold/dependabot/github_actions/actions-7bbd92ab7f
ci(deps): bump the actions group across 1 directory with 3 updates
2026-10-25 12:30:21 -04:00
aiongg a4c74d84ea Panels: pin craft-libs at 5bbe9f62 2026-10-25 16:28:09 +00:00
aiongg e3f242af38 Merge remote-tracking branch 'upstream/main' into docking-adopt 2026-10-25 16:25:21 +00:00
6156d4b833 Integration: lossless JPEG round-trips with one Huffman table per component (#9451)
Every lossless-JPEG round-trip wrote a single DHT (id 0) shared by all
components, so the new per-component table mapping (comp_table, the t0/t1
split of the two-component loop) went untested, though real CR2 files
declare one table per component. testgen gains lj92_encode_tables (one DHT
per table id, Td chosen per component, code lengths rotated per table so
the tables differ); lj92_encode delegates to it with output unchanged.

New tests cover 2- and 4-component frames with distinct and mixed tables,
predictors 1, 4, 6 and 7, restart intervals and 16-bit 0/65535 extremes.
They now catch swapping t0/t1, pushing 0 into comp_table, and resolving
every component to tables[0]; they pass on main's decoder as well.

Co-authored-by: vangel76 <271991477+vangel76@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:22:28 +01:00
David MannandClaude Opus 5.5 ac7de75007 Integration: scorecard regenerated without #4573
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 16:36:23 +01:00
David Mann c01dc04b5f Revert "Merge PR #4573: Interface: Animation Effects follows the system setting, or is on or off"
This reverts commit acd7e07252, reversing
changes made to bc0354db5d.
2026-10-25 16:36:09 +01:00