diff --git a/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.cpp b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.cpp new file mode 100644 index 0000000000..7d007f3e5a --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.cpp @@ -0,0 +1,135 @@ +/*============================================================================ + +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. + +============================================================================*/ + +#include + +#include +#include +#include +#include + +QmitkMultiLabelSegmentationInspector::QmitkMultiLabelSegmentationInspector(QWidget* parent/* = nullptr*/) + : QWidget(parent) +{ + m_Controls.setupUi(this); + + m_Model = new QmitkMultiLabelSegmentationTreeModel(this); + + m_Controls.view->setModel(m_Model); + + m_ColorItemDelegate = new QmitkLabelColorItemDelegate(this); + + auto visibleIcon = QmitkStyleManager::ThemeIcon(QLatin1String(":/Qmitk/visible.svg")); + auto invisibleIcon = QmitkStyleManager::ThemeIcon(QLatin1String(":/Qmitk/invisible.svg")); + m_VisibilityItemDelegate = new QmitkLabelToggleItemDelegate(visibleIcon, invisibleIcon, this); + + auto lockIcon = QmitkStyleManager::ThemeIcon(QLatin1String(":/Qmitk/lock.svg")); + auto unlockIcon = QmitkStyleManager::ThemeIcon(QLatin1String(":/Qmitk/unlock.svg")); + m_LockItemDelegate = new QmitkLabelToggleItemDelegate(lockIcon, unlockIcon, this); + + this->m_Controls.view->setItemDelegateForColumn(1, m_LockItemDelegate); + this->m_Controls.view->setItemDelegateForColumn(2, m_ColorItemDelegate); + this->m_Controls.view->setItemDelegateForColumn(3, m_VisibilityItemDelegate); + + connect(m_Model, &QAbstractItemModel::modelReset, this, &QmitkMultiLabelSegmentationInspector::OnModelReset); + //connect(m_Controls.view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), SLOT(ChangeModelSelection(const QItemSelection&, const QItemSelection&))); +} + +void QmitkMultiLabelSegmentationInspector::Initialize() +{ + m_Model->SetSegmentation(m_Segmentation.Lock()); + m_Controls.view->expandAll(); +} + +void QmitkMultiLabelSegmentationInspector::SetSelectionMode(SelectionMode mode) +{ + m_Controls.view->setSelectionMode(mode); +} + +QmitkMultiLabelSegmentationInspector::SelectionMode QmitkMultiLabelSegmentationInspector::GetSelectionMode() const +{ + return m_Controls.view->selectionMode(); +} + +void QmitkMultiLabelSegmentationInspector::SetMultiLabelSegmentation(mitk::LabelSetImage* segmentation) +{ + if (segmentation != m_Segmentation.Lock()) + { + m_Segmentation = segmentation; + this->Initialize(); + } +} + +void QmitkMultiLabelSegmentationInspector::OnModelReset() +{ +} + +bool EqualLabelSelections(const QmitkMultiLabelSegmentationInspector::LabelValueVectorType& selection1, const QmitkMultiLabelSegmentationInspector::LabelValueVectorType& selection2) +{ + if (selection1.size() == selection2.size()) + { + // lambda to compare node pointer inside both lists + auto lambda = [](mitk::LabelSetImage::LabelValueType lhs, mitk::LabelSetImage::LabelValueType rhs) { return lhs == rhs; }; + return std::is_permutation(selection1.begin(), selection1.end(), selection2.begin(), selection2.end(), lambda); + } + + return false; +} + +void QmitkMultiLabelSegmentationInspector::SetSelectedLabels(LabelValueVectorType selectedLabels) +{ + + bool equal = EqualLabelSelections(this->GetSelectedLabels(), selectedLabels); + if (equal) + { + return; + } + + // create new selection by retrieving the corresponding indices of the labels + QItemSelection newCurrentSelection; + for (const auto& labelID : selectedLabels) + { + QModelIndexList matched = m_Model->match(m_Model->index(0, 0), QmitkMultiLabelSegmentationTreeModel::ItemModelRole::LabelValueRole, QVariant(labelID), 1, Qt::MatchRecursive); + if (!matched.empty()) + { + newCurrentSelection.select(matched.front(), matched.front()); + } + } + + m_Controls.view->selectionModel()->select(newCurrentSelection, QItemSelectionModel::ClearAndSelect); +} + +void QmitkMultiLabelSegmentationInspector::SetSelectedLabel(mitk::LabelSetImage::LabelValueType selectedLabel) +{ + this->SetSelectedLabels({ selectedLabel }); +} + +QmitkMultiLabelSegmentationInspector::LabelValueVectorType QmitkMultiLabelSegmentationInspector::GetSelectedLabels() const +{ + LabelValueVectorType result; + QModelIndexList selectedIndexes = m_Controls.view->selectionModel()->selectedIndexes(); + for (const auto& index : qAsConst(selectedIndexes)) + { + QVariant qvariantDataNode = m_Model->data(index, QmitkMultiLabelSegmentationTreeModel::ItemModelRole::LabelValueRole); + if (qvariantDataNode.canConvert()) + { + result.push_back(qvariantDataNode.value()); + } + } + return result; +} + +void QmitkMultiLabelSegmentationInspector::ChangeModelSelection(const QItemSelection& selected, const QItemSelection& deselected) +{ + emit CurrentSelectionChanged(GetSelectedLabels()); +} + diff --git a/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.h b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.h new file mode 100644 index 0000000000..e1dc0b3f43 --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.h @@ -0,0 +1,100 @@ +/*============================================================================ + +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 QMITKMULTILABELSEGMENTATIONINSPECTOR_H +#define QMITKMULTILABELSEGMENTATIONINSPECTOR_H + +#include +#include + +#include +#include +#include "ui_QmitkMultiLabelSegmentationInspector.h" + +class QmitkMultiLabelSegmentationTreeModel; +class QStyledItemDelegate; + +/* +* @brief This is an inspector that offers a simple list view on a data storage. +*/ +class MITKSEGMENTATIONUI_EXPORT QmitkMultiLabelSegmentationInspector : public QWidget +{ + Q_OBJECT + +public: + QmitkMultiLabelSegmentationInspector(QWidget* parent = nullptr); + + using SelectionMode = QAbstractItemView::SelectionMode; + void SetSelectionMode(SelectionMode mode); + SelectionMode GetSelectionMode() const; + + /** + * @brief Sets the segmentation that will be used /monitored by the widget. + * + * @param segmentation A pointer to the segmentation to set. + */ + void SetMultiLabelSegmentation(mitk::LabelSetImage* segmentation); + + using LabelValueVectorType = mitk::LabelSetImage::LabelValueVectorType; + + /** + * @brief Retrieve the currently selected labels (equals the last CurrentSelectionChanged values). + */ + LabelValueVectorType GetSelectedLabels() const; + +Q_SIGNALS: + /** + * @brief A signal that will be emitted if the selected labels change. + * + * @param labels A list of label values that are now selected. + */ + void CurrentSelectionChanged(LabelValueVectorType labels); + +public Q_SLOTS: + + /** + * @brief Transform a list label values into a model selection and set this as a new selection of the view + * + * @param selectedNodes A list of data nodes that should be newly selected. + */ + void SetSelectedLabels(LabelValueVectorType selectedLabels); + void SetSelectedLabel(mitk::LabelSetImage::LabelValueType selectedLabel); + +protected: + void Initialize(); + void OnModelReset(); + + QmitkMultiLabelSegmentationTreeModel* m_Model; + mitk::WeakPointer m_Segmentation; + + QStyledItemDelegate* m_LockItemDelegate; + QStyledItemDelegate* m_ColorItemDelegate; + QStyledItemDelegate* m_VisibilityItemDelegate; + + Ui_QmitkMultiLabelSegmentationInspector m_Controls; + +private Q_SLOTS: + /** + * @brief Transform a labels selection into a data node list and emit the 'CurrentSelectionChanged'-signal. + * + * The function adds the selected nodes from the original selection that could not be modified, if + * 'm_SelectOnlyVisibleNodes' is false. + * This slot is internally connected to the 'selectionChanged'-signal of the selection model of the private member item view. + * + * @param selected The newly selected items. + * @param deselected The newly deselected items. + */ + void ChangeModelSelection(const QItemSelection& selected, const QItemSelection& deselected); + +}; + +#endif // QMITKDATASTORAGELISTINSPECTOR_H diff --git a/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.ui b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.ui new file mode 100644 index 0000000000..e5dbe37bb2 --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkMultiLabelSegmentationInspector.ui @@ -0,0 +1,62 @@ + + + QmitkMultiLabelSegmentationInspector + + + + 0 + 0 + 400 + 300 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + + + false + + + false + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectItems + + + + + + + + QmitkMultiLabelSegmentationTreeView + QTreeView +
QmitkMultiLabelSegmentationTreeView.h
+
+
+ + +
diff --git a/Modules/SegmentationUI/files.cmake b/Modules/SegmentationUI/files.cmake index c50e3b5579..15b7ba8b5b 100644 --- a/Modules/SegmentationUI/files.cmake +++ b/Modules/SegmentationUI/files.cmake @@ -1,101 +1,110 @@ set(CPP_FILES Qmitk/QmitkSegWithPreviewToolGUIBase.cpp Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.cpp Qmitk/QmitkBinaryThresholdToolGUIBase.cpp Qmitk/QmitkBinaryThresholdToolGUI.cpp Qmitk/QmitkBinaryThresholdULToolGUI.cpp Qmitk/QmitkConfirmSegmentationDialog.cpp Qmitk/QmitkCopyToClipBoardDialog.cpp Qmitk/QmitkDrawPaintbrushToolGUI.cpp Qmitk/QmitkErasePaintbrushToolGUI.cpp Qmitk/QmitkEditableContourToolGUIBase.cpp Qmitk/QmitkGrowCutToolGUI.cpp Qmitk/QmitkLiveWireTool2DGUI.cpp Qmitk/QmitkLassoToolGUI.cpp Qmitk/QmitkOtsuTool3DGUI.cpp Qmitk/QmitkPaintbrushToolGUI.cpp Qmitk/QmitkPickingToolGUI.cpp Qmitk/QmitkSlicesInterpolator.cpp Qmitk/QmitkToolGUI.cpp Qmitk/QmitkToolGUIArea.cpp Qmitk/QmitkToolSelectionBox.cpp Qmitk/QmitknnUNetFolderParser.cpp Qmitk/QmitknnUNetToolGUI.cpp Qmitk/QmitknnUNetWorker.cpp Qmitk/QmitknnUNetGPU.cpp Qmitk/QmitkSurfaceStampWidget.cpp Qmitk/QmitkMaskStampWidget.cpp Qmitk/QmitkStaticDynamicSegmentationDialog.cpp Qmitk/QmitkSimpleLabelSetListWidget.cpp Qmitk/QmitkSegmentationTaskListWidget.cpp + Qmitk/QmitkMultiLabelSegmentationInspector.cpp + Qmitk/QmitkMultiLabelSegmentationTreeModel.cpp + Qmitk/QmitkMultiLabelSegmentationTreeView.cpp + Qmitk/QmitkLabelColorItemDelegate.cpp + Qmitk/QmitkLabelToggleItemDelegate.cpp SegmentationUtilities/QmitkBooleanOperationsWidget.cpp -Qmitk/QmitkMultiLabelSegmentationTreeModel.cpp SegmentationUtilities/QmitkContourModelToImageWidget.cpp SegmentationUtilities/QmitkImageMaskingWidget.cpp SegmentationUtilities/QmitkMorphologicalOperationsWidget.cpp SegmentationUtilities/QmitkSurfaceToImageWidget.cpp SegmentationUtilities/QmitkSegmentationUtilityWidget.cpp SegmentationUtilities/QmitkDataSelectionWidget.cpp ) set(MOC_H_FILES Qmitk/QmitkSegWithPreviewToolGUIBase.h Qmitk/QmitkMultiLabelSegWithPreviewToolGUIBase.h Qmitk/QmitkBinaryThresholdToolGUIBase.h Qmitk/QmitkBinaryThresholdToolGUI.h Qmitk/QmitkBinaryThresholdULToolGUI.h Qmitk/QmitkConfirmSegmentationDialog.h Qmitk/QmitkCopyToClipBoardDialog.h Qmitk/QmitkDrawPaintbrushToolGUI.h Qmitk/QmitkErasePaintbrushToolGUI.h Qmitk/QmitkEditableContourToolGUIBase.h Qmitk/QmitkGrowCutToolGUI.h Qmitk/QmitkLiveWireTool2DGUI.h Qmitk/QmitkLassoToolGUI.h Qmitk/QmitkOtsuTool3DGUI.h Qmitk/QmitkPaintbrushToolGUI.h Qmitk/QmitkPickingToolGUI.h Qmitk/QmitkSlicesInterpolator.h Qmitk/QmitkToolGUI.h Qmitk/QmitkToolGUIArea.h Qmitk/QmitkToolSelectionBox.h Qmitk/QmitknnUNetFolderParser.h Qmitk/QmitknnUNetToolGUI.h Qmitk/QmitknnUNetGPU.h Qmitk/QmitknnUNetWorker.h Qmitk/QmitknnUNetEnsembleLayout.h Qmitk/QmitkSurfaceStampWidget.h Qmitk/QmitkMaskStampWidget.h Qmitk/QmitkStaticDynamicSegmentationDialog.h Qmitk/QmitkSimpleLabelSetListWidget.h Qmitk/QmitkSegmentationTaskListWidget.h + Qmitk/QmitkMultiLabelSegmentationInspector.h Qmitk/QmitkMultiLabelSegmentationTreeModel.h + Qmitk/QmitkMultiLabelSegmentationTreeView.h + Qmitk/QmitkLabelColorItemDelegate.h + Qmitk/QmitkLabelToggleItemDelegate.h SegmentationUtilities/QmitkBooleanOperationsWidget.h SegmentationUtilities/QmitkContourModelToImageWidget.h SegmentationUtilities/QmitkImageMaskingWidget.h SegmentationUtilities/QmitkMorphologicalOperationsWidget.h SegmentationUtilities/QmitkSurfaceToImageWidget.h SegmentationUtilities/QmitkSegmentationUtilityWidget.h SegmentationUtilities/QmitkDataSelectionWidget.h ) set(UI_FILES Qmitk/QmitkConfirmSegmentationDialog.ui Qmitk/QmitkGrowCutToolWidgetControls.ui Qmitk/QmitkOtsuToolWidgetControls.ui Qmitk/QmitkSurfaceStampWidgetGUIControls.ui Qmitk/QmitkMaskStampWidgetGUIControls.ui Qmitk/QmitknnUNetToolGUIControls.ui Qmitk/QmitkEditableContourToolGUIControls.ui Qmitk/QmitkSegmentationTaskListWidget.ui + Qmitk/QmitkMultiLabelSegmentationInspector.ui SegmentationUtilities/QmitkBooleanOperationsWidgetControls.ui SegmentationUtilities/QmitkContourModelToImageWidgetControls.ui SegmentationUtilities/QmitkImageMaskingWidgetControls.ui SegmentationUtilities/QmitkMorphologicalOperationsWidgetControls.ui SegmentationUtilities/QmitkSurfaceToImageWidgetControls.ui SegmentationUtilities/QmitkDataSelectionWidgetControls.ui ) set(QRC_FILES resources/SegmentationUI.qrc )