// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochViewerImageROIStatistics.h" #include #include JFJochViewerImageROIStatistics::JFJochViewerImageROIStatistics(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); box_radio = new QRadioButton("Box", this); box_settings = new JFJochViewerImageROIStatistics_Box(this); QHBoxLayout *box_row = new QHBoxLayout(); box_row->addWidget(box_radio); box_row->addWidget(box_settings); layout->addLayout(box_row); circle_radio = new QRadioButton("Circle", this); circle_settings = new JFJochViewerImageROIStatistics_Circle(this); QHBoxLayout *circle_row = new QHBoxLayout(); circle_row->addWidget(circle_radio); circle_row->addWidget(circle_settings); layout->addLayout(circle_row); radio_group = new QButtonGroup(this); radio_group->addButton(box_radio, 1); radio_group->addButton(circle_radio, 2); connect(box_radio, &QRadioButton::clicked, this, &JFJochViewerImageROIStatistics::BoxButtonClicked); connect(circle_radio, &QRadioButton::clicked, this, &JFJochViewerImageROIStatistics::CircleButtonClicked); connect(box_settings, &JFJochViewerImageROIStatistics_Box::Updated, this, &JFJochViewerImageROIStatistics::BoxButtonClicked); connect(circle_settings, &JFJochViewerImageROIStatistics_Circle::Updated, this, &JFJochViewerImageROIStatistics::CircleButtonClicked); circle_settings->Disable(); box_radio->setChecked(true); QHBoxLayout *label_row = new QHBoxLayout(); roi_sum = new QLabel("", this); label_row->addWidget(roi_sum); roi_mean = new QLabel("", this); label_row->addWidget(roi_mean); roi_var = new QLabel("", this); label_row->addWidget(roi_var); roi_max = new QLabel("", this); label_row->addWidget(roi_max); roi_npixel = new QLabel("", this); label_row->addWidget(roi_npixel); layout->addLayout(label_row); QPushButton *add_button = new QPushButton("Add ROI to user mask", this); connect(add_button, &QPushButton::clicked, [this]() { emit AddROIToUserMask(); }); QPushButton *sub_button = new QPushButton("Subtract ROI from user mask", this); connect(sub_button, &QPushButton::clicked, [this]() { emit SubtractROIFromUserMask(); }); QHBoxLayout *buttons_row = new QHBoxLayout(); buttons_row->setSpacing(12); buttons_row->addWidget(add_button); buttons_row->addWidget(sub_button); layout->addLayout(buttons_row); } void JFJochViewerImageROIStatistics::loadImage(std::shared_ptr image) { if (!image) { roi_sum->setText(""); roi_mean->setText(""); roi_var->setText(""); roi_max->setText(""); roi_npixel->setText(""); } else { auto roi = image->GetROI(); if (roi && roi->pixels > 0) { auto roi_npixel_val = static_cast(roi->pixels); double roi_mean_val = static_cast(roi->sum) / roi_npixel_val; double variance = static_cast(roi->sum_square) / roi_npixel_val - roi_mean_val * roi_mean_val; roi_sum->setText(QString("Sum %1").arg(roi->sum)); roi_mean->setText(QString("Mean %1").arg(QString::number(roi_mean_val, 'f', 3))); roi_var->setText(QString("Var %1").arg(QString::number(variance, 'f', 3))); roi_max->setText(QString("Max %1").arg(roi->max_count)); roi_npixel->setText(QString("Pixels %1").arg(roi->pixels)); } else { roi_sum->setText(""); roi_mean->setText(""); roi_var->setText(""); roi_max->setText(""); roi_npixel->setText(""); } } } void JFJochViewerImageROIStatistics::SetROIBox(QRect box) { box_radio->setChecked(true); box_settings->ROIBoxConfigured(box); circle_settings->Disable(); } void JFJochViewerImageROIStatistics::SetROICircle(double x, double y, double radius) { circle_radio->setChecked(true); circle_settings->SetROICircle(CircleSettings{.x = x, .y = y, .r = radius}); box_settings->Disable(); } void JFJochViewerImageROIStatistics::BoxButtonClicked() { box_radio->setChecked(true); box_settings->Enable(); circle_settings->Disable(); emit ROIBoxConfigured(box_settings->GetROIBox()); } void JFJochViewerImageROIStatistics::CircleButtonClicked() { circle_settings->Enable(); box_settings->Disable(); circle_radio->setChecked(true); auto tmp = circle_settings->GetROICircle(); emit ROICircleConfigured(tmp.x, tmp.y, tmp.r); }