diff --git a/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp index ce0e57f777..2a72f0e1bb 100644 --- a/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp +++ b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.cpp @@ -1,199 +1,167 @@ /*============================================================================ 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 <qlayout.h> QmitkSimpleLabelSetListWidget::QmitkSimpleLabelSetListWidget(QWidget* parent) : QWidget(parent), m_LabelList(nullptr), m_Emmiting(false) { 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<QmitkSimpleLabelSetListWidget>( - this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); m_LabelSetImage->AfterChangeLayerEvent -= mitk::MessageDelegate<QmitkSimpleLabelSetListWidget>( - this, &QmitkSimpleLabelSetListWidget::OnEstablishLabelSetConnection); - OnLooseLabelSetConnection(); + this, &QmitkSimpleLabelSetListWidget::OnLayerChanged); + m_LabelSetImage->RemoveLabelAddedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->RemoveLabelModifiedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->RemoveLabelRemovedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); } } QmitkSimpleLabelSetListWidget::LabelVectorType QmitkSimpleLabelSetListWidget::SelectedLabels() const { auto selectedItems = m_LabelList->selectedItems(); LabelVectorType result; QList<QListWidgetItem*>::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)); + result.push_back(m_LabelSetImage->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<QmitkSimpleLabelSetListWidget>( - this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); m_LabelSetImage->AfterChangeLayerEvent -= mitk::MessageDelegate<QmitkSimpleLabelSetListWidget>( this, &QmitkSimpleLabelSetListWidget::OnLayerChanged); - this->OnLooseLabelSetConnection(); + m_LabelSetImage->RemoveLabelAddedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->RemoveLabelModifiedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->RemoveLabelRemovedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); } m_LabelSetImage = image; if (m_LabelSetImage.IsNotNull()) { - m_LabelSetImage->BeforeChangeLayerEvent += mitk::MessageDelegate<QmitkSimpleLabelSetListWidget>( - this, &QmitkSimpleLabelSetListWidget::OnLooseLabelSetConnection); m_LabelSetImage->AfterChangeLayerEvent += mitk::MessageDelegate<QmitkSimpleLabelSetListWidget>( this, &QmitkSimpleLabelSetListWidget::OnLayerChanged); - this->OnLayerChanged(); + m_LabelSetImage->AddLabelAddedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->AddLabelModifiedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); + m_LabelSetImage->AddLabelRemovedListener(mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( + this, &QmitkSimpleLabelSetListWidget::OnLabelChanged)); } } } -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::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); - labelSet->RemoveLabelEvent -= mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); - labelSet->ModifyLabelEvent -= mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - 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::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); - labelSet->RemoveLabelEvent += mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); - labelSet->ModifyLabelEvent += mitk::MessageDelegate1<QmitkSimpleLabelSetListWidget, mitk::LabelSetImage::LabelValueType>( - this, &QmitkSimpleLabelSetListWidget::OnLabelChanged); -} - void QmitkSimpleLabelSetListWidget::OnLayerChanged() { - this->OnEstablishLabelSetConnection(); if (!this->m_Emmiting) { this->ResetList(); this->m_Emmiting = true; emit ActiveLayerChanged(); emit SelectedLabelsChanged(this->SelectedLabels()); this->m_Emmiting = false; } } -void QmitkSimpleLabelSetListWidget::OnLabelChanged(mitk::LabelSetImage::LabelValueType /*lv*/) +void QmitkSimpleLabelSetListWidget::OnLabelChanged(mitk::LabelSetImage::LabelValueType lv) { - if (!this->m_Emmiting) + if (!this->m_Emmiting && m_LabelSetImage->GetGroupIndexOfLabel(lv)==m_LabelSetImage->GetActiveLayer()) { this->ResetList(); this->m_Emmiting = true; emit ActiveLayerChanged(); emit SelectedLabelsChanged(this->SelectedLabels()); this->m_Emmiting = false; } } void QmitkSimpleLabelSetListWidget::OnLabelSelectionChanged() { if (!this->m_Emmiting) { this->m_Emmiting = true; emit SelectedLabelsChanged(this->SelectedLabels()); this->m_Emmiting = false; } } void QmitkSimpleLabelSetListWidget::ResetList() { m_LabelList->clear(); auto activeLayerID = m_LabelSetImage->GetActiveLayer(); - auto labelSet = m_LabelSetImage->GetLabelSet(activeLayerID); + auto labels = m_LabelSetImage->GetConstLabelsByValue(m_LabelSetImage->GetLabelValuesByGroup(activeLayerID)); - auto iter = labelSet->IteratorConstBegin(); - for (; iter != labelSet->IteratorConstEnd(); ++iter) + for (auto& label : labels) { - auto color = iter->second->GetColor(); + auto color = label->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())); + QListWidgetItem* item = new QListWidgetItem(icon, QString::fromStdString(label->GetName())); + item->setData(Qt::UserRole, QVariant(label->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 index 7eb5153611..136e900d0b 100644 --- a/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.h +++ b/Modules/SegmentationUI/Qmitk/QmitkSimpleLabelSetListWidget.h @@ -1,64 +1,61 @@ /*============================================================================ 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 #define QmitkSimpleLabelSetListWidget_h #include "mitkLabel.h" #include "mitkLabelSetImage.h" #include <MitkSegmentationUIExports.h> #include <QListWidget> /** \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<mitk::Label::ConstPointer>; 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(mitk::LabelSetImage::LabelValueType lv); - void OnLooseLabelSetConnection(); - void OnEstablishLabelSetConnection(); - void ResetList(); mitk::LabelSetImage::ConstPointer m_LabelSetImage; QListWidget* m_LabelList; bool m_Emmiting; }; #endif