From 42953a46e2abb408c9b2f9e981fb0dbf905ced90 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sun, 26 Jul 2026 18:59:45 +0200 Subject: [PATCH] Viewer: coalesce foreground/background recolours Ctrl+wheel, Shift+wheel and the foreground slider each recoloured the whole image synchronously, once per input event. On a large detector the recolour is slower than the events arrive, so they queued up and the view lagged behind the cursor for as long as the user kept scrolling. Defer the recolour to a zero-delay single shot and drop the intermediate values: at most one recolour is in flight, and it always uses the newest foreground/background. Co-Authored-By: Claude Opus 5 (1M context) --- viewer/image_viewer/JFJochImage.cpp | 17 +++++++++++++---- viewer/image_viewer/JFJochImage.h | 5 +++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/viewer/image_viewer/JFJochImage.cpp b/viewer/image_viewer/JFJochImage.cpp index 62ef5b1c..f1452e44 100644 --- a/viewer/image_viewer/JFJochImage.cpp +++ b/viewer/image_viewer/JFJochImage.cpp @@ -67,10 +67,20 @@ void JFJochImage::onScroll(int value) { updateOverlay(); } +void JFJochImage::ScheduleRenderImage() { + if (render_pending_) + return; + render_pending_ = true; + QTimer::singleShot(0, this, [this] { + render_pending_ = false; + RenderImage(); + Redraw(); + }); +} + void JFJochImage::changeBackground(float val) { background = val; - RenderImage(); - Redraw(); + ScheduleRenderImage(); } void JFJochImage::changeForeground(float val) { @@ -78,8 +88,7 @@ void JFJochImage::changeForeground(float val) { emit autoForegroundChanged(false); foreground = val; // Regenerate the image - RenderImage(); - Redraw(); + ScheduleRenderImage(); } void JFJochImage::setColorMap(int color_map) { diff --git a/viewer/image_viewer/JFJochImage.h b/viewer/image_viewer/JFJochImage.h index a6f9e3f2..623f8125 100644 --- a/viewer/image_viewer/JFJochImage.h +++ b/viewer/image_viewer/JFJochImage.h @@ -119,6 +119,11 @@ protected: void updateOverlay(); void RenderImage(); + // Re-render once the event queue drains. The foreground slider and the wheel emit far + // faster than a large image can be recoloured, so intermediate values are dropped + // instead of queueing a full recolour per event. + void ScheduleRenderImage(); + bool render_pending_ = false; void Redraw(); void CalcROI();