// 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 "windows/JFJochViewerImageListWindow.h" #include "windows/JFJochViewerMetadataWindow.h" #include "dbus/JFJochViewerAdaptor.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); 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(reader, this); viewer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); h_splitter->addWidget(viewer); auto side_panel = new JFJochViewerSidePanel(reader, 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(reader, this); dataset_info->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); v_splitter->addWidget(dataset_info); reading_worker = new JFJochImageReadingWorker(reader); reading_thread = new QThread(this); reading_worker->moveToThread(reading_thread); reading_thread->start(); auto tableWindow = new JFJochViewerImageListWindow(reader, this); auto metadataWindow = new JFJochViewerMetadataWindow(reader, 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, Qt::QueuedConnection); connect(this, &JFJochViewerWindow::LoadImageRequest, reading_worker, &JFJochImageReadingWorker::LoadImage, Qt::QueuedConnection); connect(menuBar, &JFJochViewerMenu::fileOpenSelected, reading_worker, &JFJochImageReadingWorker::LoadFile, Qt::QueuedConnection); connect(menuBar, &JFJochViewerMenu::fileCloseSelected, reading_worker, &JFJochImageReadingWorker::CloseFile, Qt::QueuedConnection); 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(reading_worker, &JFJochImageReadingWorker::imageLoaded, viewer,&JFJochViewerImage::loadImage, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::imageLoaded, side_panel, &JFJochViewerSidePanel::loadImage, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::imageStatsUpdated, side_panel, &JFJochViewerSidePanel::loadImage, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::noImageLoaded, side_panel, &JFJochViewerSidePanel::noImage, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::noImageLoaded, viewer, &JFJochViewerImage::noImage, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::imageNumberChanged, toolBar, &JFJochViewerToolbar::setImageNumber, Qt::QueuedConnection); connect(toolBar, &JFJochViewerToolbar::loadImage, reading_worker, &JFJochImageReadingWorker::LoadImage, Qt::QueuedConnection); 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, Qt::QueuedConnection); connect(viewer, &JFJochViewerImage::roiCircleUpdated, reading_worker, &JFJochImageReadingWorker::SetROICircle, Qt::QueuedConnection); connect(reading_worker, &JFJochImageReadingWorker::datasetLoaded, dataset_info, &JFJochViewerDatasetInfo::datasetLoaded, Qt::QueuedConnection); connect(metadataWindow, &JFJochViewerMetadataWindow::datasetUpdated, dataset_info, &JFJochViewerDatasetInfo::datasetLoaded); connect(reading_worker, &JFJochImageReadingWorker::imageLoaded, dataset_info, &JFJochViewerDatasetInfo::imageLoaded, Qt::QueuedConnection); connect(dataset_info, &JFJochViewerDatasetInfo::imageSelected, reading_worker, &JFJochImageReadingWorker::LoadImage, Qt::QueuedConnection); connect (reading_worker, &JFJochImageReadingWorker::datasetLoaded, tableWindow, &JFJochViewerImageListWindow::datasetLoaded, Qt::QueuedConnection); connect (reading_worker, &JFJochImageReadingWorker::datasetLoaded, metadataWindow, &JFJochViewerMetadataWindow::datasetLoaded, Qt::QueuedConnection); connect (reading_worker, &JFJochImageReadingWorker::imageLoaded, tableWindow, &JFJochViewerImageListWindow::imageLoaded, Qt::QueuedConnection); connect(tableWindow, &JFJochViewerImageListWindow::imageSelected, reading_worker, &JFJochImageReadingWorker::LoadImage, Qt::QueuedConnection); connect(metadataWindow, &JFJochViewerMetadataWindow::datasetUpdated, viewer, &JFJochViewerImage::loadImage); connect(side_panel, &JFJochViewerSidePanel::showSpots, viewer, &JFJochViewerImage::showSpots); 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); if (!file.isEmpty()) LoadFile(file); } JFJochViewerWindow::~JFJochViewerWindow() { if (reading_thread && reading_thread->isRunning()) { reading_thread->quit(); reading_thread->wait(); } delete reading_worker; } void JFJochViewerWindow::LoadFile(const QString &filename) { emit LoadFileRequest(filename); } void JFJochViewerWindow::LoadImage(qint64 image_number, qint64 summation) { emit LoadImageRequest(image_number, summation); }