// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochViewerWindow.h" #include #include #include "JFJochImageReadingWorker.h" #include "JFJochViewerImage.h" #include "JFJochViewerSidePanel.h" #include "JFJochViewerStatusBar.h" #include "../common/CUDAWrapper.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(); spot_finding_settings.high_resolution_limit = 1.5; spot_finding_settings.indexing = true; IndexingSettings indexing_settings; indexing_settings.IndexingThreads(1); indexing_settings.Algorithm(IndexingAlgorithmEnum::Auto); if (get_gpu_count() == 0) { indexing_settings.Algorithm(IndexingAlgorithmEnum::FFTW); indexing_settings.FFT_NumVectors(8 * 1024); } indexing_settings.GeomRefinementAlgorithm(GeomRefinementAlgorithmEnum::BeamCenter); DiffractionExperiment experiment; experiment.ImportIndexingSettings(indexing_settings); experiment.DetectIceRings(true); 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, experiment); 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::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); }