// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochViewerImageROIStatistics.h" #include "QVBoxLayout" JFJochViewerImageROIStatistics::JFJochViewerImageROIStatistics(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); box_radio = new QRadioButton("Box", this); layout->addWidget(box_radio); box_settings = new JFJochViewerImageROIStatistics_Box(this); layout->addWidget(box_settings); circle_radio = new QRadioButton("Circle", this); layout->addWidget(circle_radio); circle_settings = new JFJochViewerImageROIStatistics_Circle(this); layout->addWidget(circle_settings); 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); layout->addWidget(new QLabel("", this)); roi_label = new QLabel("", this); layout->addWidget(roi_label); QPushButton *add_button = new QPushButton("Add ROI to user mask", this); connect(add_button, &QPushButton::clicked, [this]() { emit AddROIToUserMask(); }); layout->addWidget(add_button); QPushButton *sub_button = new QPushButton("Subtract ROI from user mask", this); connect(sub_button, &QPushButton::clicked, [this]() { emit SubtractROIFromUserMask(); }); layout->addWidget(sub_button); } void JFJochViewerImageROIStatistics::loadImage(std::shared_ptr image) { if (!image) { roi_label->setText(""); } else { auto roi = image->GetROI(); if (roi && roi->pixels > 0) { auto roi_npixel = static_cast(roi->pixels); double roi_mean_val = static_cast(roi->sum) / roi_npixel; double variance = static_cast(roi->sum_square) / roi_npixel - roi_mean_val * roi_mean_val; QString text = QString("Sum %1 Mean %2 Var %3 Max %4 Pixels %5") .arg(roi->sum) .arg(QString::number(roi_mean_val, 'f', 3)) .arg(QString::number(variance, 'f', 3)) .arg(roi->max_count) .arg(roi->pixels); roi_label->setText(text); } else { roi_label->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); }