100 Commits
Author SHA1 Message Date
aiongg 7aaa59712a Merge main into integration-batch-7 2026-10-23 20:37:05 +00:00
aiongg 8debb6c420 xtask: the panic hunt without nextest builds with the HEIF decoder 2026-10-23 20:10:26 +00:00
aiongg 4b51647955 Merge remote-tracking branch 'upstream/main' into xtask-ci-gate
# Conflicts:
#	xtask/src/main.rs
2026-10-23 19:44:29 +00:00
aiongg a75a414310 CI: cargo xtask ci is the gate, and the workflow runs it 2026-10-23 19:29:31 +00:00
aiongg c3aa3f9e51 Tests: missing translations don't fail; xtask ci prints them
Delete the coverage tests, the per-language parity checks and the tests
of one language's exact wording. Catalog integrity, placeholder and
plural-form checks stay, as do the engine tests (locale resolution,
plural rules, fallback, language scoping, drawing in a language); those
compare against tr() or the plural rule rather than catalog wording.
Docs describe the report instead of a failing test.
2026-10-23 19:07:23 +00:00
aiongg cb297eeac1 xtask: i18n-coverage lists missing strings; ci prints them last
The report prints, per language, the source keys its catalog lacks (one
line for a language with none). `cargo xtask ci` runs it as its last step
and never fails on it: a missing translation shows in English. A report
that can't run prints a warning.
2026-10-23 19:07:23 +00:00
aiongg 9acf9a0cf9 CI: the Linux gate runs through the suite's shared gate workflow 2026-10-23 18:32:21 +00:00
aiongg 1f472d61ea Tests: report a bad PHOTOCRAFT_SWEEP_PART with assert!, which testkit's lints allow 2026-10-23 16:49:11 +00:00
aiongg 20ad9f1f4e Docs: the final check before a PR runs the full sweep 2026-10-23 16:40:24 +00:00
aiongg 066ad384cd Tests: refuse a PHOTOCRAFT_SWEEP_PART that isn't a part number 2026-10-23 16:40:24 +00:00
aiongg 7d9abd95af CI: the git-sources check parses .cargo/config and .cargo/config.toml
A source replacement, a patch or a path override in either cargo config never shows up in
Cargo.lock, so the check refuses them. Both files are parsed as TOML, as Cargo reads them.
2026-10-23 16:18:57 +00:00
aiongg 18f4b5348c Tests: spread three format-by-geometry matrices over the days, and build one precheck state per case
The tilt-shift reference tests and tiled_clear_and_fill_match_one_pass_over_the_area cross pixel
formats or channel counts with independent geometry and fill settings. Each run takes a quarter of
the combinations through Sweep, a different quarter each UTC day.

