Files
Jungfraujoch/viewer/toolbar/JFJochViewerToolbarImage.cpp
Filip Leonarski 05410d7cb3
All checks were successful
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 8m46s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 7m52s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m9s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m43s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m11s
Build Packages / Generate python client (push) Successful in 14s
Build Packages / Build documentation (push) Successful in 39s
Build Packages / Create release (push) Has been skipped
Build Packages / build:rpm (rocky8) (push) Successful in 8m26s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m51s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 8m36s
Build Packages / build:rpm (rocky9) (push) Successful in 9m20s
Build Packages / Unit tests (push) Successful in 1h12m50s
v1.0.0-rc.109 (#15)
This is an UNSTABLE release.

* jfjoch_viewer: Add keyboard shortcuts and option to copy image to clipboard
* jfjoch_broker: Fix bit-width and exposure time for PSI EIGER detectors

Reviewed-on: #15
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>
2025-11-26 13:48:59 +01:00

231 lines
8.2 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "JFJochViewerToolbarImage.h"
#include <QTimer>
JFJochViewerToolbarImage::JFJochViewerToolbarImage(QWidget *parent) : QToolBar(parent) {
image_count_in_dataset = 0;
auto title = new QLabel("<b>Image number</b> ", this);
addWidget(title);
leftmost_button = new QPushButton("|⇐", this);
leftmost_button->setFixedWidth(32);
addWidget(leftmost_button);
left_button = new QPushButton("", this);
left_button->setFixedWidth(32);
addWidget(left_button);
current_image_edit_validator = new QIntValidator(0, 1000, this);
current_image_edit = new QLineEdit("0", this);
current_image_edit->setFixedWidth(50);
current_image_edit->setAlignment(Qt::AlignmentFlag::AlignRight);
current_image_edit->setValidator(current_image_edit_validator);
addWidget(current_image_edit);
total_number_label = new QLabel("/0", this);
addWidget(total_number_label);
right_button = new QPushButton("", this);
right_button->setFixedWidth(32);
addWidget(right_button);
rightmost_button = new QPushButton("⇒|", this);
rightmost_button->setFixedWidth(32);
addWidget(rightmost_button);
addWidget(new QLabel(" Jump:", this));
jump = new NumericComboBox({1, 2, 5, 10, 20, 100, 500}, 1, 999, this);
connect(jump, &NumericComboBox::valueChanged, this, &JFJochViewerToolbarImage::setImageJump);
addWidget(jump);
addWidget(new QLabel(" Sum:", this));
auto sum = new NumericComboBox({1, 2, 5, 10, 20, 50, 100}, 1, 10000, this);
connect(sum, &NumericComboBox::valueChanged, this, &JFJochViewerToolbarImage::setSummation);
addWidget(sum);
image_number_slider = new QSlider(Qt::Horizontal, this);
addWidget(image_number_slider);
image_number_slider_timer = new QTimer(this);
image_number_slider_timer->setSingleShot(true);
movie_button = new QPushButton("&Movie");
movie_button->setCheckable(true);
movie_button->setChecked(false);
movie_button->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_M));
addWidget(movie_button);
autoload_button = new QPushButton("HTTP &Sync");
autoload_button->setCheckable(true);
autoload_button->setChecked(false);
autoload_button->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S));
addWidget(autoload_button);
reanalyze_button = new QPushButton("&Reanalyze");
reanalyze_button->setCheckable(true);
reanalyze_button->setChecked(false);
reanalyze_button->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
addWidget(reanalyze_button);
connect(movie_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::movieButtonPressed);
connect(autoload_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::autoloadButtonPressed);
connect(reanalyze_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::reanalyzeButtonPressed);
auto *stretch = new QWidget(this);
stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
addWidget(stretch);
setImageNumber(0, 0);
connect(left_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::leftButtonPressed);
connect(right_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::rightButtonPressed);
connect(leftmost_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::leftmostButtonPressed);
connect(rightmost_button, &QPushButton::clicked, this, &JFJochViewerToolbarImage::rightmostButtonPressed);
connect(current_image_edit, &QLineEdit::editingFinished, this, &JFJochViewerToolbarImage::editFinalized);
connect(image_number_slider, &QSlider::sliderPressed, this, &JFJochViewerToolbarImage::imageNumberSliderPressed);
connect(image_number_slider, &QSlider::sliderReleased, this, &JFJochViewerToolbarImage::imageNumberSliderReleased);
connect(image_number_slider, &QSlider::sliderMoved, this, &JFJochViewerToolbarImage::imageNumberSliderMoved);
}
void JFJochViewerToolbarImage::updateButtons() {
if (image_count_in_dataset > 0) {
current_image_edit->setDisabled(false);
current_image_edit->setText(QString::number(curr_image));
current_image_edit_validator->setRange(0, image_count_in_dataset - 1);
left_button->setDisabled(curr_image < jump_value);
right_button->setDisabled(curr_image >= image_count_in_dataset - jump_value);
leftmost_button->setDisabled(curr_image == 0);
rightmost_button->setDisabled(curr_image == image_count_in_dataset - 1);
image_number_slider->setRange(0, image_count_in_dataset - 1);
image_number_slider->setEnabled(true);
if (!image_number_slider_manual)
image_number_slider->setValue(curr_image);
} else {
left_button->setDisabled(true);
right_button->setDisabled(true);
leftmost_button->setDisabled(true);
rightmost_button->setDisabled(true);
current_image_edit->setText(QString::number(0));
image_number_slider->setValue(0);
image_number_slider->setDisabled(true);
}
if (image_count_in_dataset == 0)
total_number_label->setText("/ - ");
else
total_number_label->setText("/" + QString::number(image_count_in_dataset - 1));
}
void JFJochViewerToolbarImage::setImageNumber(int64_t total_images, int64_t current_image) {
image_count_in_dataset = total_images;
curr_image = current_image;
updateButtons();
}
void JFJochViewerToolbarImage::leftButtonPressed() {
if (curr_image >= jump_value) {
emit loadImage(curr_image - jump_value, sum);
}
}
void JFJochViewerToolbarImage::rightButtonPressed() {
if (curr_image < image_count_in_dataset - jump_value) {
emit loadImage(curr_image + jump_value, sum);
}
}
void JFJochViewerToolbarImage::rightmostButtonPressed() {
emit loadImage(image_count_in_dataset - 1, sum);
}
void JFJochViewerToolbarImage::leftmostButtonPressed() {
emit loadImage(0, sum);
}
void JFJochViewerToolbarImage::imageNumberSliderPressed() {
image_number_slider_manual = true;
}
void JFJochViewerToolbarImage::imageNumberSliderReleased() {
image_number_slider_manual = false;
int val = image_number_slider->value();
emit loadImage(val, sum);
}
void JFJochViewerToolbarImage::imageNumberSliderMoved(int val) {
if (!image_number_slider_timer->isActive()) {
emit loadImage(val, sum);
image_number_slider_timer->start(300);
}
}
void JFJochViewerToolbarImage::editFinalized() {
bool ok;
int editedValue = current_image_edit->text().toInt(&ok);
if (ok && editedValue >= 0 && editedValue <= image_count_in_dataset - 1) {
emit loadImage(editedValue, sum);
}
}
void JFJochViewerToolbarImage::setImageJump(int val) {
jump_value = val;
updateButtons();
emit imageJumpChanged(jump_value);
}
void JFJochViewerToolbarImage::setSummation(int val) {
sum = val;
jump_value = val;
jump->setValue(val);
updateButtons();
emit loadImage(curr_image, sum);
}
void JFJochViewerToolbarImage::autoloadButtonPressed() {
if (autoload_button->isChecked())
emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::HTTPSync);
else
emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::None);
}
void JFJochViewerToolbarImage::movieButtonPressed() {
if (movie_button->isChecked())
emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::Movie);
else
emit autoLoadButtonPressed(JFJochImageReadingWorker::AutoloadMode::None);
}
void JFJochViewerToolbarImage::reanalyzeButtonPressed() {
emit reanalyzeImages(reanalyze_button->isChecked());
}
void JFJochViewerToolbarImage::setAutoloadMode(JFJochImageReadingWorker::AutoloadMode input) {
switch (input) {
case JFJochImageReadingWorker::AutoloadMode::HTTPSync:
autoload_button->setChecked(true);
movie_button->setChecked(false);
break;
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;
}
}