From 8151fff436c0686132fee42abd3312c3ee35bae6 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 14 Nov 2025 15:27:25 +0100 Subject: [PATCH] jfjoch_viewer: Auto load moved to worker object --- viewer/JFJochImageReadingWorker.cpp | 64 +++++++++++++- viewer/JFJochImageReadingWorker.h | 24 +++++- viewer/JFJochViewerImageROIStatistics.cpp | 1 + viewer/JFJochViewerWindow.cpp | 6 +- viewer/toolbar/JFJochViewerToolbarImage.cpp | 95 +++++---------------- viewer/toolbar/JFJochViewerToolbarImage.h | 16 ++-- 6 files changed, 112 insertions(+), 94 deletions(-) diff --git a/viewer/JFJochImageReadingWorker.cpp b/viewer/JFJochImageReadingWorker.cpp index 43adccef..7a7d7cf3 100644 --- a/viewer/JFJochImageReadingWorker.cpp +++ b/viewer/JFJochImageReadingWorker.cpp @@ -18,6 +18,10 @@ JFJochImageReadingWorker::JFJochImageReadingWorker(const SpotFindingSettings& se indexing = std::make_unique(indexing_settings); http_reader.Experiment(experiment); file_reader.Experiment(experiment); + + autoload_timer = new QTimer(this); + autoload_timer->setInterval(autoload_interval); + connect(autoload_timer, &QTimer::timeout, this, &JFJochImageReadingWorker::AutoLoadTimerExpired); } void JFJochImageReadingWorker::LoadFile(const QString &filename, qint64 image_number, qint64 summation) { @@ -36,15 +40,15 @@ void JFJochImageReadingWorker::LoadFile(const QString &filename, qint64 image_nu total_images = http_reader.GetNumberOfImages(); dataset = http_reader.GetDataset(); if (image_number < 0) - emit setToolbarMode(JFJochViewerToolbarImage::ToolbarMode::Autoload); + setAutoLoadMode_i(AutoloadMode::HTTPSync); else - emit setToolbarMode(JFJochViewerToolbarImage::ToolbarMode::None); + setAutoLoadMode_i(AutoloadMode::None); } else { http_mode = false; file_reader.ReadFile(filename.toStdString()); total_images = file_reader.GetNumberOfImages(); dataset = file_reader.GetDataset(); - emit setToolbarMode(JFJochViewerToolbarImage::ToolbarMode::None); + setAutoLoadMode_i(AutoloadMode::None); } current_image.reset(); current_summation = 1; @@ -84,6 +88,7 @@ void JFJochImageReadingWorker::CloseFile() { void JFJochImageReadingWorker::LoadImage(int64_t image_number, int64_t summation) { QMutexLocker ul(&m); + setAutoLoadMode_i(AutoloadMode::None); if ((image_number == current_image) && (current_summation == summation)) return; LoadImage_i(image_number, summation); @@ -403,3 +408,56 @@ void JFJochImageReadingWorker::LoadCalibration(QString dataset) { } else logger.Info("HTTP mode doesn't allow to read calibration (at the moment"); } + +void JFJochImageReadingWorker::AutoLoadTimerExpired() { + QMutexLocker locker(&m); + switch (autoload_mode) { + case AutoloadMode::HTTPSync: + if (http_mode) + LoadImage_i(-1 , 1); + break; + case AutoloadMode::Movie: { + if (total_images == 0 || !current_image) + return; + int64_t new_image = (current_image.value() + jump_value) % total_images; + LoadImage_i(new_image, current_summation); + break; + } + case AutoloadMode::None: + break; + } +} + +void JFJochImageReadingWorker::setAutoLoadMode_i(AutoloadMode in_mode) { + autoload_mode = in_mode; + if (autoload_mode == AutoloadMode::None) + autoload_timer->stop(); + else + autoload_timer->start(); + emit autoloadChanged(autoload_mode); +} + +void JFJochImageReadingWorker::setAutoLoadMode(AutoloadMode mode) { + QMutexLocker ul(&m); + + switch (mode) { + case AutoloadMode::HTTPSync: + if (http_mode) + setAutoLoadMode_i(mode); + else + setAutoLoadMode_i(AutoloadMode::None); + break; + case AutoloadMode::Movie: + setAutoLoadMode_i(mode); + break; + case AutoloadMode::None: + setAutoLoadMode_i(mode); + break; + } +} + +void JFJochImageReadingWorker::setAutoLoadJump(int64_t val) { + QMutexLocker ul(&m); + if (val > 0) + jump_value = val; +} diff --git a/viewer/JFJochImageReadingWorker.h b/viewer/JFJochImageReadingWorker.h index 96ea60a0..6e2f1927 100644 --- a/viewer/JFJochImageReadingWorker.h +++ b/viewer/JFJochImageReadingWorker.h @@ -9,8 +9,7 @@ #include #include #include - -#include "toolbar/JFJochViewerToolbarImage.h" +#include #include "../reader/JFJochHDF5Reader.h" #include "../common/Logger.h" @@ -29,9 +28,15 @@ Q_DECLARE_METATYPE(std::shared_ptr) class JFJochImageReadingWorker : public QObject { Q_OBJECT +public: + enum class AutoloadMode {HTTPSync, Movie, None}; + Q_ENUM(AutoloadMode) +private: mutable QMutex m; bool http_mode = false; + AutoloadMode autoload_mode = AutoloadMode::None; + JFJochHDF5Reader file_reader; JFJochHttpReader http_reader; @@ -52,27 +57,38 @@ class JFJochImageReadingWorker : public QObject { std::optional current_image; int64_t current_summation = 1; int64_t total_images = 0; + int64_t jump_value = 1; Logger logger{"jfjoch_viewer"}; bool auto_reanalyze = false; + QTimer *autoload_timer; + int autoload_interval = 500; // milliseconds + void LoadImage_i(int64_t image_number, int64_t summation); void CalcROI_i(); void ReanalyzeImage_i(); void UpdateDataset_i(const DiffractionExperiment& experiment); void UpdateAzint_i(const JFJochReaderDataset *dataset); void UpdateUserMask_i(const std::vector &mask); + void setAutoLoadMode_i(AutoloadMode mode); + signals: void datasetLoaded(std::shared_ptr); void imageLoaded(std::shared_ptr); void imageStatsUpdated(std::shared_ptr); void imageNumberChanged(int64_t total_images, int64_t current_image); - void setToolbarMode(JFJochViewerToolbarImage::ToolbarMode input); void setRings(const QVector &v); void simpleImageLoaded(std::shared_ptr image); + void autoloadChanged(AutoloadMode mode); + public: JFJochImageReadingWorker(const SpotFindingSettings &settings, const DiffractionExperiment& experiment, QObject *parent = nullptr); ~JFJochImageReadingWorker() override = default; + +private slots: + void AutoLoadTimerExpired(); + public slots: void LoadFile(const QString &filename, qint64 image_number, qint64 summation); void CloseFile(); @@ -96,6 +112,8 @@ public slots: void ClearUserMask(); void LoadCalibration(QString dataset); + void setAutoLoadMode(AutoloadMode mode); + void setAutoLoadJump(int64_t val); }; diff --git a/viewer/JFJochViewerImageROIStatistics.cpp b/viewer/JFJochViewerImageROIStatistics.cpp index 164cac62..e7756223 100644 --- a/viewer/JFJochViewerImageROIStatistics.cpp +++ b/viewer/JFJochViewerImageROIStatistics.cpp @@ -3,6 +3,7 @@ #include "JFJochViewerImageROIStatistics.h" +#include #include #include diff --git a/viewer/JFJochViewerWindow.cpp b/viewer/JFJochViewerWindow.cpp index d69a3757..333c689e 100644 --- a/viewer/JFJochViewerWindow.cpp +++ b/viewer/JFJochViewerWindow.cpp @@ -224,8 +224,12 @@ JFJochViewerWindow::JFJochViewerWindow(QWidget *parent, bool dbus, const QString connect(tableWindow, &JFJochViewerImageListWindow::imageSelected, reading_worker, &JFJochImageReadingWorker::LoadImage); - connect(reading_worker, &JFJochImageReadingWorker::setToolbarMode, + connect(reading_worker, &JFJochImageReadingWorker::autoloadChanged, toolBarImage, &JFJochViewerToolbarImage::setAutoloadMode); + connect(toolBarImage, &JFJochViewerToolbarImage::autoLoadButtonPressed, + reading_worker, &JFJochImageReadingWorker::setAutoLoadMode); + connect(toolBarImage, &JFJochViewerToolbarImage::imageJumpChanged, + reading_worker, &JFJochImageReadingWorker::setAutoLoadJump); connect(side_panel, &JFJochViewerSidePanel::analyze, reading_worker, &JFJochImageReadingWorker::Analyze); diff --git a/viewer/toolbar/JFJochViewerToolbarImage.cpp b/viewer/toolbar/JFJochViewerToolbarImage.cpp index 7ffcfc21..0375726c 100644 --- a/viewer/toolbar/JFJochViewerToolbarImage.cpp +++ b/viewer/toolbar/JFJochViewerToolbarImage.cpp @@ -58,18 +58,16 @@ JFJochViewerToolbarImage::JFJochViewerToolbarImage(QWidget *parent) : QToolBar(p movie_button = new QPushButton("Movie ▶"); movie_button->setCheckable(true); + movie_button->setChecked(false); addWidget(movie_button); - movie_timer = new QTimer(this); - movie_timer->setInterval(movie_interval); - autoload_button = new QPushButton("Sync 🔄"); autoload_button->setCheckable(true); + autoload_button->setChecked(false); addWidget(autoload_button); connect(movie_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::movieButtonPressed); connect(autoload_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::autoloadButtonPressed); - connect(movie_timer, &QTimer::timeout, this, &JFJochViewerToolbarImage::movieTimerTimeout); auto *stretch = new QWidget(this); stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -120,11 +118,6 @@ void JFJochViewerToolbarImage::updateButtons() { } void JFJochViewerToolbarImage::setImageNumber(int64_t total_images, int64_t current_image) { - if (image_count_in_dataset != total_images && mode == ToolbarMode::Movie) { - mode = ToolbarMode::None; - updateAutoload(); - } - image_count_in_dataset = total_images; curr_image = current_image; updateButtons(); @@ -133,35 +126,25 @@ void JFJochViewerToolbarImage::setImageNumber(int64_t total_images, int64_t curr void JFJochViewerToolbarImage::leftButtonPressed() { if (curr_image >= jump_value) { emit loadImage(curr_image - jump_value, sum); - mode = ToolbarMode::None; - updateAutoload(); } } void JFJochViewerToolbarImage::rightButtonPressed() { if (curr_image < image_count_in_dataset - jump_value) { emit loadImage(curr_image + jump_value, sum); - mode = ToolbarMode::None; - updateAutoload(); } } void JFJochViewerToolbarImage::rightmostButtonPressed() { emit loadImage(image_count_in_dataset - 1, sum); - mode = ToolbarMode::None; - updateAutoload(); } void JFJochViewerToolbarImage::leftmostButtonPressed() { emit loadImage(0, sum); - mode = ToolbarMode::None; - updateAutoload(); } void JFJochViewerToolbarImage::imageNumberSliderPressed() { image_number_slider_manual = true; - mode = ToolbarMode::None; - updateAutoload(); } void JFJochViewerToolbarImage::imageNumberSliderReleased() { @@ -183,8 +166,6 @@ void JFJochViewerToolbarImage::editFinalized() { if (ok && editedValue >= 0 && editedValue <= image_count_in_dataset - 1) { emit loadImage(editedValue, sum); - mode = ToolbarMode::None; - updateAutoload(); } } @@ -192,8 +173,7 @@ void JFJochViewerToolbarImage::editFinalized() { void JFJochViewerToolbarImage::setImageJump(int val) { jump_value = val; updateButtons(); - mode = ToolbarMode::None; - updateAutoload(); + emit imageJumpChanged(jump_value); } void JFJochViewerToolbarImage::setSummation(int val) { @@ -203,72 +183,35 @@ void JFJochViewerToolbarImage::setSummation(int val) { updateButtons(); emit loadImage(curr_image, sum); - - mode = ToolbarMode::None; - updateAutoload(); } void JFJochViewerToolbarImage::autoloadButtonPressed() { - if (mode == ToolbarMode::Autoload) - mode = ToolbarMode::None; + if (autoload_button->isChecked()) + emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::HTTPSync); else - mode = ToolbarMode::Autoload; - updateAutoload(); + emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::None); } void JFJochViewerToolbarImage::movieButtonPressed() { - if (mode == ToolbarMode::Movie) - mode = ToolbarMode::None; + if (movie_button->isChecked()) + emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::Movie); else - mode = ToolbarMode::Movie; - updateAutoload(); + emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::None); } -void JFJochViewerToolbarImage::movieTimerTimeout() { - switch (mode) { - case ToolbarMode::Autoload: - emit loadImage(-1, 1); - break; - case ToolbarMode::Movie: - if (curr_image < image_count_in_dataset - jump_value) - emit loadImage(curr_image + jump_value, sum); - else - emit loadImage(0, sum); - break; - case ToolbarMode::None: - // Do nothing - break; - } -} - -void JFJochViewerToolbarImage::updateAutoload() { - switch (mode) { - case ToolbarMode::None: - autoload_button->setChecked(false); - movie_button->setChecked(false); - movie_timer->stop(); - break; - case ToolbarMode::Autoload: +void JFJochViewerToolbarImage::setAutoloadMode(JFJochImageReadingWorker::AutoloadMode input) { + switch (input) { + case JFJochImageReadingWorker::AutoloadMode::HTTPSync: autoload_button->setChecked(true); movie_button->setChecked(false); - movie_timer->start(); break; - case ToolbarMode::Movie: - if (image_count_in_dataset > 0) { - autoload_button->setChecked(false); - movie_button->setChecked(true); - movie_timer->start(); - } else { - autoload_button->setChecked(false); - movie_button->setChecked(false); - movie_timer->stop(); - mode = ToolbarMode::None; - } + case JFJochImageReadingWorker::AutoloadMode::Movie: + autoload_button->setChecked(false); + movie_button->setChecked(true); + break; + case JFJochImageReadingWorker::AutoloadMode::None: + autoload_button->setChecked(false); + movie_button->setChecked(false); break; } } - -void JFJochViewerToolbarImage::setAutoloadMode(JFJochViewerToolbarImage::ToolbarMode input) { - mode = input; - updateAutoload(); -} diff --git a/viewer/toolbar/JFJochViewerToolbarImage.h b/viewer/toolbar/JFJochViewerToolbarImage.h index e54d3099..7ec0b758 100644 --- a/viewer/toolbar/JFJochViewerToolbarImage.h +++ b/viewer/toolbar/JFJochViewerToolbarImage.h @@ -12,15 +12,12 @@ #include "../widgets/NumberLineEdit.h" #include "../widgets/NumericComboBox.h" +#include "../JFJochImageReadingWorker.h" class JFJochViewerToolbarImage : public QToolBar { Q_OBJECT -public: - enum class ToolbarMode {Autoload, Movie, None}; - Q_ENUM(ToolbarMode) -private: - ToolbarMode mode = ToolbarMode::None; + JFJochImageReadingWorker::AutoloadMode autoload_mode = JFJochImageReadingWorker::AutoloadMode::None; size_t image_count_in_dataset; int64_t curr_image; @@ -45,18 +42,16 @@ private: NumericComboBox *jump; - QTimer *movie_timer; - int movie_interval = 500; // milliseconds - void updateButtons(); - void updateAutoload(); signals: void loadImage(int64_t number, int summation); + void autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode mode); + void imageJumpChanged(int64_t val); public: explicit JFJochViewerToolbarImage(QWidget *parent = nullptr); public slots: void setImageNumber(int64_t total_images, int64_t current_image); - void setAutoloadMode(ToolbarMode input); + void setAutoloadMode(JFJochImageReadingWorker::AutoloadMode input); private slots: void leftButtonPressed(); void rightButtonPressed(); @@ -73,7 +68,6 @@ private slots: void movieButtonPressed(); void autoloadButtonPressed(); - void movieTimerTimeout(); }; #endif //JFJOCH_JFJOCHVIEWERTOOLBARIMAGE_H \ No newline at end of file