Files
Jungfraujoch/viewer/JFJochViewerWindow.cpp
2025-09-21 19:27:51 +02:00

282 lines
12 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "JFJochViewerWindow.h"
#include <QSplitter>
#include <QThread>
#include "JFJochImageReadingWorker.h"
#include "JFJochViewerImage.h"
#include "JFJochViewerSidePanel.h"
#include "JFJochViewerStatusBar.h"
#include "windows/JFJochViewerImageListWindow.h"
#include "windows/JFJochViewerMetadataWindow.h"
#include "dbus/JFJochViewerAdaptor.h"
#include "windows/JFJochViewerProcessingWindow.h"
#include "windows/JFJochViewerSpotListWindow.h"
#include "windows/JFJochViewerReflectionListWindow.h"
JFJochViewerWindow::JFJochViewerWindow(QWidget *parent, bool dbus, const QString &file) : QMainWindow(parent) {
menuBar = new JFJochViewerMenu(this);
setMenuBar(menuBar);
toolBar = new JFJochViewerToolbar(this);
addToolBar(toolBar);
auto statusbar = new JFJochViewerStatusBar(this);
setStatusBar(statusbar);
setStyleSheet(stylesheet);
setWindowTitle("Jungfraujoch image viewer");
resize(1200, 1200);
SpotFindingSettings spot_finding_settings = DiffractionExperiment::DefaultDataProcessingSettings();
IndexingSettings indexing_settings;
spot_finding_settings.high_resolution_limit = 0.5;
indexing_settings.IndexingThreads(1);
indexing_settings.Algorithm(IndexingAlgorithmEnum::Auto);
auto v_splitter = new QSplitter(this);
setCentralWidget(v_splitter);
v_splitter->setOrientation(Qt::Vertical);
auto h_splitter = new QSplitter(this);
h_splitter->setOrientation(Qt::Horizontal);
v_splitter->addWidget(h_splitter);
auto viewer = new JFJochViewerImage(this);
viewer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
h_splitter->addWidget(viewer);
auto side_panel = new JFJochViewerSidePanel(this);
side_panel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
auto side_panel_scroll = new QScrollArea(this);
side_panel_scroll->setWidget(side_panel);
side_panel_scroll->setWidgetResizable(true);
side_panel_scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
side_panel_scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
h_splitter->addWidget(side_panel_scroll);
dataset_info = new JFJochViewerDatasetInfo(this);
dataset_info->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
v_splitter->addWidget(dataset_info);
reading_worker = new JFJochImageReadingWorker(spot_finding_settings, indexing_settings);
reading_thread = new QThread(this);
reading_worker->moveToThread(reading_thread);
reading_thread->start();
auto tableWindow = new JFJochViewerImageListWindow(this);
auto metadataWindow = new JFJochViewerMetadataWindow(this);
auto spotWindow = new JFJochViewerSpotListWindow(this);
auto reflectionWindow = new JFJochViewerReflectionListWindow(this);
auto processingWindow = new JFJochViewerProcessingWindow(spot_finding_settings, indexing_settings, this);
new JFJochViewerAdaptor(this);
if (dbus) {
QDBusConnection connection = QDBusConnection::sessionBus();
if (!connection.registerService("ch.psi.jfjoch_viewer")) {
qWarning("Failed to register D-Bus service: %s", qPrintable(connection.lastError().message()));
} else {
if (!connection.registerObject("/", this)) {
qFatal("Failed to register D-Bus object: %s", qPrintable(connection.lastError().message()));
}
}
}
connect(this, &JFJochViewerWindow::LoadFileRequest,
reading_worker, &JFJochImageReadingWorker::LoadFile);
connect(this, &JFJochViewerWindow::LoadImageRequest,
reading_worker, &JFJochImageReadingWorker::LoadImage);
connect(menuBar, &JFJochViewerMenu::fileOpenSelected,
reading_worker, &JFJochImageReadingWorker::LoadFile);
connect(menuBar, &JFJochViewerMenu::fileCloseSelected,
reading_worker, &JFJochImageReadingWorker::CloseFile);
connect(menuBar, &JFJochViewerMenu::openImageListWindow,
tableWindow, &JFJochViewerImageListWindow::open);
connect(menuBar, &JFJochViewerMenu::closeImageListWindow,
tableWindow, &JFJochViewerImageListWindow::close);
connect(tableWindow, &JFJochViewerImageListWindow::closing,
menuBar, &JFJochViewerMenu::imageListWindowClosing);
connect(menuBar, &JFJochViewerMenu::openMetadataWindow,
metadataWindow, &JFJochViewerMetadataWindow::open);
connect(menuBar, &JFJochViewerMenu::closeMetadataWindow,
metadataWindow, &JFJochViewerMetadataWindow::close);
connect(metadataWindow, &JFJochViewerMetadataWindow::closing,
menuBar, &JFJochViewerMenu::metadataWindowClosing);
connect(menuBar, &JFJochViewerMenu::openSpotListWindow,
spotWindow, &JFJochViewerSpotListWindow::open);
connect(menuBar, &JFJochViewerMenu::closeSpotListWindow,
spotWindow, &JFJochViewerSpotListWindow::close);
connect(spotWindow, &JFJochViewerSpotListWindow::closing,
menuBar, &JFJochViewerMenu::spotListWindowClosing);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
viewer, &JFJochViewerImage::loadImage);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
side_panel, &JFJochViewerSidePanel::loadImage);
connect(reading_worker, &JFJochImageReadingWorker::imageStatsUpdated,
side_panel, &JFJochViewerSidePanel::loadImage);
connect(reading_worker, &JFJochImageReadingWorker::imageNumberChanged, toolBar,
&JFJochViewerToolbar::setImageNumber);
connect(toolBar, &JFJochViewerToolbar::loadImage, reading_worker, &JFJochImageReadingWorker::LoadImage);
connect(toolBar, &JFJochViewerToolbar::setForeground, viewer,
&JFJochViewerImage::changeForeground);
connect(toolBar, &JFJochViewerToolbar::colorMapChanged, viewer,
&JFJochViewerImage::setColorMap);
connect(viewer, &JFJochViewerImage::foregroundChanged,
toolBar, &JFJochViewerToolbar::updateForeground);
connect(viewer, &JFJochViewerImage::roiBoxUpdated,
reading_worker, &JFJochImageReadingWorker::SetROIBox);
connect(viewer, &JFJochViewerImage::roiCircleUpdated,
reading_worker, &JFJochImageReadingWorker::SetROICircle);
connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded,
dataset_info, &JFJochViewerDatasetInfo::datasetLoaded);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
dataset_info, &JFJochViewerDatasetInfo::imageLoaded);
connect(dataset_info, &JFJochViewerDatasetInfo::imageSelected,
reading_worker, &JFJochImageReadingWorker::LoadImage);
connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded,
tableWindow, &JFJochViewerImageListWindow::datasetLoaded);
connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded,
spotWindow, &JFJochViewerSpotListWindow::datasetLoaded);
connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded,
metadataWindow, &JFJochViewerMetadataWindow::datasetLoaded);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
tableWindow, &JFJochViewerImageListWindow::imageLoaded);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
spotWindow, &JFJochViewerSpotListWindow::imageLoaded);
connect(tableWindow, &JFJochViewerImageListWindow::imageSelected,
reading_worker, &JFJochImageReadingWorker::LoadImage);
connect(reading_worker, &JFJochImageReadingWorker::setToolbarMode,
toolBar, &JFJochViewerToolbar::setAutoloadMode);
connect(side_panel, &JFJochViewerSidePanel::findSpots,
reading_worker, &JFJochImageReadingWorker::FindSpots);
connect(side_panel, &JFJochViewerSidePanel::analyze,
reading_worker, &JFJochImageReadingWorker::Analyze);
connect(side_panel, &JFJochViewerSidePanel::findBeamCenter,
reading_worker, &JFJochImageReadingWorker::FindCenter);
connect(menuBar, &JFJochViewerMenu::openReflectionListWindow,
reflectionWindow, &JFJochViewerReflectionListWindow::open);
connect(menuBar, &JFJochViewerMenu::closeReflectionListWindow,
reflectionWindow, &JFJochViewerReflectionListWindow::close);
connect(reflectionWindow, &JFJochViewerReflectionListWindow::closing,
menuBar, &JFJochViewerMenu::reflectionListWindowClosing);
connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded,
reflectionWindow, &JFJochViewerReflectionListWindow::datasetLoaded);
connect(reading_worker, &JFJochImageReadingWorker::imageLoaded,
reflectionWindow, &JFJochViewerReflectionListWindow::imageLoaded);
connect(reflectionWindow, &JFJochViewerReflectionListWindow::reflectionSelected,
viewer, &JFJochViewerImage::centerOnSpot);
connect(menuBar, &JFJochViewerMenu::openProcessingWindow,
processingWindow, &JFJochViewerProcessingWindow::open);
connect(menuBar, &JFJochViewerMenu::closeProcessingWindow,
processingWindow, &JFJochViewerProcessingWindow::close);
connect(processingWindow, &JFJochViewerProcessingWindow::closing,
menuBar, &JFJochViewerMenu::processingWindowClosing);
connect(processingWindow, &JFJochViewerProcessingWindow::settingsChanged,
reading_worker, &JFJochImageReadingWorker::UpdateSpotFindingSettings);
connect(spotWindow, &JFJochViewerSpotListWindow::spotSelected,
viewer, &JFJochViewerImage::centerOnSpot);
connect(side_panel, &JFJochViewerSidePanel::showSpots,
viewer, &JFJochViewerImage::showSpots);
connect(side_panel, &JFJochViewerSidePanel::showPredictions,
viewer, &JFJochViewerImage::showPredictions);
connect(side_panel, &JFJochViewerSidePanel::autoResRings,
viewer, &JFJochViewerImage::setResolutionRingAuto);
connect(side_panel, &JFJochViewerSidePanel::setFeatureColor,
viewer, &JFJochViewerImage::setFeatureColor);
connect(side_panel, &JFJochViewerSidePanel::setSpotColor,
viewer, &JFJochViewerImage::setSpotColor);
connect(side_panel, &JFJochViewerSidePanel::showHighestPixels,
viewer, &JFJochViewerImage::showHighestPixels);
connect(side_panel, &JFJochViewerSidePanel::showSaturatedPixels,
viewer, &JFJochViewerImage::showSaturation);
connect(side_panel, &JFJochViewerSidePanel::setResRings,
viewer, &JFJochViewerImage::setResolutionRing);
connect(viewer, &JFJochViewerImage::writeStatusBar,
statusbar, &JFJochViewerStatusBar::display);
connect(metadataWindow, &JFJochViewerMetadataWindow::datasetUpdated,
reading_worker, &JFJochImageReadingWorker::UpdateDataset);
connect(reading_worker, &JFJochImageReadingWorker::setRings,
side_panel, &JFJochViewerSidePanel::setResRings);
connect(side_panel, &JFJochViewerSidePanel::highlightIceRings,
viewer, &JFJochViewerImage::highlightIceRings);
if (!file.isEmpty())
LoadFile(file, 0, 1);
}
JFJochViewerWindow::~JFJochViewerWindow() {
if (reading_thread && reading_thread->isRunning()) {
reading_thread->quit();
reading_thread->wait();
}
delete reading_worker;
}
void JFJochViewerWindow::LoadFile(const QString &filename, qint64 image_number, qint64 summation) {
emit LoadFileRequest(filename, image_number, summation);
}
void JFJochViewerWindow::LoadImage(qint64 image_number, qint64 summation) {
emit LoadImageRequest(image_number, summation);
}