diff --git a/ui/dr-ui/src/develop.rs b/ui/dr-ui/src/develop.rs index dca9911..4123c0a 100644 --- a/ui/dr-ui/src/develop.rs +++ b/ui/dr-ui/src/develop.rs @@ -2552,6 +2552,15 @@ impl DevelopSession { /// or reordered. pub(crate) fn reveal(&self) -> Option { use dr_pipeline::mask::{Reveal, RevealedLayer}; + // Only while masking. The eyes are per layer and outlive the mode, + // so a photographer coming back finds the layers they were looking + // at still lit — but a tint is a way of looking at a *mask*, and + // outside Local there is no mask being looked at. Without this the + // sky stayed red through Repair and back in Photo, a mode that had + // been left leaving its overlay behind (ui-navigation.md D-N1). + if !self.show_overlay { + return None; + } let layers: Vec = self .graph .masks() @@ -6986,6 +6995,27 @@ mod tests { /// — that the coverage is present, that it round-trips as bytes — would /// still pass if the raster came back at the wrong scale, upside down, or /// a threshold out. + #[test] + fn a_shown_mask_is_only_shown_while_masking() { + let Some(ctx) = headless() else { return }; + let mut s = session_with_a_left_half_subject(&ctx); + let id = s.add_subject_mask(0).expect("a subject layer"); + s.set_overlay(true); + s.set_mask_shown(&id, true); + assert!(s.any_mask_shown(), "lit, in Local mode"); + + // Leaving the mode — what `on_mode_picked` does for Photo and Spots. + s.set_overlay(false); + assert!( + !s.any_mask_shown(), + "the tint belongs to the mode, not to the photograph" + ); + assert!(s.mask_shown(&id), "the eye itself is remembered"); + + s.set_overlay(true); + assert!(s.any_mask_shown(), "and is lit again on return"); + } + #[test] fn a_stored_mask_renders_exactly_what_the_model_rendered() { let Some(ctx) = headless() else { return };