dff8bfd0e4
Integration: a unit per field, no Percent, not remembered, as in Photoshop ( #7922 )
...
Photoshop's Create Rectangle switches only the right-clicked field
(Width 35.28 mm, Height still 100 px), lists the six length units
without Percent, and opens in pixels again after OK. The PR shared one
unit between both fields, offered Percent, and saved the unit on every
OK, so after one use with the rulers in px the dialog stayed in px even
after the rulers changed to cm, though no unit was ever picked.
Now each field has its own widthUnit / heightUnit (set only by the
menu, never remembered), and the menu is rulers::unit_menu_of with
LENGTH_UNITS. The new test right-clicks the real field and clicks the
menu item through egui input.
Co-authored-by: Korg1ch <57859048+Korg1ch@users.noreply.github.com >
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-22 15:41:21 +00:00
34c9d0ea4d
Integration: History follows the history, not every revision, and never moves a visible row ( #5940 )
...
The panel scrolled with `scroll_to_rect(current, Some(Align::BOTTOM))` on every revision
change. In egui an explicit alignment always realigns, and the revision also changes when
nothing in the history does (selecting a layer, a channel eye). So clicking a visible older
state slid it to the bottom under the pointer, Undo hid the greyed redo states, a layer click
threw a user who had scrolled up back to the bottom, and selecting a snapshot scrolled it out
of view.
Now the panel follows the history position (document, past/redo counts, current name, and the
newest past state, which also changes at the state limit), skips it while a snapshot is
selected, and scrolls without alignment, so only a hidden current row moves into view. New
tests: a clicked visible state stays put, Undo keeps the redo state in view, a layer click keeps
the scroll, a selected snapshot stays in view, a new state at the limit is revealed; the first
three fail on the PR head, the others without the snapshot guard / the newest-state key.
Co-authored-by: nrq6993-a11y <342501791+nrq6993-a11y@users.noreply.github.com >
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-22 15:41:21 +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