diff --git a/ui/dr-ui/ui/adjust.slint b/ui/dr-ui/ui/adjust.slint index 28197ea..ace5453 100644 --- a/ui/dr-ui/ui/adjust.slint +++ b/ui/dr-ui/ui/adjust.slint @@ -648,7 +648,12 @@ export component AdjustPanel inherits Rectangle { // competing for it. See the long note on `ParamSlider`'s `claimed`: without // this the Flickable takes any drag that drifts 8px vertically, which under // a finger is every drag. - private property slider-dragging: false; + /// True while a track has claimed a gesture. + /// + /// `out` rather than private because the Flickable that must stand down + /// for it is no longer in this component: the whole develop column + /// scrolls as one, so the panel reports the drag and the column obeys it. + out property slider-dragging: false; VerticalLayout { padding: Theme.gap; @@ -672,10 +677,13 @@ export component AdjustPanel inherits Rectangle { if !root.enabled: Caption { text: "No image"; } - if root.enabled: Flickable { - viewport-height: content.preferred-height; - interactive: !root.slider-dragging; - + // No Flickable here any more. The histogram, the capture metadata and + // the geometry controls sat *above* this one and could not be scrolled + // away, so on a 280px column in portrait they ate the height the + // sliders needed and the instrument the sliders are judged against was + // unreachable. The column scrolls as one now, and a scroller inside a + // scroller would give every drag a third thing to be lost to. + if root.enabled: VerticalLayout { content := VerticalLayout { spacing: 0px; alignment: start; diff --git a/ui/dr-ui/ui/app.slint b/ui/dr-ui/ui/app.slint index 149c2de..a12db25 100644 --- a/ui/dr-ui/ui/app.slint +++ b/ui/dr-ui/ui/app.slint @@ -1570,8 +1570,28 @@ in property panel-visible: true; width: root.panel-visible ? 280px : 0px; visible: root.panel-visible; background: Theme.surface; + clip: true; - VerticalLayout { + // **The whole column scrolls, histogram included.** + // + // Only the sliders used to. Everything above them — the + // capture metadata, the histogram, the geometry controls, + // copy and paste — was fixed, so on a 280px column in + // portrait they took the height the sliders needed and the + // histogram could not be moved out of the way. It is the + // instrument the sliders are judged against; being unable + // to scroll to it, or past it, is the worst of both. + // + // `interactive` stands down while a track has a gesture, + // the same arbitration `AdjustPanel` used to do for its own + // scroller — see the note on `SliderTrack`'s `claimed`. + // Without it every attempt to drag a slider would scroll + // the column instead. + Flickable { + viewport-height: column.preferred-height; + interactive: !adjust.slider-dragging; + + column := VerticalLayout { InfoPanel { camera: root.camera; exposure: root.exposure; @@ -1644,8 +1664,7 @@ in property panel-visible: true; background: Theme.rule; } - AdjustPanel { - vertical-stretch: 1; + adjust := AdjustPanel { rows: root.adjust-rows; enabled: root.adjust-enabled; curve-samples: root.curve-samples; @@ -1664,6 +1683,7 @@ in property panel-visible: true; op-reset(op) => { root.curve-reset(op); } reset-all => { root.reset-all(); } } + } } Rectangle {