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 eff06bd45a..2a3a0f3090 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp +++ b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.cpp @@ -1,385 +1,374 @@ /*============================================================================ 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 #include #include // mitk #include #include #include // Qt #include #include #include #include #include "QmitkDicomInspectorView.h" const std::string QmitkDicomInspectorView::VIEW_ID = "org.mitk.gui.qt.dicominspector"; QmitkDicomInspectorView::ObserverInfo::ObserverInfo(mitk::SliceNavigationController* controller, int observerTag, const std::string& renderWindowName, mitk::IRenderWindowPart* part) : controller(controller), observerTag(observerTag), renderWindowName(renderWindowName), renderWindowPart(part) { } -QmitkDicomInspectorView::QmitkDicomInspectorView() : -m_renderWindowPart(nullptr), -m_PendingSliceChangedEvent(false), -m_currentSelectedTimeStep(0), -m_currentSelectedZSlice(0), -m_currentSelectedNode(nullptr), -m_internalUpdateFlag(false) +QmitkDicomInspectorView::QmitkDicomInspectorView() + : m_RenderWindowPart(nullptr) + , m_PendingSliceChangedEvent(false) + , m_SelectedNode(nullptr) + , m_SelectedTimeStep(0) + , m_CurrentSelectedZSlice(0) { - m_currentSelectedPosition.Fill(0.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); + + m_Controls.singleSlot->SetDataStorage(GetDataStorage()); + m_Controls.singleSlot->SetSelectionIsOptional(true); + m_Controls.singleSlot->SetEmptyInfo(QString("Please select a data node")); + m_Controls.singleSlot->SetPopUpTitel(QString("Select data node")); + + m_SelectionServiceConnector = std::make_unique(); + 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; typedef QHash WindowMapType; - WindowMapType windowMap = m_renderWindowPart->GetQmitkRenderWindows(); + WindowMapType windowMap = m_RenderWindowPart->GetQmitkRenderWindows(); auto i = windowMap.begin(); while (i != windowMap.end()) { mitk::SliceNavigationController* sliceNavController = i.value()->GetSliceNavigationController(); if (sliceNavController) { - itk::ReceptorMemberCommand::Pointer cmdSliceEvent = - itk::ReceptorMemberCommand::New(); + auto cmdSliceEvent = itk::SimpleMemberCommand::New(); cmdSliceEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnSliceChanged); int tag = sliceNavController->AddObserver( - mitk::SliceNavigationController::GeometrySliceEvent(nullptr, 0), - cmdSliceEvent); + mitk::SliceNavigationController::GeometrySliceEvent(nullptr, 0), cmdSliceEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, - i.key().toStdString(), m_renderWindowPart))); + i.key().toStdString(), m_RenderWindowPart))); - itk::ReceptorMemberCommand::Pointer cmdTimeEvent = - itk::ReceptorMemberCommand::New(); + auto cmdTimeEvent = itk::SimpleMemberCommand::New(); cmdTimeEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnSliceChanged); tag = sliceNavController->AddObserver( - mitk::SliceNavigationController::GeometryTimeEvent(nullptr, 0), - cmdTimeEvent); + mitk::SliceNavigationController::GeometryTimeEvent(nullptr, 0), cmdTimeEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, - i.key().toStdString(), m_renderWindowPart))); + i.key().toStdString(), m_RenderWindowPart))); - itk::MemberCommand::Pointer cmdDelEvent = - itk::MemberCommand::New(); - cmdDelEvent->SetCallbackFunction(this, - &QmitkDicomInspectorView::OnSliceNavigationControllerDeleted); - tag = sliceNavController->AddObserver( - itk::DeleteEvent(), cmdDelEvent); + auto cmdDelEvent = itk::MemberCommand::New(); + cmdDelEvent->SetCallbackFunction(this, &QmitkDicomInspectorView::OnSliceNavigationControllerDeleted); + tag = sliceNavController->AddObserver(itk::DeleteEvent(), cmdDelEvent); m_ObserverMap.insert(std::make_pair(sliceNavController, ObserverInfo(sliceNavController, tag, - i.key().toStdString(), m_renderWindowPart))); + i.key().toStdString(), m_RenderWindowPart))); } ++i; result = result && sliceNavController; } return result; } -void QmitkDicomInspectorView::RemoveObservers(const mitk::SliceNavigationController* - deletedSlicer) +void QmitkDicomInspectorView::RemoveObservers(const mitk::SliceNavigationController* deletedSlicer) { - - std::pair < ObserverMapType::const_iterator, ObserverMapType::const_iterator> obsRange = + std::pair 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 (deletedPart == nullptr || deletedPart == delPos->second.renderWindowPart) + if (nullptr == deletedPart || deletedPart == delPos->second.renderWindowPart) { delPos->second.controller->RemoveObserver(delPos->second.observerTag); m_ObserverMap.erase(delPos); } } } -void QmitkDicomInspectorView::OnSliceNavigationControllerDeleted(const itk::Object* sender, - const itk::EventObject& /*e*/) +void QmitkDicomInspectorView::OnCurrentSelectionChanged(QList nodes) { - const mitk::SliceNavigationController* sendingSlicer = - dynamic_cast(sender); - - this->RemoveObservers(sendingSlicer); -} + if (nodes.empty() || nodes.front().IsNull()) + { + m_SelectedNode = nullptr; + m_SelectedData = nullptr; + UpdateData(); + return; + } -void QmitkDicomInspectorView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) -{ - if (m_renderWindowPart != renderWindowPart) + if (nodes.front() != this->m_SelectedNode) { - m_renderWindowPart = renderWindowPart; + // node is selected, create DICOM tag table + m_SelectedNode = nodes.front(); + m_SelectedData = this->m_SelectedNode->GetData(); - 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."); - } + m_SelectedNodeTime.Modified(); + UpdateData(); + OnSliceChangedDelayed(); } } -void QmitkDicomInspectorView::RenderWindowPartDeactivated( - mitk::IRenderWindowPart* renderWindowPart) +void QmitkDicomInspectorView::OnSliceChanged() { - 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); - - m_Controls.labelNode->setText(QString("select node...")); - m_Controls.labelTime->setText(QString("")); - m_Controls.labelSlice->setText(QString("")); - - mitk::IRenderWindowPart* renderWindowPart = GetRenderWindowPart(); - RenderWindowPartActivated(renderWindowPart); -} + // Taken from QmitkStdMultiWidget::HandleCrosshairPositionEvent(). + // 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; -void QmitkDicomInspectorView::SetFocus() -{ + QTimer::singleShot(0, this, SLOT(OnSliceChangedDelayed())); + } } -void QmitkDicomInspectorView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*source*/, - const QList& nodes) +void QmitkDicomInspectorView::OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/) { - if (nodes.size() > 0) - { - if (nodes.front() != this->m_currentSelectedNode) - { - m_internalUpdateFlag = true; - this->m_currentSelectedNode = nodes.front(); - this->m_currentSelectedData = this->m_currentSelectedNode->GetData(); - m_internalUpdateFlag = false; - - m_selectedNodeTime.Modified(); - UpdateData(); - OnSliceChangedDelayed(); - } - } - else - { - if (this->m_currentSelectedNode.IsNotNull()) - { - m_internalUpdateFlag = true; - this->m_currentSelectedNode = nullptr; - this->m_currentSelectedData = nullptr; - m_internalUpdateFlag = false; - - m_selectedNodeTime.Modified(); - UpdateData(); - OnSliceChangedDelayed(); - } - } + auto sendingSlicer = dynamic_cast(sender); + this->RemoveObservers(sendingSlicer); } void QmitkDicomInspectorView::ValidateAndSetCurrentPosition() { mitk::Point3D currentSelectedPosition = GetRenderWindowPart()->GetSelectedPosition(nullptr); unsigned int currentSelectedTimeStep = GetRenderWindowPart()->GetTimeNavigationController()->GetTime()->GetPos(); - if (m_currentSelectedPosition != currentSelectedPosition - || m_currentSelectedTimeStep != currentSelectedTimeStep - || m_selectedNodeTime > m_currentPositionTime) + if (m_SelectedPosition != currentSelectedPosition + || m_SelectedTimeStep != currentSelectedTimeStep + || m_SelectedNodeTime > m_CurrentPositionTime) { - //the current position has been changed or the selected node has been changed since the last position validation -> check position - m_currentSelectedPosition = currentSelectedPosition; - m_currentSelectedTimeStep = currentSelectedTimeStep; - m_currentPositionTime.Modified(); - m_validSelectedPosition = false; - - if (m_currentSelectedData.IsNull()) + // the current position has been changed or the selected node has been changed since + // the last position validation -> check position + m_SelectedPosition = currentSelectedPosition; + m_SelectedTimeStep = currentSelectedTimeStep; + m_CurrentPositionTime.Modified(); + m_ValidSelectedPosition = false; + + if (m_SelectedData.IsNull()) { return; } - mitk::BaseGeometry::Pointer geometry = m_currentSelectedData->GetTimeGeometry()->GetGeometryForTimeStep( - m_currentSelectedTimeStep); + mitk::BaseGeometry::Pointer geometry = m_SelectedData->GetTimeGeometry()->GetGeometryForTimeStep( + m_SelectedTimeStep); // check for invalid time step if (geometry.IsNull()) { - geometry = m_currentSelectedData->GetTimeGeometry()->GetGeometryForTimeStep(0); + geometry = m_SelectedData->GetTimeGeometry()->GetGeometryForTimeStep(0); } if (geometry.IsNull()) { return; } - m_validSelectedPosition = geometry->IsInside(m_currentSelectedPosition); + m_ValidSelectedPosition = geometry->IsInside(m_SelectedPosition); itk::Index<3> index; - geometry->WorldToIndex(m_currentSelectedPosition, index); - - m_currentSelectedZSlice = index[2]; - } -} + geometry->WorldToIndex(m_SelectedPosition, index); -void QmitkDicomInspectorView::OnSliceChanged(const itk::EventObject&) -{ - // Taken from QmitkStdMultiWidget::HandleCrosshairPositionEvent(). - // 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())); + m_CurrentSelectedZSlice = index[2]; } } void QmitkDicomInspectorView::OnSliceChangedDelayed() { m_PendingSliceChangedEvent = false; ValidateAndSetCurrentPosition(); - m_Controls.tableTags->setEnabled(m_validSelectedPosition); + m_Controls.tableTags->setEnabled(m_ValidSelectedPosition); - if (m_currentSelectedNode.IsNotNull()) + if (m_SelectedNode.IsNotNull()) { RenderTable(); } } void QmitkDicomInspectorView::RenderTable() { - assert(m_renderWindowPart != nullptr); + assert(nullptr != m_RenderWindowPart); // configure fit information unsigned int rowIndex = 0; for (const auto& element : m_Tags) { - QTableWidgetItem* newItem = new QTableWidgetItem(QString::fromStdString(element.second.prop->GetValue(m_currentSelectedTimeStep, m_currentSelectedZSlice, true, true))); + QTableWidgetItem* newItem = new QTableWidgetItem(QString::fromStdString( + element.second.prop->GetValue(m_SelectedTimeStep, 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_currentSelectedData.IsNotNull()) + if (m_SelectedData.IsNotNull()) { - for (const auto& element : *(m_currentSelectedData->GetPropertyList()->GetMap())) + 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(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_currentSelectedData.IsNull()) + if (m_SelectedData.IsNull()) { - if (m_currentSelectedNode.IsNotNull()) - { - m_Controls.labelNode->setText(QString("INVALIDE NODE")); - } - else - { - m_Controls.labelNode->setText(QString("select node...")); - } - m_Controls.labelTime->setText(QString("")); - m_Controls.labelSlice->setText(QString("")); + m_Controls.timePointValueLabel->setText(QString("")); + m_Controls.sliceNumberValueLabel->setText(QString("")); } else { - m_Controls.labelNode->setText(QString::fromStdString(m_currentSelectedNode->GetName())); - if (m_validSelectedPosition) + if (m_ValidSelectedPosition) { - m_Controls.labelTime->setText(QString::number(m_currentSelectedTimeStep)); - m_Controls.labelSlice->setText(QString::number(m_currentSelectedZSlice)); + m_Controls.timePointValueLabel->setText(QString::number(m_SelectedTimeStep)); + m_Controls.sliceNumberValueLabel->setText(QString::number(m_CurrentSelectedZSlice)); } else { - m_Controls.labelTime->setText(QString("outside data geometry")); - m_Controls.labelSlice->setText(QString("outside data geometry")); + 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); + } +} diff --git a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.h b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.h index 926eb5a5ac..8746fa6126 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.h +++ b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorView.h @@ -1,158 +1,155 @@ /*============================================================================ 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. ============================================================================*/ - #ifndef QmitkDicomInspectorView_h #define QmitkDicomInspectorView_h +#include "ui_QmitkDicomInspectorViewControls.h" + // Blueberry -//#include #include -// mitk -#include -#include +// mitk DICOMReader module #include #include -// Qt -#include "ui_QmitkDicomInspectorViewControls.h" +// mitk gui common plugin +#include +// mitk gui qt common plugin +#include +#include /** - * @brief View class defining the UI part of the ModelFitVisualization plug-in. + * @brief View class to inspect all DICOM tags available for the data of a node. */ -class QmitkDicomInspectorView : - public QmitkAbstractView, - public mitk::IRenderWindowPartListener +class QmitkDicomInspectorView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { - // 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: QmitkDicomInspectorView(); ~QmitkDicomInspectorView() override; static const std::string VIEW_ID; - protected slots: + void SetFocus() override { }; - /** - * @brief Triggered when the voxel or time step selection changes. - * Calculates the curve and points for the current fit if the visualization is running. - */ - void OnSliceChangedDelayed(); + void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; + void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; protected: void CreateQtPartControl(QWidget* parent) override; - void SetFocus() override; + /** @brief Initializes and sets the observers that are used to monitor changes in the selected position + or time point in order to actualize the view*/ + bool InitObservers(); - /** @brief called by QmitkFunctionality when DataManager's selection has changed */ - void OnSelectionChanged(berry::IWorkbenchPart::Pointer source, - const QList& nodes) override; + /** @brief Removes all observers of the specific deleted slice navigation controller.*/ + void RemoveObservers(const mitk::SliceNavigationController* deletedSlicer); - /** @brief Calls OnSliceChangedDelayed so the event isn't triggered multiple times. */ - void OnSliceChanged(const itk::EventObject& e); + /** @brief Removes all observers of the deletedPart. If null pointer is passed all observers will be removed.*/ + void RemoveAllObservers(mitk::IRenderWindowPart* deletedPart = nullptr); - void OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/); + /** @brief Called by the selection widget when the selection has changed.*/ + void OnCurrentSelectionChanged(QList nodes); - void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; - void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; + /** @brief Calls OnSliceChangedDelayed so the event isn't triggered multiple times.*/ + void OnSliceChanged(); - /** Initializes and sets the observers that are used to monitor changes in the selected position - or time point in order to actualize the view.h*/ - bool InitObservers(); - void RemoveObservers(const mitk::SliceNavigationController* deletedSlicer); - /** Removes all observers of the deletedPart. If null pointer is passed all observers will be removed.*/ - void RemoveAllObservers(mitk::IRenderWindowPart* deletedPart = nullptr); + void OnSliceNavigationControllerDeleted(const itk::Object* sender, const itk::EventObject& /*e*/); - /** Sets m_currentSelectedPosition to the current selection and validates if this position is valid + /** @brief Sets m_currentSelectedPosition to the current selection and validates if this position is valid * for the input image of the currently selected fit. If it is valid, m_validSelectedPosition is set to true. * If the fit, his input image or geometry is not specified, it will also handled as invalid.*/ void ValidateAndSetCurrentPosition(); - Ui::DicomInspectorViewControls m_Controls; - mitk::IRenderWindowPart* m_renderWindowPart; +private Q_SLOTS: + + /** @brief Updates the current slice and time is correctly displayed.*/ + void OnSliceChangedDelayed(); + +private: + + void RenderTable(); + + /** (Re-)initializes the headers of the data table.*/ + void UpdateData(); + void UpdateLabels(); + + void SetAsSelectionListener(bool checked); - // Needed for observing the events for when a slice or time step is changed. + Ui::QmitkDicomInspectorViewControls m_Controls; + mitk::IRenderWindowPart* m_RenderWindowPart; + + std::unique_ptr m_SelectionServiceConnector; + + /** Needed for observing the events for when a slice or time step is changed.*/ bool m_PendingSliceChangedEvent; - /**Helper structure to manage the registered observer events.*/ + /** Helper structure to manage the registered observer events.*/ struct ObserverInfo { mitk::SliceNavigationController* controller; int observerTag; std::string renderWindowName; mitk::IRenderWindowPart* renderWindowPart; ObserverInfo(mitk::SliceNavigationController* controller, int observerTag, const std::string& renderWindowName, mitk::IRenderWindowPart* part); }; typedef std::multimap ObserverMapType; ObserverMapType m_ObserverMap; - /** @brief currently valid selected position in the inspector*/ - mitk::Point3D m_currentSelectedPosition; - /** @brief indicates if the currently selected position is valid for the currently selected fit. - * This it is within the input image */ - bool m_validSelectedPosition; - - unsigned int m_currentSelectedTimeStep; - - itk::IndexValueType m_currentSelectedZSlice; + /** @brief Currently selected node for the DICOM information.*/ + mitk::DataNode::ConstPointer m_SelectedNode; + /** @brief Base data of the currently selected node.*/ + mitk::BaseData::ConstPointer m_SelectedData; - /** @brief currently selected node for the visualization logic*/ - mitk::DataNode::ConstPointer m_currentSelectedNode; + /** @brief Valid selected position in the inspector.*/ + mitk::Point3D m_SelectedPosition; + /** @brief Indicates if the currently selected position is valid for the currently selected data.*/ + bool m_ValidSelectedPosition; - mitk::BaseData::ConstPointer m_currentSelectedData; + unsigned int m_SelectedTimeStep; - /** @brief Is a visualization currently running? */ - bool m_internalUpdateFlag; - - /** @brief Number of interpolation steps between two x values */ - static const unsigned int INTERPOLATION_STEPS; + itk::IndexValueType m_CurrentSelectedZSlice; /*************************************/ /* Members for visualizing the model */ - itk::TimeStamp m_selectedNodeTime; - itk::TimeStamp m_currentFitTime; - itk::TimeStamp m_currentPositionTime; - itk::TimeStamp m_lastRefreshTime; + itk::TimeStamp m_SelectedNodeTime; + itk::TimeStamp m_CurrentPositionTime; /**Helper structure to manage the registered observer events.*/ struct TagInfo { mitk::DICOMTag tag; mitk::DICOMProperty::ConstPointer prop; - TagInfo(const mitk::DICOMTag& aTag, mitk::DICOMProperty::ConstPointer aProp) : tag(aTag), prop(aProp) + TagInfo(const mitk::DICOMTag& aTag, mitk::DICOMProperty::ConstPointer aProp) + : tag(aTag) + , prop(aProp) { }; }; typedef std::map TagMapType; TagMapType m_Tags; - void RenderTable(); - - /** (re)initializes the headers of the data table*/ - void UpdateData(); - void UpdateLabels(); }; #endif // QmitkDicomInspectorView_h diff --git a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorViewControls.ui b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorViewControls.ui index bd7b2fad2c..8acd57fbec 100644 --- a/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorViewControls.ui +++ b/Plugins/org.mitk.gui.qt.dicominspector/src/internal/QmitkDicomInspectorViewControls.ui @@ -1,194 +1,195 @@ - DicomInspectorViewControls - + QmitkDicomInspectorViewControls + 0 0 - 402 - 777 + 300 + 600 - - - 0 - 0 - - - - QmitkTemplate - 5 5 5 5 5 - - - - Time point: - - - - + + +- +- 0 +- 0 +- +- - Node: + Selected data node - + - + 0 0 - - textlabel + + + 0 + 40 + - - - - + + + + 0 0 - TextLabel + Time point - - + + - + 0 0 + + + + + +- +- 0 +- 0 +- +- - Slice Nr: + Slice number - + - + 0 0 - - TextLabel - 8 QAbstractItemView::NoEditTriggers false QAbstractItemView::NoSelection false 75 false false true false 20 20 Group # Element # Name Value - - - - - - - + + + QmitkSingleNodeSelectionWidget + QWidget +
QmitkSingleNodeSelectionWidget.h
+ 1 +
+