Merge PR #2981: Issue #2819: the histogram stays SDR when HDR is switched off

crates/ui-egui/src/panels/edit/histogram.rs: live_hdr_histogram added above main's histogram() (now in edit/histogram.rs, pub(crate))
docs/parity-checklist.md: main's Histogram row with this PR's HDR-off clause
This commit is contained in:
aiongg
2026-10-31 02:09:32 +00:00
3 changed files with 32 additions and 2 deletions
+23 -1
View File
@@ -33,6 +33,13 @@ fn steady_hdr_histogram(ctx: &egui::Context, id: PhotoId, hdr_edit: bool, hist:
}
}
/// The histogram of the last drag's small HDR render, while an HDR edit of `id` is being dragged. It stays in
/// `Renderer` after the drag, so an edit with HDR switched off must not read it: its drags would show the old HDR
/// histogram (`dragging`: a drag of an HDR edit is on).
fn live_hdr_histogram(live: Option<&(PhotoId, u64, Histogram)>, id: PhotoId, dragging: bool) -> Option<Histogram> {
live.filter(|l| dragging && l.0 == id).map(|l| l.2.clone())
}
/// The histogram, its clipping buttons and the EXIF strip, drawn above the Edit panel's scrolling sliders
/// ([`crate::panels::right::show`]).
pub(crate) fn histogram(app: &mut LightcraftApp, ui: &mut egui::Ui, id: PhotoId) {
@@ -50,7 +57,7 @@ pub(crate) fn histogram(app: &mut LightcraftApp, ui: &mut egui::Ui, id: PhotoId)
app.renderer.request(Slot::HdrHistogram, job, 95);
}
}
let live = app.renderer.live_hdr_histogram.as_ref().filter(|l| interacting && l.0 == id).map(|l| l.2.clone());
let live = live_hdr_histogram(app.renderer.live_hdr_histogram.as_ref(), id, interacting && hdr_edit);
// else the loupe render of this photo, else its thumbnail (grid view before the loupe has
// rendered it)
let hist = live.or_else(|| preview_histogram(app, id));
@@ -344,6 +351,21 @@ mod tests {
assert_eq!(steady_hdr_histogram(&ctx, PhotoId(8), true, Some(sdr.clone())), Some(sdr));
}
/// Issue #2819: the last HDR drag's histogram is kept in `Renderer`; with HDR switched off, a drag must not read it.
#[test]
fn a_drag_with_hdr_off_does_not_read_the_last_hdr_drags_histogram() {
let id = PhotoId(7);
let kept = (id, 3, Histogram::of_hdr(&[[2.0, 2.0, 2.0]], 5.0));
assert!(kept.2.hdr.is_some());
// a drag of an HDR edit: the small HDR render's histogram
assert_eq!(live_hdr_histogram(Some(&kept), id, true), Some(kept.2.clone()));
// HDR switched off, a drag of the SDR edit: the panel's own (SDR) histogram
assert_eq!(live_hdr_histogram(Some(&kept), id, false), None);
// another photo, or nothing rendered yet
assert_eq!(live_hdr_histogram(Some(&kept), PhotoId(8), true), None);
assert_eq!(live_hdr_histogram(None, id, true), None);
}
/// Issue #1751: Windows and Linux read Ctrl where macOS reads Cmd, and a rebound shortcut shows.
#[test]
fn reset_tooltip_names_the_shortcut_of_this_platform() {
+2 -1
View File
@@ -139,7 +139,7 @@ differences and missing bindings are in [ui-parity.md](ui-parity.md#shortcuts).
| LR-VIEW-SLIDESHOW | Slideshow | P2 | ✅ | `cmd:view.slideshow` | View ▸ Slideshow (⌥⌘↩): the photos in view full screen from the selected one, played with the library's playback settings (see LRC-SS-PLAYBACK: fades, random order, repeat, previews prepared ahead; `interval` / any setting overrides one run); Space pauses, ←/→ step (a cut), Esc ends; playback controls on pointer movement |
| LR-VIEW-SECONDWINDOW | Second display window [Classic] | P2 | ✅ | `cmd:view.secondWindow`, `crates/ui-egui/src/panels/second.rs` | Window ▸ Second Window (⌘F11): the active photo fitted in its own native window with its own render (a floating panel where there are no native windows); loupe view only (no grid / compare / survey there) |
| LR-VIEW-CLIPPING | Clipping indicators | P0 | ✅ | `cmd:view.clipping` | |
| LR-VIEW-HISTOGRAM | Histogram | P0 | ✅ | `cmd:view.histogram`, `crates/ui-egui/src/panels/edit/histogram.rs`, `crates/ui-egui/src/panels/right.rs`, `crates/pipeline/src/lib.rs` (`hdr_histogram`) | stays at the top of the Edit panel while its sliders scroll under it (issue #2679, `the_histogram_stays_in_view_while_the_sliders_scroll`); HDR edits: SDR on the left half, the HDR range (0 to 5 stops above SDR white, a fixed scale) on the right with the headroom limit marked; colour bar (white, or Visualize HDR range's colours when that is on) and SDR / HDR labels; the plot's five tonal zones also drag to adjust their Basic control (LRC-DEV-HISTOGRAM-DRAG); it follows slider drags live (a small render beside the drafts, `Slot::HdrHistogram`) and never drops to the SDR layout mid-drag |
| LR-VIEW-HISTOGRAM | Histogram | P0 | ✅ | `cmd:view.histogram`, `crates/ui-egui/src/panels/edit/histogram.rs`, `crates/ui-egui/src/panels/right.rs`, `crates/pipeline/src/lib.rs` (`hdr_histogram`) | stays at the top of the Edit panel while its sliders scroll under it (issue #2679, `the_histogram_stays_in_view_while_the_sliders_scroll`); HDR edits: SDR on the left half, the HDR range (0 to 5 stops above SDR white, a fixed scale) on the right with the headroom limit marked; colour bar (white, or Visualize HDR range's colours when that is on) and SDR / HDR labels; the plot's five tonal zones also drag to adjust their Basic control (LRC-DEV-HISTOGRAM-DRAG); it follows slider drags of an HDR edit live (a small render beside the drafts, `Slot::HdrHistogram`) and never drops to the SDR layout mid-drag; an edit with HDR switched off keeps its SDR histogram while it is dragged (#2819) |
| LR-VIEW-HDR-DISPLAY | HDR display output | P2 | ⬜ | |, `apps/lightcraft/src/hdr_display.rs` (`choose`, `preferred_hdr_format`) | SDR/HDR decision (platform, surface format, OS headroom, `LIGHTCRAFT_HDR_DISPLAY=0`) is unit-tested and logged at start; always SDR today because eframe configures an 8-bit surface; no OS headroom query yet; |
## D. Search & filter (FILT)
@@ -799,6 +799,7 @@ Latin stays upright. Advanced Japanese composition remains open. Regression cove
| Date | Change | Summary |
|---|---|---|
| 2026-10-27 | patch | LR-VIEW-HISTOGRAM: an edit with HDR switched off no longer shows the last HDR drag's histogram while it is dragged (#2819); status unchanged |
| 2026-10-25 | patch | LR-BEHAV-TITLEBAR: the top bar's title-bar gestures come from craft-window's `title_bar`: a double-click follows the system setting, and a press on a button, the search field or a panel floating over the bar never moves the window; status counts unchanged |
| 2026-10-24 | minor | KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 (`keyword.nextSet`, `keyword.previousSet`) go to the next / previous keyword set; status counts unchanged (KEYC-METADATA stays 🟡) |
| 2026-10-24 | minor | KEYC-METADATA: ⌘K / Ctrl+K (`panel.addKeywords`, Add Keywords) shows the Keywords panel, opens Keywording and puts the cursor in the Add keyword box; status counts unchanged (KEYC-METADATA stays 🟡) |
+7
View File
@@ -1,5 +1,12 @@
# What's new in LightCraft
## 2026-10-30
### The histogram stays SDR when HDR is switched off
- After an HDR edit was dragged and HDR was then switched off, dragging a slider showed the old HDR histogram (with its
SDR / HDR colour bar) again until the drag ended. The histogram now follows the edit: an SDR edit shows the SDR
histogram while you drag, too.
## 2026-10-27
### The Edit menu groups Select Only Active Photo and Paste Settings from Previous with their kin