diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake index c529e1d9df..d05f61bb36 100644 --- a/Plugins/PluginList.cmake +++ b/Plugins/PluginList.cmake @@ -1,111 +1,112 @@ # Plug-ins must be ordered according to their dependencies set(MITK_PLUGINS org.blueberry.core.runtime:ON org.blueberry.core.expressions:OFF org.blueberry.core.commands:OFF org.blueberry.core.jobs:OFF org.blueberry.ui.qt:OFF org.blueberry.ui.qt.help:ON org.blueberry.ui.qt.log:ON org.blueberry.ui.qt.objectinspector:OFF #org.blueberry.test:ON #org.blueberry.uitest:ON #Testing/org.blueberry.core.runtime.tests:ON #Testing/org.blueberry.osgi.tests:ON org.mitk.core.services:ON org.mitk.gui.common:ON org.mitk.planarfigure:ON org.mitk.core.ext:OFF org.mitk.core.jobs:OFF org.mitk.gui.qt.application:ON org.mitk.gui.qt.coreapplication:OFF org.mitk.gui.qt.ext:OFF org.mitk.gui.qt.extapplication:OFF org.mitk.gui.qt.common:ON org.mitk.gui.qt.stdmultiwidgeteditor:ON org.mitk.gui.qt.common.legacy:OFF org.mitk.gui.qt.cmdlinemodules:OFF org.mitk.gui.qt.diffusionimagingapp:OFF org.mitk.gui.qt.datamanager:ON org.mitk.gui.qt.datamanagerlight:OFF org.mitk.gui.qt.datastorageviewertest:OFF org.mitk.gui.qt.properties:ON org.mitk.gui.qt.basicimageprocessing:OFF org.mitk.gui.qt.dicom:OFF org.mitk.gui.qt.dicominspector:OFF org.mitk.gui.qt.diffusionimaging:OFF org.mitk.gui.qt.diffusionimaging.connectomics:OFF org.mitk.gui.qt.diffusionimaging.denoising:OFF org.mitk.gui.qt.diffusionimaging.fiberfox:OFF org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF org.mitk.gui.qt.diffusionimaging.ivim:OFF org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF org.mitk.gui.qt.diffusionimaging.partialvolume:OFF org.mitk.gui.qt.diffusionimaging.preprocessing:OFF org.mitk.gui.qt.diffusionimaging.reconstruction:OFF org.mitk.gui.qt.diffusionimaging.registration:OFF org.mitk.gui.qt.diffusionimaging.tbss:OFF org.mitk.gui.qt.diffusionimaging.tractography:OFF org.mitk.gui.qt.diffusionimaging.python:OFF org.mitk.gui.qt.dosevisualization:OFF org.mitk.gui.qt.geometrytools:OFF org.mitk.gui.qt.igtexamples:OFF org.mitk.gui.qt.igttracking:OFF org.mitk.gui.qt.lasercontrol:OFF org.mitk.gui.qt.openigtlink:OFF org.mitk.gui.qt.imagecropper:OFF org.mitk.gui.qt.imagenavigator:ON org.mitk.gui.qt.viewnavigator:OFF org.mitk.gui.qt.materialeditor:OFF org.mitk.gui.qt.measurementtoolbox:OFF org.mitk.gui.qt.moviemaker:OFF org.mitk.gui.qt.pointsetinteraction:OFF org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF org.mitk.gui.qt.python:OFF org.mitk.gui.qt.remeshing:OFF org.mitk.gui.qt.segmentation:OFF org.mitk.gui.qt.aicpregistration:OFF org.mitk.gui.qt.renderwindowmanager:OFF org.mitk.gui.qt.toftutorial:OFF org.mitk.gui.qt.tofutil:OFF org.mitk.gui.qt.tubegraph:OFF org.mitk.gui.qt.ugvisualization:OFF org.mitk.gui.qt.photoacoustics.pausviewer:OFF org.mitk.gui.qt.photoacoustics.imageprocessing:OFF org.mitk.gui.qt.photoacoustics.simulation:OFF org.mitk.gui.qt.ultrasound:OFF org.mitk.gui.qt.volumevisualization:OFF org.mitk.gui.qt.eventrecorder:OFF org.mitk.gui.qt.xnat:OFF org.mitk.gui.qt.igt.app.echotrack:OFF org.mitk.gui.qt.spectrocamrecorder:OFF org.mitk.gui.qt.classificationsegmentation:OFF org.mitk.gui.qt.overlaymanager:OFF org.mitk.gui.qt.igt.app.hummelprotocolmeasurements:OFF org.mitk.gui.qt.multilabelsegmentation:OFF org.mitk.matchpoint.core.helper:OFF org.mitk.gui.qt.matchpoint.algorithm.browser:OFF org.mitk.gui.qt.matchpoint.algorithm.control:OFF org.mitk.gui.qt.matchpoint.algorithm.batch:OFF org.mitk.gui.qt.matchpoint.mapper:OFF org.mitk.gui.qt.matchpoint.framereg:OFF org.mitk.gui.qt.matchpoint.visualizer:OFF org.mitk.gui.qt.matchpoint.evaluator:OFF org.mitk.gui.qt.matchpoint.manipulator:OFF org.mitk.gui.qt.preprocessing.resampling:OFF org.mitk.gui.qt.cest:OFF org.mitk.gui.qt.fit.demo:OFF org.mitk.gui.qt.fit.inspector:OFF org.mitk.gui.qt.fit.genericfitting:OFF org.mitk.gui.qt.pharmacokinetics.mri:OFF org.mitk.gui.qt.pharmacokinetics.pet:OFF org.mitk.gui.qt.pharmacokinetics.simulation:OFF org.mitk.gui.qt.pharmacokinetics.curvedescriptor:OFF org.mitk.gui.qt.pharmacokinetics.concentration.mri:OFF + org.mitk.gui.qt.dynamicmappers:ON ) diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt b/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt new file mode 100644 index 0000000000..15215a3ef3 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt @@ -0,0 +1,7 @@ +project(org_mitk_gui_qt_dynamicmappers) + +mitk_create_plugin( + EXPORT_DIRECTIVE RTDOSEVISUALIZATION_EXPORT + EXPORTED_INCLUDE_SUFFIXES src + MODULE_DEPENDS MitkDynamicMappers +) diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake b/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake new file mode 100644 index 0000000000..98e1eac207 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake @@ -0,0 +1,41 @@ +set(SRC_CPP_FILES +) + +set(INTERNAL_CPP_FILES + org_mitk_gui_qt_dynamicmappers_Activator.cpp + DynamicMappersView.cpp +) + +set(UI_FILES + src/internal/DynamicMappersViewControls.ui +) + +set(MOC_H_FILES + src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h + src/internal/DynamicMappersView.h +) + +# list of resource files which can be used by the plug-in +# system without loading the plug-ins shared library, +# for example the icon used in the menu and tabs for the +# plug-in views in the workbench +set(CACHED_RESOURCE_FILES + resources/iso.png + plugin.xml +) + +# list of Qt .qrc files which contain additional resources +# specific to this plugin +set(QRC_FILES + +) + +set(CPP_FILES ) + +foreach(file ${SRC_CPP_FILES}) + set(CPP_FILES ${CPP_FILES} src/${file}) +endforeach(file ${SRC_CPP_FILES}) + +foreach(file ${INTERNAL_CPP_FILES}) + set(CPP_FILES ${CPP_FILES} src/internal/${file}) +endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake new file mode 100644 index 0000000000..6775f0fdf1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake @@ -0,0 +1,5 @@ +set(Plugin-Name "DynamicMappers") +set(Plugin-Version "0.1") +set(Plugin-Vendor "DKFZ, Software development for Integrated Diagnostic and Therapy") +set(Plugin-ContactAddress "simon.jung@dkfz-heidelberg.de") +set(Require-Plugin org.mitk.gui.qt.common org.commontk.eventadmin) diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml b/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml new file mode 100644 index 0000000000..766c7189a6 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png b/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png new file mode 100644 index 0000000000..dbe8dccdcf Binary files /dev/null and b/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png differ diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp new file mode 100644 index 0000000000..570afd2da1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp @@ -0,0 +1,167 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "DynamicMappersView.h" +#include +#include +#include +#include + +DynamicMappersView::DynamicMappersView() : m_Parent(nullptr), m_Controls(Ui::DynamicMappersViewControls()) {} + +void DynamicMappersView::RefreshServiceList() +{ + auto mapperInfoCollection = mitk::DynamicMappers::GetInstance()->GetRegisteredServiceInfo(); + if (mapperInfoCollection.empty()) + return; + + QStringList header = {"id", "name", "dataType", "module", "scope", "slot", "priority"}; + m_Controls.mapperInfoTableWidget->clear(); + m_Controls.mapperInfoTableWidget->setColumnCount(header.size()); + m_Controls.mapperInfoTableWidget->setHorizontalHeaderLabels(header); + m_Controls.mapperInfoTableWidget->setRowCount(mapperInfoCollection.size()); + for (unsigned int y = 0; y < mapperInfoCollection.size(); ++y) + { + const auto mapperInfo = mapperInfoCollection[y]; + + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("id"), new QTableWidgetItem(QString::number(mapperInfo.id))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("name"), new QTableWidgetItem(QString::fromStdString(mapperInfo.name))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("dataType"), new QTableWidgetItem(QString::fromStdString(mapperInfo.dataType))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("module"), new QTableWidgetItem(QString::fromStdString(mapperInfo.module))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("scope"), new QTableWidgetItem(QString::fromStdString(mapperInfo.scope))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("slot"), new QTableWidgetItem(QString::number(mapperInfo.slot))); + m_Controls.mapperInfoTableWidget->setItem( + y, header.indexOf("priority"), new QTableWidgetItem(QString::number(mapperInfo.priority))); + } + for (auto item : m_Controls.mapperInfoTableWidget->findItems("", Qt::MatchContains)) + { + item->setFlags(item->flags() ^ Qt::ItemIsEditable ^ Qt::ItemIsSelectable); + } +} + +void DynamicMappersView::OnAddMapperServiceClicked() +{ + const auto path = + QFileDialog::getOpenFileName(nullptr, "Open mapper service", "", "Mapper Services (*.dll)").toStdString(); + mitk::DynamicMappers::GetInstance()->LoadSharedLibrary(path); + this->RefreshServiceList(); + this->RefreshServiceSelector(); +} + +void DynamicMappersView::OnUnloadClicked() +{ + mitk::DynamicMappers::GetInstance()->UnloadAllSharedLibraries(); + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + this->RefreshServiceList(); + this->RefreshServiceSelector(); +} + +void DynamicMappersView::OnServiceSelectionChanged(QString newText) +{ + if (m_SelectedNode.IsNull()) + return; + + QStringList info = newText.split('\t'); + if (info.empty()) + return; + + bool conversionSuccess; + const int id = info[0].toInt(&conversionSuccess); + if (!conversionSuccess) + return; + + mitk::DynamicMappers::GetInstance()->ChangeMapperService(m_SelectedNode, id); + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} + +void DynamicMappersView::CreateQtPartControl(QWidget *parent) +{ + m_Parent = parent; + m_Controls.setupUi(parent); + + connect(m_Controls.addBtn, SIGNAL(clicked()), this, SLOT(OnAddMapperServiceClicked())); + connect( + m_Controls.cbServiceSelector, SIGNAL(currentTextChanged(QString)), this, SLOT(OnServiceSelectionChanged(QString))); + connect(m_Controls.unloadBtn, SIGNAL(clicked()), this, SLOT(OnUnloadClicked())); + m_Parent->setEnabled(false); +} + +void DynamicMappersView::SetFocus() +{ + m_Parent->setEnabled(true); + this->RefreshServiceList(); +} + +void DynamicMappersView::RefreshServiceSelector() +{ + m_Controls.cbServiceSelector->clear(); + if (m_SelectedNode.IsNull()) + { + m_Controls.lblNodeName->setText("Select a node to change the mapper"); + return; + } + + m_Controls.lblNodeName->setText(QString::fromStdString(m_SelectedNode->GetName())); + + QStringList serviceElements; + auto mapperInfoCollection = mitk::DynamicMappers::GetInstance()->GetRegisteredServiceInfo(); + for (auto &mapperInfo : mapperInfoCollection) + { + if (mapperInfo.dataType == m_SelectedNode->GetData()->GetNameOfClass()) + { + QString serviceId = QString::number(mapperInfo.id); + QString slotId = QString::number(mapperInfo.slot); + QString serviceName = QString::fromStdString(mapperInfo.name); + + QString info = serviceId.append('\t').append("\tslot_").append(slotId); + + bool conversionSuccess = false; + auto currentMapper = m_SelectedNode->GetMapper(slotId.toInt(&conversionSuccess)); + if (!conversionSuccess || nullptr == currentMapper) + { + continue; + } + if (serviceName == currentMapper->GetNameOfClass()) + { + // If we got the currently used mapper service add it directly so it is the default selection + m_Controls.cbServiceSelector->addItem(info); + } + else + { + // All other mapper services are loaded collectively in the end + serviceElements.append(info); + } + } + } + if (m_Controls.cbServiceSelector->count() == 0) + { + m_Controls.cbServiceSelector->addItem("Internal Mapper used"); + } + m_Controls.cbServiceSelector->addItems(serviceElements); +} + +void DynamicMappersView::OnSelectionChanged(berry::IWorkbenchPart::Pointer part, + const QList &nodes) +{ + m_SelectedNode = nodes.empty() ? nullptr : nodes.front(); + RefreshServiceSelector(); +} diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h new file mode 100644 index 0000000000..f1d0b769fc --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h @@ -0,0 +1,56 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef DynamicMappersView_h +#define DynamicMappersView_h + +#include +#include + +class DynamicMappersView : public QmitkAbstractView +{ + // this is needed for all Qt objects that should have a Qt meta-object + // (everything that derives from QObject and wants to have signal/slots) + Q_OBJECT + +public: + + DynamicMappersView(); + virtual ~DynamicMappersView() = default; + + void RefreshServiceList(); + + public slots: + void OnServiceSelectionChanged(QString newText); + void OnAddMapperServiceClicked(); + void OnUnloadClicked(); + +protected: + + virtual void CreateQtPartControl(QWidget *parent) override; + virtual void SetFocus() override; + void RefreshServiceSelector(); + +private: + void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + + QWidget* m_Parent; + Ui::DynamicMappersViewControls m_Controls; + mitk::DataNode::Pointer m_SelectedNode; +}; + +#endif // DynamicMappersView_h diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui new file mode 100644 index 0000000000..0e26193a35 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui @@ -0,0 +1,74 @@ + + + DynamicMappersViewControls + + + + 0 + 0 + 421 + 651 + + + + + 0 + 0 + + + + QmitkTemplate + + + + 5 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + Select a node to change the mapper + + + + + + + + + + + + Add mapper service ... + + + + + + + Unload shared libraries (loaded through this plugin) + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp new file mode 100644 index 0000000000..a5b3148e79 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp @@ -0,0 +1,44 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#include "org_mitk_gui_qt_dynamicmappers_Activator.h" +#include "DynamicMappersView.h" + +namespace mitk { + + ctkPluginContext* org_mitk_gui_qt_dynamicmappers_Activator::m_Context = nullptr; + + void org_mitk_gui_qt_dynamicmappers_Activator::start(ctkPluginContext* context) + { + BERRY_REGISTER_EXTENSION_CLASS(DynamicMappersView, context); + + m_Context = context; + } + + void org_mitk_gui_qt_dynamicmappers_Activator::stop(ctkPluginContext* context) + { + Q_UNUSED(context); + + m_Context = nullptr; + } + + ctkPluginContext* org_mitk_gui_qt_dynamicmappers_Activator::GetContext() + { + return m_Context; + } + +} diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h new file mode 100644 index 0000000000..42cd0e23f0 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h @@ -0,0 +1,47 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + + +#ifndef org_mitk_gui_qt_dynamicmappers_Activator_h +#define org_mitk_gui_qt_dynamicmappers_Activator_h + +#include + +namespace mitk { + + class org_mitk_gui_qt_dynamicmappers_Activator : + public QObject, public ctkPluginActivator + { + Q_OBJECT + Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_dynamicmappers") + Q_INTERFACES(ctkPluginActivator) + + public: + + void start(ctkPluginContext* context); + void stop(ctkPluginContext* context); + + static ctkPluginContext* GetContext(); + + private: + + static ctkPluginContext* m_Context; + + }; // org_mitk_gui_qt_dynamicmappers_Activator + +} + +#endif // org_mitk_gui_qt_dynamicmappers_Activator_h