diff --git a/CMake/BuildConfigurations/WorkbenchRelease.cmake b/CMake/BuildConfigurations/WorkbenchRelease.cmake index 0163c6a085..168a400d97 100644 --- a/CMake/BuildConfigurations/WorkbenchRelease.cmake +++ b/CMake/BuildConfigurations/WorkbenchRelease.cmake @@ -1,29 +1,31 @@ include(${CMAKE_CURRENT_LIST_DIR}/Default.cmake) set(MITK_CONFIG_PACKAGES ${MITK_CONFIG_PACKAGES} MatchPoint ) set(MITK_CONFIG_PLUGINS ${MITK_CONFIG_PLUGINS} org.mitk.matchpoint.core.helper org.mitk.gui.qt.matchpoint.algorithm.browser org.mitk.gui.qt.matchpoint.algorithm.control org.mitk.gui.qt.matchpoint.mapper org.mitk.gui.qt.matchpoint.framereg org.mitk.gui.qt.matchpoint.visualizer org.mitk.gui.qt.matchpoint.evaluator org.mitk.gui.qt.matchpoint.manipulator + org.mitk.gui.qt.dicominspector ) if(NOT MITK_USE_SUPERBUILD) set(BUILD_CoreCmdApps ON CACHE BOOL "" FORCE) set(BUILD_MatchPointCmdApps ON CACHE BOOL "" FORCE) set(BUILD_SegmentationCmdApps ON CACHE BOOL "" FORCE) + set(BUILD_DICOMCmdApps ON CACHE BOOL "" FORCE) endif() set(MITK_VTK_DEBUG_LEAKS OFF CACHE BOOL "Enable VTK Debug Leaks" FORCE) find_package(Doxygen REQUIRED) # Ensure that the in-application help can be build set(BLUEBERRY_QT_HELP_REQUIRED ON CACHE BOOL "Required Qt help documentation in plug-ins" FORCE) diff --git a/Plugins/org.mitk.gui.qt.dicominspector/documentation/UserManual/inspector-dox.png b/Plugins/org.mitk.gui.qt.dicominspector/documentation/UserManual/inspector-dox.png index 6dc6b30c29..1941802bab 100644 Binary files a/Plugins/org.mitk.gui.qt.dicominspector/documentation/UserManual/inspector-dox.png and b/Plugins/org.mitk.gui.qt.dicominspector/documentation/UserManual/inspector-dox.png differ diff --git a/Plugins/org.mitk.gui.qt.dicominspector/files.cmake b/Plugins/org.mitk.gui.qt.dicominspector/files.cmake index 58fe6719bb..a68c58b3c8 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/files.cmake +++ b/Plugins/org.mitk.gui.qt.dicominspector/files.cmake @@ -1,42 +1,42 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES mitkDicomInspectorActivator.cpp mitkDicomInspectorActivator.h QmitkDicomInspectorView.cpp QmitkDicomInspectorView.h ) set(UI_FILES src/internal/QmitkDicomInspectorViewControls.ui ) set(MOC_H_FILES src/internal/mitkDicomInspectorActivator.h src/internal/QmitkDicomInspectorView.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/inspector.png + resources/dicom_inspector.svg 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.dicominspector/plugin.xml b/Plugins/org.mitk.gui.qt.dicominspector/plugin.xml index 8da249251b..6fd795a227 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/plugin.xml +++ b/Plugins/org.mitk.gui.qt.dicominspector/plugin.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <plugin> <extension point="org.blueberry.ui.views"> <view id="org.mitk.views.dicominspector" name="Dicom Inspector" class="QmitkDicomInspectorView" - icon="resources/inspector.png" /> + icon="resources/dicom_inspector.svg" + category="Data"> + <description>View DICOM information stored as properties in data instances.</description> + </view> </extension> </plugin> diff --git a/Plugins/org.mitk.gui.qt.dicominspector/resources/dicom_inspector.svg b/Plugins/org.mitk.gui.qt.dicominspector/resources/dicom_inspector.svg new file mode 100644 index 0000000000..4c28b406f7 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.dicominspector/resources/dicom_inspector.svg @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="128" + height="128" + viewBox="0 0 1792 1792" + id="svg2" + version="1.1" + inkscape:version="1.2 (dc2aedaf03, 2022-05-15)" + sodipodi:docname="dicom_inspector.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1890" + inkscape:window-height="1065" + id="namedview6" + showgrid="false" + inkscape:zoom="2.97995" + inkscape:cx="82.048357" + inkscape:cy="63.423883" + inkscape:window-x="-7" + inkscape:window-y="622" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + inkscape:showpageshadow="0" + inkscape:pagecheckerboard="1" + inkscape:deskcolor="#d1d1d1" /> + <path + id="path4" + style="display:inline;fill:#00ff00;fill-opacity:1;stroke:none" + d="M 159.98828 127.99609 C 115.98863 127.99609 78.337022 143.66688 47.003906 175 C 15.670796 206.33312 3.3158628e-14 244.012 0 288.01172 L 0 1089.9492 L 127.99609 1089.9492 L 127.99609 544.00391 C 127.99609 535.33725 131.17845 527.83327 137.51172 521.5 C 143.84499 515.16673 151.32168 512.01172 159.98828 512.01172 L 1632.0117 512.01172 C 1640.6784 512.01172 1648.155 515.16673 1654.4883 521.5 C 1660.8216 527.83327 1664.0039 535.33725 1664.0039 544.00391 L 1664.0039 1089.9492 L 1792 1089.9492 L 1792 288.01172 C 1792 244.012 1776.3294 206.33312 1744.9961 175 C 1713.6628 143.66688 1676.0117 127.99609 1632.0117 127.99609 L 159.98828 127.99609 z M 288.01172 640.00781 C 279.34512 640.00781 271.84114 643.16283 265.50781 649.49609 C 259.17455 655.82942 255.99219 663.3334 255.99219 672 L 255.99219 736.01172 C 255.99219 744.67832 259.17455 752.15501 265.50781 758.48828 C 271.84114 764.82155 279.34512 768.00391 288.01172 768.00391 L 351.99609 768.00391 C 360.66275 768.00391 368.16673 764.82155 374.5 758.48828 C 380.83327 752.15501 383.98828 744.67832 383.98828 736.01172 L 383.98828 672 C 383.98828 663.3334 380.83327 655.82942 374.5 649.49609 C 368.16673 643.16283 360.66275 640.00781 351.99609 640.00781 L 288.01172 640.00781 z M 544.00391 640.00781 C 535.33725 640.00781 527.83327 643.16283 521.5 649.49609 C 515.16673 655.82942 512.01172 663.3334 512.01172 672 L 512.01172 736.01172 C 512.01172 744.67832 515.16673 752.15501 521.5 758.48828 C 527.83327 764.82155 535.33725 768.00391 544.00391 768.00391 L 1503.9883 768.00391 C 1512.6549 768.00391 1520.1589 764.82155 1526.4922 758.48828 C 1532.8255 752.15501 1536.0078 744.67832 1536.0078 736.01172 L 1536.0078 672 C 1536.0078 663.3334 1532.8255 655.82942 1526.4922 649.49609 C 1520.1589 643.16283 1512.6549 640.00781 1503.9883 640.00781 L 544.00391 640.00781 z M 288.01172 896 C 279.34512 896 271.84114 899.15501 265.50781 905.48828 C 259.17455 911.82155 255.99219 919.32559 255.99219 927.99219 L 255.99219 992.00391 C 255.99219 1000.6706 259.17455 1008.1745 265.50781 1014.5078 C 271.84114 1020.8411 279.34512 1023.9961 288.01172 1023.9961 L 351.99609 1023.9961 C 360.66275 1023.9961 368.16673 1020.8411 374.5 1014.5078 C 380.83327 1008.1745 383.98828 1000.6706 383.98828 992.00391 L 383.98828 927.99219 C 383.98828 919.32559 380.83327 911.82155 374.5 905.48828 C 368.16673 899.15501 360.66275 896 351.99609 896 L 288.01172 896 z M 544.00391 896 C 535.33725 896 527.83327 899.15501 521.5 905.48828 C 515.16673 911.82155 512.01172 919.32559 512.01172 927.99219 L 512.01172 992.00391 C 512.01172 1000.6706 515.16673 1008.1745 521.5 1014.5078 C 527.83327 1020.8411 535.33725 1023.9961 544.00391 1023.9961 L 1503.9883 1023.9961 C 1512.6549 1023.9961 1520.1589 1020.8411 1526.4922 1014.5078 C 1532.8255 1008.1745 1536.0078 1000.6706 1536.0078 992.00391 L 1536.0078 927.99219 C 1536.0078 919.32559 1532.8255 911.82155 1526.4922 905.48828 C 1520.1589 899.15501 1512.6549 896 1503.9883 896 L 544.00391 896 z " /> + <text + xml:space="preserve" + style="font-size:746.667px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;letter-spacing:0px;word-spacing:0px;display:inline;fill:none;stroke:#000000;stroke-width:14px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="46.980652" + y="1738.2843" + id="text288-1"><tspan + sodipodi:role="line" + id="tspan286-7" + x="0" + y="0" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:746.667px;font-family:Arial;-inkscape-font-specification:'Arial Bold';fill:#ff00ff;stroke:none;stroke-width:14px">DCM</tspan></text> +</svg> diff --git a/Plugins/org.mitk.gui.qt.dicominspector/resources/inspector.png b/Plugins/org.mitk.gui.qt.dicominspector/resources/inspector.png deleted file mode 100644 index 6dc6b30c29..0000000000 Binary files a/Plugins/org.mitk.gui.qt.dicominspector/resources/inspector.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp index c0808922fb..f396482627 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp +++ b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp @@ -1,389 +1,397 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ // Blueberry #include <berryISelectionService.h> #include <berryIWorkbenchWindow.h> #include <berryIWorkbenchPage.h> // mitk #include <QmitkRenderWindow.h> #include <mitkImagePixelReadAccessor.h> #include <mitkPixelTypeMultiplex.h> #include <mitkTimeNavigationController.h> +#include <mitkNodePredicateAnd.h> +#include <mitkNodePredicateNot.h> +#include <mitkNodePredicateProperty.h> // Qt #include <QMessageBox> #include <QMessageBox> #include <QFileDialog> #include <qwt_plot_marker.h> #include "QmitkDicomInspectorView.h" const std::string QmitkDicomInspectorView::VIEW_ID = "org.mitk.views.dicominspector"; QmitkDicomInspectorView::ObserverInfo::ObserverInfo(mitk::SliceNavigationController* controller, int observerTag, mitk::IRenderWindowPart* part) : controller(controller) , observerTag(observerTag) , renderWindowPart(part) { } QmitkDicomInspectorView::QmitkDicomInspectorView() : m_RenderWindowPart(nullptr) , m_PendingSliceChangedEvent(false) , m_SelectedNode(nullptr) , m_SelectedTimePoint(0.) , m_CurrentSelectedZSlice(0) { m_SelectedPosition.Fill(0.0); } QmitkDicomInspectorView::~QmitkDicomInspectorView() { this->RemoveAllObservers(); } void QmitkDicomInspectorView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { if (m_RenderWindowPart != renderWindowPart) { m_RenderWindowPart = renderWindowPart; if (!InitObservers()) { QMessageBox::information(nullptr, "Error", "Unable to set up the event observers. The " \ "plot will not be triggered on changing the crosshair, " \ "position or time step."); } } } void QmitkDicomInspectorView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) { m_RenderWindowPart = nullptr; this->RemoveAllObservers(renderWindowPart); } void QmitkDicomInspectorView::CreateQtPartControl(QWidget* parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); + auto nodePredicate = mitk::NodePredicateAnd::New(); + nodePredicate->AddPredicate(mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))); + nodePredicate->AddPredicate(mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("hidden object"))); + m_Controls.singleSlot->SetDataStorage(GetDataStorage()); m_Controls.singleSlot->SetSelectionIsOptional(true); m_Controls.singleSlot->SetAutoSelectNewNodes(true); + m_Controls.singleSlot->SetNodePredicate(nodePredicate); m_Controls.singleSlot->SetEmptyInfo(QString("Please select a data node")); m_Controls.singleSlot->SetPopUpTitel(QString("Select data node")); m_SelectionServiceConnector = std::make_unique<QmitkSelectionServiceConnector>(); SetAsSelectionListener(true); m_Controls.timePointValueLabel->setText(QString("")); m_Controls.sliceNumberValueLabel->setText(QString("")); connect(m_Controls.singleSlot, &QmitkSingleNodeSelectionWidget::CurrentSelectionChanged, this, &QmitkDicomInspectorView::OnCurrentSelectionChanged); mitk::IRenderWindowPart* renderWindowPart = GetRenderWindowPart(); RenderWindowPartActivated(renderWindowPart); } bool QmitkDicomInspectorView::InitObservers() { bool result = true; auto* timeNavigationController = mitk::RenderingManager::GetInstance()->GetTimeNavigationController(); itk::SimpleMemberCommand<QmitkDicomInspectorView>::Pointer cmdTimeEvent = itk::SimpleMemberCommand<QmitkDicomInspectorView>::New(); cmdTimeEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnTimeChanged); m_ControllerToTimeObserverTag = timeNavigationController->AddObserver(mitk::TimeNavigationController::TimeEvent(0), cmdTimeEvent); typedef QHash<QString, QmitkRenderWindow*> WindowMapType; WindowMapType windowMap = m_RenderWindowPart->GetQmitkRenderWindows(); auto i = windowMap.begin(); while (i != windowMap.end()) { mitk::SliceNavigationController* sliceNavController = i.value()->GetSliceNavigationController(); if (nullptr != sliceNavController) { auto cmdSliceEvent = itk::SimpleMemberCommand<QmitkDicomInspectorView>::New(); cmdSliceEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnSliceChanged); int tag = sliceNavController->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(nullptr, 0), cmdSliceEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, m_RenderWindowPart))); auto cmdDelEvent = itk::MemberCommand<QmitkDicomInspectorView>::New(); cmdDelEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnSliceNavigationControllerDeleted); tag = sliceNavController->AddObserver(itk::DeleteEvent(), cmdDelEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, m_RenderWindowPart))); } ++i; result = result && sliceNavController; } return result; } void QmitkDicomInspectorView::RemoveObservers(const mitk::SliceNavigationController* deletedSlicer) { std::pair<ObserverMapType::const_iterator, ObserverMapType::const_iterator> obsRange = m_ObserverMap.equal_range(deletedSlicer); for (ObserverMapType::const_iterator pos = obsRange.first; pos != obsRange.second; ++pos) { pos->second.controller->RemoveObserver(pos->second.observerTag); } m_ObserverMap.erase(deletedSlicer); } void QmitkDicomInspectorView::RemoveAllObservers(mitk::IRenderWindowPart* deletedPart) { for (ObserverMapType::const_iterator pos = m_ObserverMap.begin(); pos != m_ObserverMap.end();) { ObserverMapType::const_iterator delPos = pos++; if (nullptr == deletedPart || deletedPart == delPos->second.renderWindowPart) { delPos->second.controller->RemoveObserver(delPos->second.observerTag); m_ObserverMap.erase(delPos); } } } void QmitkDicomInspectorView::OnCurrentSelectionChanged(QList<mitk::DataNode::Pointer> nodes) { if (nodes.empty() || nodes.front().IsNull()) { m_SelectedNode = nullptr; m_SelectedData = nullptr; UpdateData(); return; } if (nodes.front() != this->m_SelectedNode) { // node is selected, create DICOM tag table m_SelectedNode = nodes.front(); m_SelectedData = this->m_SelectedNode->GetData(); m_SelectedNodeTime.Modified(); UpdateData(); OnSliceChangedDelayed(); } } void QmitkDicomInspectorView::OnSliceChanged() { // Since there are always 3 events arriving (one for each render window) every time the slice // or time changes, the slot OnSliceChangedDelayed is triggered - and only if it hasn't been // triggered yet - so it is only executed once for every slice/time change. if (!m_PendingSliceChangedEvent) { m_PendingSliceChangedEvent = true; QTimer::singleShot(0, this, SLOT(OnSliceChangedDelayed())); } } void QmitkDicomInspectorView::OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/) { auto sendingSlicer = dynamic_cast<const mitk::SliceNavigationController*>(sender); this->RemoveObservers(sendingSlicer); } void QmitkDicomInspectorView::ValidateAndSetCurrentPosition() { const auto currentSelectedPosition = m_RenderWindowPart->GetSelectedPosition(); const auto* timeNavigationController = mitk::RenderingManager::GetInstance()->GetTimeNavigationController(); const mitk::TimeStepType currentSelectedTimePoint = timeNavigationController->GetSelectedTimePoint(); if (m_SelectedPosition != currentSelectedPosition || m_SelectedTimePoint != currentSelectedTimePoint || m_SelectedNodeTime > m_CurrentPositionTime) { // the current position has been changed, the selected node has been changed since // the last position validation or the current time position has been changed -> check position m_SelectedPosition = currentSelectedPosition; m_SelectedTimePoint = currentSelectedTimePoint; m_CurrentPositionTime.Modified(); m_ValidSelectedPosition = false; if (m_SelectedData.IsNull()) { return; } mitk::BaseGeometry::Pointer geometry = m_SelectedData->GetTimeGeometry()->GetGeometryForTimePoint(m_SelectedTimePoint); // check for invalid time step if (geometry.IsNull()) { geometry = m_SelectedData->GetTimeGeometry()->GetGeometryForTimeStep(0); } if (geometry.IsNull()) { return; } m_ValidSelectedPosition = geometry->IsInside(m_SelectedPosition); itk::Index<3> index; geometry->WorldToIndex(m_SelectedPosition, index); m_CurrentSelectedZSlice = index[2]; } } void QmitkDicomInspectorView::OnSliceChangedDelayed() { m_PendingSliceChangedEvent = false; ValidateAndSetCurrentPosition(); m_Controls.tableTags->setEnabled(m_ValidSelectedPosition); if (m_SelectedNode.IsNotNull()) { RenderTable(); } } void QmitkDicomInspectorView::OnTimeChanged() { ValidateAndSetCurrentPosition(); m_Controls.tableTags->setEnabled(m_ValidSelectedPosition); if (m_SelectedNode.IsNotNull()) { RenderTable(); } } void QmitkDicomInspectorView::RenderTable() { assert(nullptr != m_RenderWindowPart); const auto timeStep = (m_SelectedData.IsNull()) ? 0 : m_SelectedData->GetTimeGeometry()->TimePointToTimeStep(m_SelectedTimePoint); unsigned int rowIndex = 0; for (const auto& element : m_Tags) { QTableWidgetItem* newItem = new QTableWidgetItem(QString::fromStdString( element.second.prop->GetValue(timeStep, m_CurrentSelectedZSlice, true, true))); m_Controls.tableTags->setItem(rowIndex, 3, newItem); ++rowIndex; } UpdateLabels(); } void QmitkDicomInspectorView::UpdateData() { QStringList headers; m_Controls.tableTags->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); m_Tags.clear(); if (m_SelectedData.IsNotNull()) { for (const auto& element : *(m_SelectedData->GetPropertyList()->GetMap())) { if (element.first.find("DICOM") == 0) { std::istringstream stream(element.first); std::string token; std::getline(stream, token, '.'); //drop the DICOM suffix std::getline(stream, token, '.'); //group id unsigned long dcmgroup = std::stoul(token, nullptr, 16); std::getline(stream, token, '.'); //element id unsigned long dcmelement = std::stoul(token, nullptr, 16); TagInfo info(mitk::DICOMTag(dcmgroup, dcmelement), dynamic_cast<const mitk::DICOMProperty*>(element.second.GetPointer())); m_Tags.insert(std::make_pair(element.first, info)); } } } m_Controls.tableTags->setRowCount(m_Tags.size()); unsigned int rowIndex = 0; for (const auto& element : m_Tags) { QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(element.second.tag.GetGroup(), 16)); m_Controls.tableTags->setItem(rowIndex, 0, newItem); newItem = new QTableWidgetItem(QString::number(element.second.tag.GetElement(), 16)); m_Controls.tableTags->setItem(rowIndex, 1, newItem); newItem = new QTableWidgetItem(QString::fromStdString(element.second.tag.GetName())); m_Controls.tableTags->setItem(rowIndex, 2, newItem); newItem = new QTableWidgetItem(QString::fromStdString(element.second.prop->GetValue())); m_Controls.tableTags->setItem(rowIndex, 3, newItem); ++rowIndex; } UpdateLabels(); } void QmitkDicomInspectorView::UpdateLabels() { if (m_SelectedData.IsNull()) { m_Controls.timePointValueLabel->setText(QString("")); m_Controls.sliceNumberValueLabel->setText(QString("")); } else { const auto timeStep = m_SelectedData->GetTimeGeometry()->TimePointToTimeStep(m_SelectedTimePoint); if (m_ValidSelectedPosition) { m_Controls.timePointValueLabel->setText(QString::number(timeStep) + QStringLiteral("(")+ QString::number(m_SelectedTimePoint/1000.) + QStringLiteral(" [s])")); m_Controls.sliceNumberValueLabel->setText(QString::number(m_CurrentSelectedZSlice)); } else { m_Controls.timePointValueLabel->setText(QString("outside data geometry")); m_Controls.sliceNumberValueLabel->setText(QString("outside data geometry")); } } } void QmitkDicomInspectorView::SetAsSelectionListener(bool checked) { if (checked) { m_SelectionServiceConnector->AddPostSelectionListener(GetSite()->GetWorkbenchWindow()->GetSelectionService()); connect(m_SelectionServiceConnector.get(), &QmitkSelectionServiceConnector::ServiceSelectionChanged, m_Controls.singleSlot, &QmitkSingleNodeSelectionWidget::SetCurrentSelection); } else { m_SelectionServiceConnector->RemovePostSelectionListener(); disconnect(m_SelectionServiceConnector.get(), &QmitkSelectionServiceConnector::ServiceSelectionChanged, m_Controls.singleSlot, &QmitkSingleNodeSelectionWidget::SetCurrentSelection); } }