// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochViewerToolbarImage.h" #include JFJochViewerToolbarImage::JFJochViewerToolbarImage(QWidget *parent) : QToolBar(parent) { image_count_in_dataset = 0; auto title = new QLabel("Image number ", 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; } }