// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochViewerToolbarDisplay.h" #include #include "../../common/ColorScale.h" #include "../widgets/ToolbarIcons.h" constexpr double MAX_SLIDER_NO_IMAGE = 65000; JFJochViewerToolbarDisplay::JFJochViewerToolbarDisplay(QWidget *parent) : QToolBar(parent) { setWindowTitle("Display"); // shown in the toolbar/dock context menu addWidget(new QLabel(" Foreground ", this)); foreground_slider = new SliderPlusBox(1, MAX_SLIDER_NO_IMAGE, 1.0, 1, this, SliderPlusBox::ScaleType::Logarithmic); foreground_slider->setValue(10); foreground_slider->setToolTip("White point of the colour map (image contrast)"); foreground_slider->setStyleSheet( "QSlider::groove:horizontal { height:6px; background:#F3D9D4; border-radius:3px; }" "QSlider::sub-page:horizontal { background:#FA7268; border-radius:3px; }" "QSlider::handle:horizontal { background:#1F3A5F; width:14px; margin:-5px 0; border-radius:7px; }" "QSlider::handle:horizontal:hover { background:#16314F; }"); addWidget(foreground_slider); auto makeToggle = [this](const QString &text, const QString &tip) { auto *b = new QToolButton(this); b->setText(text); b->setToolButtonStyle(Qt::ToolButtonTextOnly); b->setCheckable(true); b->setToolTip(tip); b->setCursor(Qt::PointingHandCursor); b->setStyleSheet(ToolbarIcons::buttonStyle()); return b; }; auto_foreground_button = makeToggle("Auto", "Auto-contrast to the current image"); addWidget(auto_foreground_button); hdr_mode_button = makeToggle("HDR", "High dynamic range: show the full intensity range unclipped"); addWidget(hdr_mode_button); addWidget(new QLabel(" Colour map ", this)); // Initialize QComboBox with the options color_map_select = new QComboBox(this); color_map_select->addItem("Indigo", static_cast(ColorScaleEnum::Indigo)); color_map_select->addItem("Viridis", static_cast(ColorScaleEnum::Viridis)); color_map_select->addItem("Magma", static_cast(ColorScaleEnum::Magma)); color_map_select->addItem("Inferno", static_cast(ColorScaleEnum::Inferno)); color_map_select->addItem("Heat", static_cast(ColorScaleEnum::Heat)); color_map_select->addItem("Black on white", static_cast(ColorScaleEnum::BW)); color_map_select->addItem("White on black", static_cast(ColorScaleEnum::WB)); color_map_select->addItem("Green", static_cast(ColorScaleEnum::Green)); color_map_select->setCurrentIndex(static_cast(ColorScaleEnum::Indigo)); addWidget(color_map_select); connect(foreground_slider, &SliderPlusBox::valueChanged, this, &JFJochViewerToolbarDisplay::foregroundSet); connect(color_map_select, QOverload::of(&QComboBox::currentIndexChanged), this, &JFJochViewerToolbarDisplay::colorComboBoxSet); connect(auto_foreground_button, &QToolButton::clicked, this, &JFJochViewerToolbarDisplay::autoForegroundButtonPressed); connect(hdr_mode_button, &QToolButton::clicked, this, &JFJochViewerToolbarDisplay::HDRModeButtonPressed); auto *stretch = new QWidget(this); stretch->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); addWidget(stretch); } void JFJochViewerToolbarDisplay::foregroundSet(double val) { emit setForeground(static_cast(val)); } void JFJochViewerToolbarDisplay::updateForeground(float val) { QSignalBlocker blocker(foreground_slider); foreground_slider->setValue(val); } void JFJochViewerToolbarDisplay::colorComboBoxSet(int val) { emit colorMapChanged(val); } void JFJochViewerToolbarDisplay::autoForegroundButtonPressed() { emit setAutoForeground(auto_foreground_button->isChecked()); } void JFJochViewerToolbarDisplay::updateAutoForeground(bool val) { QSignalBlocker blocker(auto_foreground_button); auto_foreground_button->setChecked(val); } void JFJochViewerToolbarDisplay::HDRModeButtonPressed() { emit setHDRMode(hdr_mode_button->isChecked()); } void JFJochViewerToolbarDisplay::imageLoaded(std::shared_ptr image) { if (image) { auto valid = image->ValidMinMax(); if (valid.has_value() && valid->second > 1) foreground_slider->setMax(valid->second); else foreground_slider->setMax(MAX_SLIDER_NO_IMAGE); } else { foreground_slider->setMax(MAX_SLIDER_NO_IMAGE); } }