precheck_agrees_with_execute built all five document states for every call and kept one; it now
builds only the state the call needs.
2026-10-23 08:30:48 +00:00
aiongg b87cfb3c6a Tests: spread the two longest sweeps over the days
swept_blocks_match_the_pixel_search skips the cases where the colour mode reaches extrude only
through a channel count and ink setting an earlier mode already covered. It and
damaged_layer_data_opens_flattened run a quarter of their cases per run, a different quarter each
UTC day (photocraft-testkit's Sweep). PHOTOCRAFT_FULL_SWEEP=1 runs every case, and
PHOTOCRAFT_SWEEP_PART=<n> replays the part a failing run printed.
2026-10-23 07:20:54 +00:00
aiongg 175c9c1e75 xtask: test with nextest, doctests separately, one wasm check call
cargo xtask test and the ci test step run cargo nextest over libs, bins and tests when nextest is
installed (cargo test otherwise, with a notice), then cargo test --doc. The wasm check is one
cargo check with --keep-going over the wasm-safe crates, plus one call per optional web feature.
Clippy runs with --keep-going.
2026-10-23 06:00:38 +00:00
aiongg 6ed69874fd Profiles: no debug info for dependencies in dev and test builds
Workspace crates keep line tables, so panics in PhotoCraft code still show file and line.
2026-10-23 06:00:19 +00:00
aiongg a87b56b32a Merge upstream/main into stored-path-resolve 2026-10-23 05:08:54 +00:00
aiongg 82a7cfa3c5 CI: check the lockfile as Cargo reads it, and pin the release checkout
The git-sources step fails when Cargo.lock is missing or out of date with the manifests, when
.cargo/config.toml replaces or patches a source, or when the parsed lockfile has a git source outside
github.com/storytold. The release job's checkout is pinned to a commit.
2026-10-23 05:08:53 +00:00
aiongg 37463ae532 Stored paths: refuse Windows drive and share paths outside Windows without a document
Without a document, a relative path is reported as needing the document's folder. Outside Windows a
drive or share path such as C:\art\logo.png never becomes absolute, so it is refused as invalid
whether or not the document has a file.
2026-10-23 05:06:52 +00:00
aiongg fd4c1f4d15 Actions: a step dialog takes only the step's values
Copying a recorded step's params into its dialog skips `__` keys: they are
the dialog's own markers, and the command never receives them.
2026-10-22 18:50:15 +00:00
aiongg 0eb76eda4d Actions: the gate judges a step before its dialog opens
A playback under an automation gate stops at a step the gate denies, as it
does for steps without a dialog, instead of opening that step's dialog.
2026-10-22 18:50:15 +00:00
aiongg 7d73232023 Actions: a failed step dialog command ends its paused playback
abandoned() drops the pause's record as stopped() does, so the recording a
paused call suspended comes back once and the record doesn't keep refusing
actions.record, actions.delete and actions.move afterwards.
2026-10-22 18:50:15 +00:00
aiongg 993e3046df Automation: exported layers keep linked smart objects as pixels in workspace sessions
`Headless::export_layers` calls `export_layers_with` outside `Session::execute`, so no session gate was installed when `encode` chose whether a PSD/PSB embeds a linked smart object's file. `export_layers_with` enters the session's gate itself, as `Session::execute` does, and a workspace session's layer export writes such a layer as pixels like `doc.save`.
2026-10-22 18:41:32 +00:00
aiongg a89554eb83 Automation: dialog fields can't add the Replace prompt's marker
The Replace prompt (`__replaceSaved`) routes `confirm` and `cancel` like the other dialog markers, so `ROUTES` lists it and `ui.dialog.set` / `ui.dialog.open` refuse to add it.
2026-10-22 18:41:32 +00:00
aiongg ffa400c754 Keep tests correct and docs current with one test binary per crate
- gpu: the test modules share one GPU_LOCK, and timing and vector_mask
  take it too, so one process drives one wgpu device at a time.
- ui-egui: the wgpu tests in pattern_preview_canvas, adjust_preview_gpu,
  marquee_autoscroll and layout_perf take gpu_lock().
- affinity compound_limits: the child process selects its test by the
  module path (compound_limits::<name>); with --exact, the bare name
  matches no test and the child passes without running the check.
- xtask scorecard reads crates/io/tests/it/corpus.rs.
- Docs and comments name the new test paths and the --test it filters.
2026-10-22 16:55:34 +00:00
aiongg a6428d3dfb Build each crate's integration tests as one binary
Every tests/*.rs file is its own executable that links the whole crate
graph. Move each crate's test files into tests/it/ as modules of one
tests/it/main.rs; helper modules under tests/common move with them.

These keep their own binary (own process):
- engine panic_hunt: a process-wide panic hook counts every panic.
- engine text_gamma: changes the process-wide text gamma.
- engine smart_filter_stages, mask_cache_purge: assert on global caches.
- codecs pnm_peak_memory: reads the process's peak RSS.
- photocraft mac_menu_appkit: harness = false.
2026-10-22 16:55:34 +00:00
aiongg fa010ff7c3 Integration: regenerate docs/scorecard.md 2026-10-22 16:03:31 +00:00
aiongg 1370c7a642 Integration: #7811 cargo fmt on process_outputs 2026-10-22 15:47:53 +00:00
aiongg 64fb74f1e7 Integration: #8143 the branchless floor test accepts any NaN for NaN inputs
MSVC's floor quiets a signalling NaN while branchless_floor keeps its payload, so the Windows job failed the bitwise compare; every other input still compares bit for bit.
2026-10-22 15:40:11 +00:00
aiongg 753b910f5d Merge PR #5988: Raw: a Nikon maker note's ColorSpace sets the preview colour space (#5987) (new head, a rebase of the merged one; its changes are already in) 2026-10-22 15:40:10 +00:00
aiongg 884ea76691 Merge PR #5980: Raw: the Nikon D4 white level follows the sample depth (#5978) (new head, a rebase of the merged one; its changes are already in) 2026-10-22 15:40:09 +00:00
aiongg 22d912a108 Integration: #8142 #8535 Quick Export accepts a .exr path
Main's extension check (#8519) refused .exr, the format #8142 adds to Export Preferences; the path's extension now may also name EXR.
2026-10-22 15:40:08 +00:00
aiongg add0fbc706 Integration: merge main (through #8562)
contributors/people.toml: kept both sides' new entries (r4's list and main's benandez).
2026-10-22 15:40:05 +00:00
aiongg 4819f5b7d4 Merge PR #8372: Compose: effect maps that don't fit in the effect cache are built over the render rect, not rebuilt whole on every render (#8330) (new head) 2026-10-22 15:40:02 +00:00
aiongg 9cba44307d Merge PR #8236: Add interactive drag positioning to print preview (new head)
crates/ui-egui/src/file_ui.rs: kept r4's print_params and added the new head's doc comment on print_confirm.
2026-10-22 15:40:00 +00:00
aiongg 4a9034a762 Merge PR #8168: File names: keep Windows device names (nul, con, com1…) off the disk (new head)
The new head only merges main; crates/engine/src/file_cmds/tests.rs conflicted on the sanitize test's position, kept r4's single copy.
2026-10-22 15:39:57 +00:00
aiongg eb199bcefe Merge PR #7721: fix(actions): refuse lossy fractional Crystallize ATN export (new head) 2026-10-22 15:39:55 +00:00
aiongg fb05540774 Merge PR #6452: Hand tool: hold Ctrl/Cmd to zoom in, Alt to zoom out (#6434) (new head) 2026-10-22 15:39:53 +00:00
aiongg 934eb71d84 Integration: merge main
crates/engine/src/file_cmds.rs: batch keeps the save-point closure (takes the output path) and also copies the session's authorize hook into each scratch session, as main now does.
crates/raw/src/sensor.rs: both sides cap the memory of retained tiles; kept the existing retained_segment_bytes check (checked multiplication, same limit) and dropped main's duplicate inline loop.
2026-10-22 15:39:51 +00:00
aiongg f618cdea29 Integration: #8371 the .atn corpus round trip merges the per-property Sets that Save now writes 2026-10-22 15:39:49 +00:00
aiongg e6f7af8ce7 Integration: #5566 the panel-defaults harness waits for the font scan 2026-10-22 15:39:47 +00:00
aiongg af12584f47 Integration: #6974 depth labels and delete-layer prompt in hi.tsv 2026-10-22 15:39:45 +00:00
aiongg dc6fe754a8 Integration: #6186 New Layer during a background transform commit expects main's refusal, then retries 2026-10-22 15:39:42 +00:00
aiongg dd2cba6e81 Integration: #7325 #6452 Command-click under Curves adds its point with the Hand tool, not a Hand-tool zoom 2026-10-22 15:39:40 +00:00
aiongg fafbb4bbdf Integration: #7388 #6936 the Crop popup key tests make the ratio-fitted frame a drawn one first 2026-10-22 15:39:38 +00:00
aiongg 63de4df31b Integration: #8030 #5571 the group indent test opens the group, which Group Layers creates collapsed 2026-10-22 15:39:36 +00:00
aiongg f905c72434 Integration: #8162 #7256 the Brushes tab test waits for the window to settle after the preview-size slider row 2026-10-22 15:39:34 +00:00
aiongg f88e1c988d Integration: #4751 #3283 the drawn-filter marker takes the document id, as filter_rows now gets the document 2026-10-22 15:39:32 +00:00
aiongg 9cb9535a95 Integration: #4315 DICOM gets its own File > Open filter 2026-10-22 15:39:30 +00:00
aiongg 2496742eaa Integration: merge main
Merges main through #3283 (Smart Filters: distinct editors, shared
disclosure and stable alpha).

filter_dialog.rs: main's split of the preview into is_smart_edit,
smart_preview_factor and scale_preview_params is kept. The plug-in branch
from #7524 (plugin_cmds::scale_for_preview scales only declared pixel
lengths) moved into scale_preview_params, so it applies to a plug-in run
on its own and to a plug-in recorded as a smart filter.

smart_ui.rs open_editor: main's smart_filter_dialog::target flow and the
shared adjust/filter dialog opening are kept; the Liquify re-open with
recorded strokes (r4) stays ahead of it. The old per-adjustment
edit_filter call is dropped with main's rewrite.
2026-10-22 15:39:28 +00:00
aiongg dc6c78e124 Integration: #6974 the mixer brush strings in hi.tsv
The mixer brush test needs every registered language to translate its five strings; the catalog is AI-drafted and not natively reviewed.
2026-10-22 15:39:26 +00:00
aiongg 53cdc3cf16 Integration: #6974 #8236 catalog rows filled with English for keys the coverage tests require 2026-10-22 15:39:23 +00:00
aiongg 8e206e60b0 Integration: #5864 #5993 the DDS level cut-out test sets the level's row pitch 2026-10-22 15:39:21 +00:00
aiongg 3f9d2aaf2b Integration: #5566 #6710 the pre-styling tests no longer expect the hidden Hyphenate control
#6710 hides Hyphenate while layout does not hyphenate, so the Character panel has no control to find or click.
2026-10-22 15:39:19 +00:00
aiongg e846b64262 Integration: #7593 the plain crop round trip carries no deleteCroppedPixels key
The exporter leaves out an unset Crop delete (see the exporters' defaults note), so the imported step has none either.
2026-10-22 15:38:58 +00:00
aiongg 39dd2eda12 Integration: #7101 the Apply Layer Comp event is registered once, by the name-only mapping
main already registered an applyComp event that accepted any reference class; the first match won, so #7101's name-only mapping never ran.
2026-10-22 15:38:56 +00:00
aiongg 322a29a744 Integration: #8087 liquify source footprint test uses as_chunks_mut 2026-10-22 15:38:54 +00:00
aiongg f42dc7f3dd Integration: #7800 #6328 GuideDrag test literals take over_ruler, and the two rulers canvas_harness helpers are told apart 2026-10-22 15:38:52 +00:00
aiongg 386ebe736b Integration: #8304 #7262 layer_props_tests compare with the optional layer ref 2026-10-22 15:38:50 +00:00
aiongg d87a169738 Integration: cargo fmt 2026-10-22 15:38:48 +00:00
aiongg fe220983a7 Integration: regenerate docs/scorecard.md 2026-10-22 15:38:46 +00:00
aiongg 87d930997b Integration: #7611 smart brush export refuses steps with refine strokes 2026-10-22 15:38:44 +00:00
aiongg 8d0f920ea6 Integration: #7574 the lift outline allocates fallibly 2026-10-22 15:38:42 +00:00
aiongg 95db2fe5eb Integration: #7968 #7262 groupLayers From uses the optional layer ref 2026-10-22 15:38:40 +00:00
aiongg 42efb8d777 Merge PR #7530: Marching ants in device pixels, like the reference app (#7489)
# Conflicts:
#	crates/ui-egui/src/canvas.rs
#	docs/ui-parity.md
2026-10-22 15:38:38 +00:00
aiongg 7d0cb444d6 Integration: track t13
# Conflicts:
#	contributors/people.toml
#	docs/ui-parity.md
2026-10-22 15:38:35 +00:00
aiongg 576ba0e02b Integration: track t12
# Conflicts:
#	contributors/people.toml
#	crates/compose/src/lib.rs
#	crates/compose/src/tests.rs
#	crates/engine/src/print_cmds.rs
#	crates/engine/src/print_cmds/tests.rs
#	docs/target-app-parity.md
2026-10-22 15:38:33 +00:00
aiongg 5857afd121 Integration: track t11
# Conflicts:
#	apps/photocraft-cli/src/lib.rs
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	docs/gaps.md
2026-10-22 15:38:31 +00:00
aiongg 71991b0a03 Integration: track t10
# Conflicts:
#	contributors/people.toml
#	crates/engine/src/prefs.rs
#	crates/ui-egui/src/layer_style/contour.rs
#	docs/ui-parity.md
2026-10-22 15:38:28 +00:00
aiongg 1dc684a2b6 Integration: track t09
# Conflicts:
#	contributors/people.toml
#	crates/engine/src/atn_cmds/tests.rs
#	crates/engine/src/file_cmds.rs
#	crates/engine/src/jobs.rs
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-22 15:38:26 +00:00
aiongg f72c3c2187 Integration: track t08
# Conflicts:
#	crates/ui-egui/src/camera_raw_ui.rs
#	crates/ui-egui/src/jobs_ui.rs
#	crates/ui-egui/src/widgets.rs
#	docs/file-format-parity.md
#	docs/gaps.md
2026-10-22 15:38:23 +00:00
aiongg 446b74a8de Integration: track t07
# Conflicts:
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	crates/ui-egui/src/layer_shortcut_tests.rs
2026-10-22 15:38:21 +00:00
aiongg ba120dc48e Integration: track t06
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/tr.tsv
#	docs/gaps.md
#	docs/ui-parity.md
2026-10-22 15:38:19 +00:00
aiongg 9c7cc91f82 Integration: track t05
# Conflicts:
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/shortcuts.rs
#	docs/ui-parity.md
2026-10-22 15:38:18 +00:00
aiongg 1f0177f23c Integration: track t04
# Conflicts:
#	ATTRIBUTION.md
#	contributors/people.toml
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	docs/gaps.md
2026-10-22 15:38:17 +00:00
aiongg 37dedcff38 Integration: track t03
# Conflicts:
#	docs/ui-parity.md
2026-10-22 15:38:15 +00:00
aiongg 4d1b922ddf Integration: track t02
# Conflicts:
#	contributors/people.toml
#	crates/engine/src/file_cmds/tests.rs
#	crates/engine/src/print_cmds/tests.rs
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
2026-10-22 15:38:14 +00:00
aiongg 82cf3c828c Integration: track t01
# Conflicts:
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	docs/file-format-parity.md
#	docs/gaps.md
2026-10-22 15:38:14 +00:00
aiongg 0e80156397 Integration: track t16
Resolutions: CLI usage, flag lists and flag parsing carry both --tiff-compression (t15) and
--jpeg-format (t16); file.saveACopy, batch, imageProcessor and layersToFiles param specs carry
both tiffCompression and jpegFormat; file_cmds keeps tiff_compression_param and
jpeg_format_param; atn_cmds keeps flag_set/applies_at_canvas_bounds (t15) and UNHOLDABLE (t16),
edit.transform uses the pixel_target guard (t15) with layer_ref(p)? (t16); ui-egui open paths
build ImportOptions (t16) and apply raw_defaults (t15); docs headers/rows unioned; atn tests keep
both sides; tr.tsv "Keep Using CPU" kept once.
2026-10-22 15:38:13 +00:00
aiongg 3d1a4d6679 Integration: track t15
# Conflicts:
#	crates/engine/src/atn_cmds/tests.rs
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	docs/file-format-parity.md
#	docs/ui-parity.md
2026-10-22 15:38:12 +00:00
aiongg e1d2596bd8 Integration: track t14 2026-10-22 15:38:11 +00:00
aiongg b466ad3fc3 Integration: the #6158 test passes the button #6833 added to the test helper 2026-10-22 15:37:51 +00:00
aiongg c74d5a8abd Merge PR #8315: fix(ui): pin the document tabs' » button to the strip's right end (part of #8290) 2026-10-22 15:37:50 +00:00
aiongg 1a02ccf897 Merge PR #8238: CPU canvas: a large document shows its own pixels at 100% (#7568) 2026-10-22 15:37:50 +00:00
aiongg 70eaa052c3 Merge PR #8223: Alt + wheel zooms while Alt is held, even when the modifier state misses it (#8049) 2026-10-22 15:37:49 +00:00
aiongg 33ce24eabe Merge PR #8141: Panels: the dock can be dragged as wide as the window allows, not only 520 points (#7896) 2026-10-22 15:37:49 +00:00
aiongg da6e925017 Merge PR #8068: Page Up/Down, Home and End scroll the canvas, as in the reference app (#8057) 2026-10-22 15:37:49 +00:00
aiongg 3db630feb4 Merge PR #8029: Snapping: artboard edges and centres are snap targets (#8016)
crates/engine/src/snap.rs: the PR's artboard branch kept, with main's target_rect_of(doc, l) signature in the following branch.
2026-10-22 15:37:48 +00:00
aiongg 58a9dcc510 Merge PR #7957: Fix dropdown menus opening behind modal dialogs on macOS trackpad tap (#7113) 2026-10-22 15:37:48 +00:00
aiongg bc94175a99 Merge PR #6833: Title bar: only the primary button starts a window drag (#6729)
crates/ui-egui/src/panels.rs: main's start_os_move call (from #6158) under the PR's drag_started_by(Primary) condition.
crates/ui-egui/src/titlebar.rs: same, in the modal drag overlay.
2026-10-22 15:37:47 +00:00
aiongg b8605f8447 Merge PR #6826: Don't pan the canvas when a dialog's title bar is dragged (#6810) 2026-10-22 15:37:46 +00:00
aiongg a7c80a83d2 Merge PR #6791: Intel Iris Xe on DX12: no more red blocks in brush previews and tool icons (#6790) 2026-10-22 15:37:46 +00:00
aiongg a97dcfcb9e Merge PR #6480: Ctrl+Space and Alt+Space zoom the image under an open dialog
crates/ui-egui/src/canvas.rs: kept main's curve_point_press and the hand condition that uses it, then the PR's held-zoom block with the existing pan_delta branch as its else-if.
2026-10-22 15:37:45 +00:00
aiongg 1693d0fe4f Merge PR #6380: Make brush cursors follow pen orientation and projection 2026-10-22 15:37:45 +00:00
aiongg 6c58aab811 Merge PR #6328: Guides: a guide let go over either ruler is removed, not only off the canvas (#6286)
docs/ui-parity.md: header line kept as on main with the PR's #6286 item added once; both change-log rows kept.
2026-10-22 15:37:44 +00:00
aiongg 3bb1b49457 Merge PR #6263: fix(ui): Paths panel footer: cut-off hover highlight and scroll jiggle (part of #6238) 2026-10-22 15:37:44 +00:00
aiongg c5abd43a22 Merge PR #6158: Title bar: a window move the window manager finished no longer blocks the next move or resize (#5725)
contributors/people.toml: union of both sides' entries.
2026-10-22 15:37:43 +00:00
aiongg bf687928c2 Merge PR #5936: fix(ui): ensure turning View -> Snap off disables all snapping (#5782) 2026-10-22 15:37:43 +00:00
aiongg e1465cec6d Integration: #6837 hue_color and the Hue/Saturation spectrum use photocraft_color's hsb_to_rgb (the picker's own copy is gone on main) 2026-10-22 15:37:42 +00:00
aiongg 8600ae79b0 Merge PR #5631: Workspace: list saved workspaces in Window > Workspace and the switcher (#5610) 2026-10-22 15:37:42 +00:00
aiongg 40587f17e9 Merge PR #8219: Color Lookup lists the LUTs in a Preferences folder (#6558)
crates/ui-egui/Cargo.toml: kept main's photocraft-psd dev-dependency (testgen feature) and added the PR's tempfile dev-dependency
docs/scorecard.md: ours
2026-10-22 15:37:41 +00:00