Complete pass over both toolbars (review items g–k), closing the toolbar topic. New ToolbarIcons: crisp QPainter vector glyphs (Qt SVG is not a build dep), with white "on" variants for toggles and a shared flat button style (coral hover, navy checked). Navigation toolbar, laid out source-first: - Open (3.5" diskette) · HTTP sync · Movie (reel-on-top camera, distinct from the next/play triangle) ║ the scrub slider, which expands to fill the bar (coral track, navy handle) so it is the obvious way to move across the data ║ precise navigation: first/prev/[number]/next/last, Jump, Sum. - Open and HTTP-sync reach the file / connect dialogs (JFJochViewerMenu openSelected and openHttpSelected, now public). - HTTP-sync has three states via a status dot (grey disconnected / green live / amber frozen); clicking with no live source attached opens the connect dialog. Removed the separate "Reanalyze" toggle. Display toolbar: - Styled foreground slider (matching), Auto/HDR as styled text toggles. Hero buttons: - "Reanalyze image" is now a toggle (worker ReanalyzeImages: run now + keep re-analysing on image/settings/processing changes; coral = active). Processing dock: - Drop the "New job…" toolbar action (the hero button drives it) and parent the job dialog to the main window instead of the dock. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
105 lines
4.5 KiB
C++
105 lines
4.5 KiB
C++
// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#include "JFJochViewerToolbarDisplay.h"
|
|
#include <QLabel>
|
|
#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<int>(ColorScaleEnum::Indigo));
|
|
color_map_select->addItem("Viridis", static_cast<int>(ColorScaleEnum::Viridis));
|
|
color_map_select->addItem("Magma", static_cast<int>(ColorScaleEnum::Magma));
|
|
color_map_select->addItem("Inferno", static_cast<int>(ColorScaleEnum::Inferno));
|
|
color_map_select->addItem("Heat", static_cast<int>(ColorScaleEnum::Heat));
|
|
color_map_select->addItem("Black on white", static_cast<int>(ColorScaleEnum::BW));
|
|
color_map_select->addItem("White on black", static_cast<int>(ColorScaleEnum::WB));
|
|
color_map_select->addItem("Green", static_cast<int>(ColorScaleEnum::Green));
|
|
|
|
color_map_select->setCurrentIndex(static_cast<int>(ColorScaleEnum::Indigo));
|
|
addWidget(color_map_select);
|
|
|
|
connect(foreground_slider, &SliderPlusBox::valueChanged, this, &JFJochViewerToolbarDisplay::foregroundSet);
|
|
connect(color_map_select, QOverload<int>::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<float>(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<const JFJochReaderImage> 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);
|
|
}
|
|
}
|