Show a mask as soon as it is made
Benchmarks / CPU and I/O (per commit) (push) Successful in 3m52s
Benchmarks / Frame budget (on demand) (push) Skipped
Build and test / Desktop (Linux) (push) Failing after 39m53s
Build and test / Layer separation (push) Successful in 1m0s
🐳 Android image / Build and push (push) Successful in 4s
Build and test / android-image (push) Successful in 4s
Traceability / Requirement traces (push) Successful in 46s
Build and test / Android (aarch64) (push) Successful in 25m19s

Choosing a category is asking what it selected, and for a subject or a
category that question had no other answer on screen: the model's outline is
not derivable from anything visible, a fresh layer carries no adjustment to
judge it by, and the list it was chosen from says "architecture 23%" without
saying which 23%. The control that draws the mask existed but had to be found
and pressed, a panel's height away from the list the choice was made in.

So a new layer arrives with its mask showing, from the resting position only.
Somebody who has chosen the alpha or the outline keeps it, and nothing re-arms
in the background — every caller is a press that asked for a new mask.

That makes the canvas depend on how a layer arrived, which is correct and
worth stating: a session that has just made a mask draws a frame that a
session which read the same mask out of a sidecar does not. Viewing state is
not edit state and does not travel in a file, and
`a_stored_mask_renders_exactly_what_the_model_rendered` now says so at both
ends.
This commit is contained in:
2026-09-10 20:56:11 +02:00
parent 5d175cc668
commit ac0aea70ec
2 changed files with 50 additions and 6 deletions
+3 -6
View File
@@ -1027,14 +1027,11 @@ pub(crate) fn wire(
// until something is painted into it, so a press that made a row
// and left the pointer in "select" would be indistinguishable from
// a button that did nothing. The same reasoning as `on_part_added`
// below, and the tool's own handler turns the mask view on.
// below. Showing the mask is `DevelopSession::show_new_mask`'s
// job and every route to a new layer goes through it, so only the
// tool is set here.
if made {
w.global::<Masking>().set_tool(1);
if let Some(s) = session.borrow_mut().as_mut() {
if s.mask_view() == 0 {
s.set_mask_view(1);
}
}
}
sync(&w, &session);
sync_rows(&w, &rows, &session);