diff --git a/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp new file mode 100644 index 0000000000..8d6f3215f9 --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp @@ -0,0 +1,182 @@ +/*============================================================================ + +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 "QmitkSimpleLabelSetListWidget.h" + +#include "mitkMessage.h" + +#include + +QmitkSimpleLabelSetListWidget::QmitkSimpleLabelSetListWidget(QWidget* parent) : QWidget(parent), m_LabelList(nullptr) +{ + QGridLayout* layout = new QGridLayout(this); + this->setContentsMargins(0, 0, 0, 0); + + m_LabelList = new QListWidget(this); + m_LabelList->setSelectionMode(QAbstractItemView::MultiSelection); + m_LabelList->setResizeMode(QListView::Adjust); + m_LabelList->setAutoScrollMargin(0); + layout->addWidget(m_LabelList); + + connect(m_LabelList, SIGNAL(itemSelectionChanged()), this, SLOT(OnLabelSelectionChanged())); +} + +QmitkSimpleLabelSetListWidget::~QmitkSimpleLabelSetListWidget() +{ + if (m_LabelSetImage.IsNotNull()) + { + m_LabelSetImage->BeforeChangeLayerEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); + m_LabelSetImage->AfterChangeLayerEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnEstablishLabelSetConnection); + OnLooseLabelSetConnection(); + } +} + +QmitkSimpleLabelSetListWidget::LabelVectorType QmitkSimpleLabelSetListWidget::SelectedLabels() const +{ + auto selectedItems = m_LabelList->selectedItems(); + LabelVectorType result; + + QList::Iterator it; + for (it = selectedItems.begin(); it != selectedItems.end(); ++it) + { + auto labelValue = (*it)->data(Qt::UserRole).toUInt(); + + + auto activeLayerID = m_LabelSetImage->GetActiveLayer(); + auto labelSet = m_LabelSetImage->GetLabelSet(activeLayerID); + + result.push_back(labelSet->GetLabel(labelValue)); + } + + return result; +} + +const mitk::LabelSetImage* QmitkSimpleLabelSetListWidget::GetLabelSetImage() const +{ + return m_LabelSetImage; +} + +void QmitkSimpleLabelSetListWidget::SetLabelSetImage(const mitk::LabelSetImage* image) +{ + if (image != m_LabelSetImage) + { + if (m_LabelSetImage.IsNotNull()) + { + m_LabelSetImage->BeforeChangeLayerEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); + m_LabelSetImage->AfterChangeLayerEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLayerChanged); + this->OnLooseLabelSetConnection(); + } + + m_LabelSetImage = image; + + if (m_LabelSetImage.IsNotNull()) + { + m_LabelSetImage->BeforeChangeLayerEvent += mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); + m_LabelSetImage->AfterChangeLayerEvent += mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLayerChanged); + this->OnLayerChanged(); + } + } +} + +void QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection() +{ + if (m_LabelSetImage.IsNull()) + return; + + auto activeLayerID = m_LabelSetImage->GetActiveLayer(); + auto labelSet = m_LabelSetImage->GetLabelSet(activeLayerID); + + // Reset LabelSetWidget Events + labelSet->AddLabelEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); + labelSet->RemoveLabelEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); + labelSet->ModifyLabelEvent -= mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); +} + +void QmitkSimpleLabelSetListWidget::OnEstablishLabelSetConnection() +{ + if (m_LabelSetImage.IsNull()) + return; + + auto activeLayerID = m_LabelSetImage->GetActiveLayer(); + auto labelSet = m_LabelSetImage->GetLabelSet(activeLayerID); + + // Reset LabelSetWidget Events + labelSet->AddLabelEvent += mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); + labelSet->RemoveLabelEvent += mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); + labelSet->ModifyLabelEvent += mitk::MessageDelegate( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); +} + +void QmitkSimpleLabelSetListWidget::OnLayerChanged() +{ + this->OnEstablishLabelSetConnection(); + this->ResetList(); + emit ActiveLayerChanged(); + emit SelectedLabelsChanged(this->SelectedLabels()); +} + +void QmitkSimpleLabelSetListWidget::OnLabelChanged() +{ + this->ResetList(); + emit ActiveLayerChanged(); + emit SelectedLabelsChanged(this->SelectedLabels()); +} + +void QmitkSimpleLabelSetListWidget::OnLabelSelectionChanged() +{ + emit SelectedLabelsChanged(this->SelectedLabels()); +} + +void QmitkSimpleLabelSetListWidget::ResetList() +{ + m_LabelList->clear(); + + auto activeLayerID = m_LabelSetImage->GetActiveLayer(); + auto labelSet = m_LabelSetImage->GetLabelSet(activeLayerID); + + auto iter = labelSet->IteratorConstBegin(); + for (; iter != labelSet->IteratorConstEnd(); ++iter) + { + auto color = iter->second->GetColor(); + QPixmap pixmap(10, 10); + pixmap.fill(QColor(color[0] * 255, color[1] * 255, color[2] * 255)); + QIcon icon(pixmap); + + QListWidgetItem* item = new QListWidgetItem(icon, QString::fromStdString(iter->second->GetName())); + item->setData(Qt::UserRole, QVariant(iter->second->GetValue())); + m_LabelList->addItem(item); + } +} + +void QmitkSimpleLabelSetListWidget::SetSelectedLabels(const LabelVectorType& selectedLabels) +{ + for (int i = 0; i < m_LabelList->count(); ++i) + { + QListWidgetItem* item = m_LabelList->item(i); + auto labelValue = item->data(Qt::UserRole).toUInt(); + + auto finding = std::find_if(selectedLabels.begin(), selectedLabels.end(), [labelValue](const mitk::Label* label) {return label->GetValue() == labelValue; }); + item->setSelected(finding != selectedLabels.end()); + } +} + diff --git a/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.h b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.h new file mode 100644 index 0000000000..88c716ff0c --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.h @@ -0,0 +1,63 @@ +/*============================================================================ + +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 QmitkSimpleLabelSetListWidget_h_Included +#define QmitkSimpleLabelSetListWidget_h_Included + +#include "mitkLabel.h" +#include "mitkLabelSetImage.h" +#include +#include + +/** + \brief Widget that offers a simple list that displays all labels (color and name) in the active + layer of a LabelSetImage. +*/ +class MITKSEGMENTATIONUI_EXPORT QmitkSimpleLabelSetListWidget : public QWidget +{ + Q_OBJECT + +public: + QmitkSimpleLabelSetListWidget(QWidget* parent = nullptr); + ~QmitkSimpleLabelSetListWidget() override; + + using LabelVectorType = std::vector; + + LabelVectorType SelectedLabels() const; + const mitk::LabelSetImage* GetLabelSetImage() const; + +signals: + void SelectedLabelsChanged(const LabelVectorType& selectedLabels); + void ActiveLayerChanged(); + +public slots : + void SetLabelSetImage(const mitk::LabelSetImage* image); + void SetSelectedLabels(const LabelVectorType& selectedLabels); + +protected slots: + + void OnLabelSelectionChanged(); + +protected: + void OnLayerChanged(); + void OnLabelChanged(); + + void OnLooseLabelSetConnection(); + void OnEstablishLabelSetConnection(); + + void ResetList(); + + mitk::LabelSetImage::ConstPointer m_LabelSetImage; + QListWidget* m_LabelList; +}; + +#endif diff --git a/Modules/SegmentationUI/Qmitk/QmitkWatershedToolGUIControls.ui b/Modules/SegmentationUI/Qmitk/QmitkWatershedToolGUIControls.ui new file mode 100644 index 0000000000..7dd8d4fd14 --- /dev/null +++ b/Modules/SegmentationUI/Qmitk/QmitkWatershedToolGUIControls.ui @@ -0,0 +1,162 @@ + + + QmitkWatershedToolGUIControls + + + + 0 + 0 + 192 + 352 + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100000 + 100000 + + + + QmitkOtsuToolWidget + + + + + + + + Level: + + + + + + + + 0 + 0 + + + + Threshold: + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 10000000 + 100 + + + + + + + + + 0 + 0 + + + + + 100000 + 16777215 + + + + Preview + + + + + + + false + + + + 0 + 0 + + + + + 100000 + 16777215 + + + + Confirm Segmentation + + + + + + + Process/overwrite all time steps of the dynamic segmentation and not just the currently visible time step. + + + Process all time steps + + + + + + + Add the confirmed segmentation as a new segmentation instead of overwriting the currently selected. + + + Create as new segmentation + + + + + + + + + QmitkSimpleLabelSetListWidget + QWidget +
QmitkSimpleLabelSetListWidget.h
+
+ + ctkSliderWidget + QWidget +
ctkSliderWidget.h
+ 1 +
+
+ + +
diff --git a/Modules/SegmentationUI/files.cmake b/Modules/SegmentationUI/files.cmake index a7ba3f718d..d84231e8a4 100644 --- a/Modules/SegmentationUI/files.cmake +++ b/Modules/SegmentationUI/files.cmake @@ -1,81 +1,84 @@ set( CPP_FILES Qmitk/QmitkAdaptiveRegionGrowingToolGUI.cpp Qmitk/QmitkBinaryThresholdToolGUI.cpp Qmitk/QmitkBinaryThresholdULToolGUI.cpp Qmitk/QmitkCalculateGrayValueStatisticsToolGUI.cpp Qmitk/QmitkConfirmSegmentationDialog.cpp Qmitk/QmitkCopyToClipBoardDialog.cpp Qmitk/QmitkDrawPaintbrushToolGUI.cpp Qmitk/QmitkErasePaintbrushToolGUI.cpp Qmitk/QmitkFastMarchingTool3DGUI.cpp Qmitk/QmitkFastMarchingToolGUI.cpp Qmitk/QmitkLiveWireTool2DGUI.cpp Qmitk/QmitkNewSegmentationDialog.cpp Qmitk/QmitkOtsuTool3DGUI.cpp Qmitk/QmitkPaintbrushToolGUI.cpp Qmitk/QmitkPickingToolGUI.cpp Qmitk/QmitkPixelManipulationToolGUI.cpp Qmitk/QmitkSlicesInterpolator.cpp Qmitk/QmitkToolGUI.cpp Qmitk/QmitkToolGUIArea.cpp Qmitk/QmitkToolSelectionBox.cpp Qmitk/QmitkWatershedToolGUI.cpp #Added from ML Qmitk/QmitkLabelSetWidget.cpp Qmitk/QmitkSurfaceStampWidget.cpp Qmitk/QmitkMaskStampWidget.cpp Qmitk/QmitkSliceBasedInterpolatorWidget.cpp Qmitk/QmitkSurfaceBasedInterpolatorWidget.cpp Qmitk/QmitkSearchLabelDialog.cpp +Qmitk/QmitkSimpleLabelSetListWidget.cpp ) set(MOC_H_FILES Qmitk/QmitkAdaptiveRegionGrowingToolGUI.h Qmitk/QmitkBinaryThresholdToolGUI.h Qmitk/QmitkBinaryThresholdULToolGUI.h Qmitk/QmitkCalculateGrayValueStatisticsToolGUI.h Qmitk/QmitkConfirmSegmentationDialog.h Qmitk/QmitkCopyToClipBoardDialog.h Qmitk/QmitkDrawPaintbrushToolGUI.h Qmitk/QmitkErasePaintbrushToolGUI.h Qmitk/QmitkFastMarchingTool3DGUI.h Qmitk/QmitkFastMarchingToolGUI.h Qmitk/QmitkLiveWireTool2DGUI.h Qmitk/QmitkNewSegmentationDialog.h Qmitk/QmitkOtsuTool3DGUI.h Qmitk/QmitkPaintbrushToolGUI.h Qmitk/QmitkPickingToolGUI.h Qmitk/QmitkPixelManipulationToolGUI.h Qmitk/QmitkSlicesInterpolator.h Qmitk/QmitkToolGUI.h Qmitk/QmitkToolGUIArea.h Qmitk/QmitkToolSelectionBox.h Qmitk/QmitkWatershedToolGUI.h #Added from ML Qmitk/QmitkLabelSetWidget.h Qmitk/QmitkSurfaceStampWidget.h Qmitk/QmitkMaskStampWidget.h Qmitk/QmitkSliceBasedInterpolatorWidget.h Qmitk/QmitkSurfaceBasedInterpolatorWidget.h Qmitk/QmitkSearchLabelDialog.h +Qmitk/QmitkSimpleLabelSetListWidget.h ) set(UI_FILES Qmitk/QmitkAdaptiveRegionGrowingToolGUIControls.ui Qmitk/QmitkConfirmSegmentationDialog.ui Qmitk/QmitkOtsuToolWidgetControls.ui Qmitk/QmitkPickingToolGUIControls.ui Qmitk/QmitkLiveWireTool2DGUIControls.ui +Qmitk/QmitkWatershedToolGUIControls.ui #Added from ML Qmitk/QmitkLabelSetWidgetControls.ui Qmitk/QmitkSurfaceStampWidgetGUIControls.ui Qmitk/QmitkMaskStampWidgetGUIControls.ui Qmitk/QmitkSliceBasedInterpolatorWidgetGUIControls.ui Qmitk/QmitkSurfaceBasedInterpolatorWidgetGUIControls.ui Qmitk/QmitkSearchLabelDialogGUI.ui ) set(QRC_FILES resources/SegmentationUI.qrc )