jfjoch_viewer: Auto load moved to worker object

This commit is contained in:
2025-11-14 15:27:25 +01:00
parent d634491885
commit 8151fff436
6 changed files with 112 additions and 94 deletions
+61 -3
View File
@@ -18,6 +18,10 @@ JFJochImageReadingWorker::JFJochImageReadingWorker(const SpotFindingSettings& se
indexing = std::make_unique<IndexerThreadPool>(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;
}
+21 -3
View File
@@ -9,8 +9,7 @@
#include <QVector>
#include <QRect>
#include <QMutex>
#include "toolbar/JFJochViewerToolbarImage.h"
#include <QTimer>
#include "../reader/JFJochHDF5Reader.h"
#include "../common/Logger.h"
@@ -29,9 +28,15 @@ Q_DECLARE_METATYPE(std::shared_ptr<const SimpleImage>)
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<int64_t> 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<uint32_t> &mask);
void setAutoLoadMode_i(AutoloadMode mode);
signals:
void datasetLoaded(std::shared_ptr<const JFJochReaderDataset>);
void imageLoaded(std::shared_ptr<const JFJochReaderImage>);
void imageStatsUpdated(std::shared_ptr<const JFJochReaderImage>);
void imageNumberChanged(int64_t total_images, int64_t current_image);
void setToolbarMode(JFJochViewerToolbarImage::ToolbarMode input);
void setRings(const QVector<float> &v);
void simpleImageLoaded(std::shared_ptr<const SimpleImage> 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);
};
@@ -3,6 +3,7 @@
#include "JFJochViewerImageROIStatistics.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
+5 -1
View File
@@ -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);
+19 -76
View File
@@ -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();
}
+5 -11
View File
@@ -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