diff --git a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.cpp b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.cpp index 98933fe429..943ac27d09 100644 --- a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.cpp +++ b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.cpp @@ -1,456 +1,482 @@ /*============================================================================ 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 "mitkGetPropertyService.h" #include "QmitkAddNewPropertyDialog.h" #include "QmitkPropertiesPreferencePage.h" #include "QmitkPropertyItemDelegate.h" #include "QmitkPropertyItemModel.h" #include "QmitkPropertyItemSortFilterProxyModel.h" #include "QmitkPropertyTreeView.h" #include #include #include #include #include #include #include #include const std::string QmitkPropertyTreeView::VIEW_ID = "org.mitk.views.properties"; QmitkPropertyTreeView::QmitkPropertyTreeView() : m_Parent(nullptr), m_PropertyNameChangedTag(0), m_PropertyAliases(nullptr), m_PropertyDescriptions(nullptr), m_PropertyPersistence(nullptr), m_ShowAliasesInDescription(true), m_ShowPersistenceInDescription(true), m_DeveloperMode(false), m_ProxyModel(nullptr), m_Model(nullptr), m_Delegate(nullptr), m_Renderer(nullptr) { } QmitkPropertyTreeView::~QmitkPropertyTreeView() { } +void QmitkPropertyTreeView::SetFocus() +{ + m_Controls.filterLineEdit->setFocus(); +} + +void QmitkPropertyTreeView::RenderWindowPartActivated(mitk::IRenderWindowPart* /*renderWindowPart*/) +{ + if (m_Controls.propertyListComboBox->count() == 2) + { + QHash renderWindows = this->GetRenderWindowPart()->GetQmitkRenderWindows(); + + Q_FOREACH(QString renderWindow, renderWindows.keys()) + { + m_Controls.propertyListComboBox->insertItem(m_Controls.propertyListComboBox->count() - 1, QString("Data node: ") + renderWindow); + } + } +} + +void QmitkPropertyTreeView::RenderWindowPartDeactivated(mitk::IRenderWindowPart*) +{ + if (m_Controls.propertyListComboBox->count() > 2) + { + m_Controls.propertyListComboBox->clear(); + m_Controls.propertyListComboBox->addItem("Data node: common"); + m_Controls.propertyListComboBox->addItem("Base data"); + } +} + void QmitkPropertyTreeView::CreateQtPartControl(QWidget* parent) { m_Parent = parent; m_Controls.setupUi(parent); m_Controls.propertyListComboBox->addItem("Data node: common"); mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); - if (renderWindowPart != nullptr) { QHash renderWindows = renderWindowPart->GetQmitkRenderWindows(); - Q_FOREACH(QString renderWindow, renderWindows.keys()) + for(const auto& renderWindow : renderWindows.keys()) { m_Controls.propertyListComboBox->addItem(QString("Data node: ") + renderWindow); } } m_Controls.propertyListComboBox->addItem("Base data"); m_Controls.newButton->setEnabled(false); this->HideAllIcons(); m_Controls.descriptionLabel->hide(); m_Controls.propertyListLabel->hide(); m_Controls.propertyListComboBox->hide(); m_Controls.newButton->hide(); m_ProxyModel = new QmitkPropertyItemSortFilterProxyModel(m_Controls.treeView); m_Model = new QmitkPropertyItemModel(m_ProxyModel); m_ProxyModel->setSourceModel(m_Model); m_ProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_ProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); m_ProxyModel->setDynamicSortFilter(true); m_Delegate = new QmitkPropertyItemDelegate(m_Controls.treeView); + 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.filterLineEdit->setClearButtonEnabled(true); m_Controls.treeView->setItemDelegateForColumn(1, m_Delegate); m_Controls.treeView->setModel(m_ProxyModel); m_Controls.treeView->setColumnWidth(0, 160); m_Controls.treeView->sortByColumn(0, Qt::AscendingOrder); m_Controls.treeView->setSelectionBehavior(QAbstractItemView::SelectRows); m_Controls.treeView->setSelectionMode(QAbstractItemView::SingleSelection); m_Controls.treeView->setEditTriggers(QAbstractItemView::SelectedClicked | QAbstractItemView::DoubleClicked); const int ICON_SIZE = 32; auto icon = berry::QtStyleManager::ThemeIcon(QStringLiteral(":/org_mitk_icons/icons/awesome/scalable/tags.svg")); m_Controls.tagsLabel->setPixmap(icon.pixmap(ICON_SIZE)); icon = berry::QtStyleManager::ThemeIcon(QStringLiteral(":/org_mitk_icons/icons/awesome/scalable/tag.svg")); m_Controls.tagLabel->setPixmap(icon.pixmap(ICON_SIZE)); icon = berry::QtStyleManager::ThemeIcon(QStringLiteral(":/org_mitk_icons/icons/awesome/scalable/actions/document-save.svg")); m_Controls.saveLabel->setPixmap(icon.pixmap(ICON_SIZE)); - connect(m_Controls.filterLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnFilterTextChanged(const QString&))); - connect(m_Controls.propertyListComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(OnPropertyListChanged(int))); - connect(m_Controls.newButton, SIGNAL(clicked()), this, SLOT(OnAddNewProperty())); - connect(m_Controls.treeView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(OnCurrentRowChanged(const QModelIndex&, const QModelIndex&))); - connect(m_Model, SIGNAL(modelReset()), this, SLOT(OnModelReset())); -} - -QString QmitkPropertyTreeView::GetPropertyNameOrAlias(const QModelIndex& index) -{ - QString propertyName; - - if (index.isValid()) - { - QModelIndex current = index; - - while (current.isValid()) - { - QString name = m_ProxyModel->data(m_ProxyModel->index(current.row(), 0, current.parent())).toString(); - - propertyName.prepend(propertyName.isEmpty() - ? name - : name.append('.')); - - current = current.parent(); - } - } - - return propertyName; -} - -void QmitkPropertyTreeView::OnCurrentRowChanged(const QModelIndex& current, const QModelIndex&) -{ - if (m_PropertyDescriptions != nullptr && current.isValid()) - { - QString name = this->GetPropertyNameOrAlias(current); - - if (!name.isEmpty()) - { - QString alias; - bool isTrueName = true; - - if (m_PropertyAliases != nullptr) - { - std::string trueName = m_PropertyAliases->GetPropertyName(name.toStdString()); - - if (trueName.empty() && !m_SelectionClassName.empty()) - trueName = m_PropertyAliases->GetPropertyName(name.toStdString(), m_SelectionClassName); - - if (!trueName.empty()) - { - alias = name; - name = QString::fromStdString(trueName); - isTrueName = false; - } - } - - QString description = QString::fromStdString(m_PropertyDescriptions->GetDescription(name.toStdString())); - std::vector aliases; - - if (!isTrueName && m_PropertyAliases != nullptr) - { - aliases = m_PropertyAliases->GetAliases(name.toStdString(), m_SelectionClassName); - - if (aliases.empty() && !m_SelectionClassName.empty()) - aliases = m_PropertyAliases->GetAliases(name.toStdString()); - } - - bool isPersistent = false; - - if (m_PropertyPersistence != nullptr) - isPersistent = m_PropertyPersistence->HasInfo(name.toStdString()); - - if (!description.isEmpty() || !aliases.empty() || isPersistent) - { - QString customizedDescription; - - if (m_ShowAliasesInDescription && !aliases.empty()) - { - customizedDescription = "

" + name + "

"; - - std::size_t numAliases = aliases.size(); - std::size_t lastAlias = numAliases - 1; - - for (std::size_t i = 0; i < numAliases; ++i) - { - customizedDescription += i != lastAlias - ? "
" - : "
"; - - customizedDescription += QString::fromStdString(aliases[i]) + "
"; - } - } - else - { - customizedDescription = "

" + name + "

"; - } - - if (!description.isEmpty()) - customizedDescription += "

" + description + "

"; - - m_Controls.tagsLabel->setVisible(!aliases.empty() && aliases.size() > 1); - m_Controls.tagLabel->setVisible(!aliases.empty() && aliases.size() == 1); - m_Controls.saveLabel->setVisible(isPersistent); - - m_Controls.descriptionLabel->setText(customizedDescription); - m_Controls.descriptionLabel->show(); - - return; - } - } - } - - m_Controls.descriptionLabel->hide(); - this->HideAllIcons(); -} - -void QmitkPropertyTreeView::OnFilterTextChanged(const QString& filter) -{ - m_ProxyModel->setFilterWildcard(filter); - - if (filter.isEmpty()) - m_Controls.treeView->collapseAll(); - else - m_Controls.treeView->expandAll(); -} - -void QmitkPropertyTreeView::OnModelReset() -{ - m_Controls.descriptionLabel->hide(); - this->HideAllIcons(); + connect(m_Controls.singleSlot, &QmitkSingleNodeSelectionWidget::CurrentSelectionChanged, + this, &QmitkPropertyTreeView::OnCurrentSelectionChanged); + connect(m_Controls.filterLineEdit, &QLineEdit::textChanged, + this, &QmitkPropertyTreeView::OnFilterTextChanged); + connect(m_Controls.propertyListComboBox, static_cast(&QComboBox::currentIndexChanged), + this, &QmitkPropertyTreeView::OnPropertyListChanged); + connect(m_Controls.newButton, &QPushButton::clicked, + this, &QmitkPropertyTreeView::OnAddNewProperty); + connect(m_Controls.treeView->selectionModel(), &QItemSelectionModel::currentRowChanged, + this, &QmitkPropertyTreeView::OnCurrentRowChanged); + connect(m_Model, &QmitkPropertyItemModel::modelReset, + this, &QmitkPropertyTreeView::OnModelReset); } void QmitkPropertyTreeView::OnPreferencesChanged(const berry::IBerryPreferences* preferences) { bool showAliases = preferences->GetBool(QmitkPropertiesPreferencePage::SHOW_ALIASES, true); bool showDescriptions = preferences->GetBool(QmitkPropertiesPreferencePage::SHOW_DESCRIPTIONS, true); bool showAliasesInDescription = preferences->GetBool(QmitkPropertiesPreferencePage::SHOW_ALIASES_IN_DESCRIPTION, true); bool showPersistenceInDescription = preferences->GetBool(QmitkPropertiesPreferencePage::SHOW_PERSISTENCE_IN_DESCRIPTION, true); bool developerMode = preferences->GetBool(QmitkPropertiesPreferencePage::DEVELOPER_MODE, false); bool filterProperties = preferences->GetBool(QmitkPropertiesPreferencePage::FILTER_PROPERTIES, true); m_Model->SetFilterProperties(filterProperties); m_Model->SetShowAliases(showAliases); bool updateAliases = showAliases != (m_PropertyAliases != nullptr); bool updateDescriptions = showDescriptions != (m_PropertyDescriptions != nullptr); bool updateAliasesInDescription = showAliasesInDescription != m_ShowAliasesInDescription; bool updatePersistenceInDescription = showPersistenceInDescription != m_ShowPersistenceInDescription; bool updateDeveloperMode = developerMode != m_DeveloperMode; if (updateAliases) m_PropertyAliases = showAliases - ? mitk::GetPropertyService() - : nullptr; + ? mitk::GetPropertyService() + : nullptr; if (updateDescriptions) m_PropertyDescriptions = showDescriptions - ? mitk::GetPropertyService() - : nullptr; + ? mitk::GetPropertyService() + : nullptr; if (showPersistenceInDescription) m_PropertyPersistence = mitk::GetPropertyService(); if (updateAliasesInDescription) m_ShowAliasesInDescription = showAliasesInDescription; if (updatePersistenceInDescription) m_ShowPersistenceInDescription = showPersistenceInDescription; if (updateDescriptions || updateAliasesInDescription || updatePersistenceInDescription) { QModelIndexList selection = m_Controls.treeView->selectionModel()->selectedRows(); if (!selection.isEmpty()) this->OnCurrentRowChanged(selection[0], selection[0]); } if (updateDeveloperMode) { m_DeveloperMode = developerMode; if (!developerMode) m_Controls.propertyListComboBox->setCurrentIndex(0); m_Controls.propertyListLabel->setVisible(developerMode); m_Controls.propertyListComboBox->setVisible(developerMode); m_Controls.newButton->setVisible(developerMode); } m_Model->OnPreferencesChanged(); } -void QmitkPropertyTreeView::OnPropertyNameChanged(const itk::EventObject&) +void QmitkPropertyTreeView::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); + } +} + +QString QmitkPropertyTreeView::GetPropertyNameOrAlias(const QModelIndex& index) +{ + QString propertyName; + + if (index.isValid()) + { + QModelIndex current = index; + + while (current.isValid()) + { + QString name = m_ProxyModel->data(m_ProxyModel->index(current.row(), 0, current.parent())).toString(); + + propertyName.prepend(propertyName.isEmpty() + ? name + : name.append('.')); + + current = current.parent(); + } + } + + return propertyName; +} + +void QmitkPropertyTreeView::OnPropertyNameChanged() { mitk::PropertyList* propertyList = m_Model->GetPropertyList(); if (propertyList != nullptr) { mitk::BaseProperty* nameProperty = propertyList->GetProperty("name"); if (nameProperty != nullptr) { QString partName = "Properties ("; partName.append(QString::fromStdString(nameProperty->GetValueAsString())).append(')'); this->SetPartName(partName); } } } -void QmitkPropertyTreeView::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) +void QmitkPropertyTreeView::OnCurrentSelectionChanged(QList nodes) { mitk::PropertyList* propertyList = m_Model->GetPropertyList(); if (propertyList != nullptr) { mitk::BaseProperty* nameProperty = propertyList->GetProperty("name"); if (nameProperty != nullptr) nameProperty->RemoveObserver(m_PropertyNameChangedTag); m_PropertyNameChangedTag = 0; } if (nodes.empty() || nodes.front().IsNull()) { m_SelectedNode = nullptr; this->SetPartName("Properties"); m_Model->SetPropertyList(nullptr); m_Delegate->SetPropertyList(nullptr); m_Controls.newButton->setEnabled(false); - } - else - { - m_SelectedNode = nodes.front(); - QString selectionClassName = m_SelectedNode->GetData() != nullptr - ? m_SelectedNode->GetData()->GetNameOfClass() - : ""; - - m_SelectionClassName = selectionClassName.toStdString(); + return; + } - mitk::PropertyList::Pointer propertyList; + // node is selected, create tree with node properties + m_SelectedNode = nodes.front(); - if (m_Renderer == nullptr && m_Controls.propertyListComboBox->currentText() == "Base data") - { - propertyList = m_SelectedNode->GetData() != nullptr - ? m_SelectedNode->GetData()->GetPropertyList() - : nullptr; - } - else - { - propertyList = m_SelectedNode->GetPropertyList(m_Renderer); - } + QString selectionClassName = m_SelectedNode->GetData() != nullptr + ? m_SelectedNode->GetData()->GetNameOfClass() + : ""; - m_Model->SetPropertyList(propertyList, selectionClassName); - m_Delegate->SetPropertyList(propertyList); + m_SelectionClassName = selectionClassName.toStdString(); - OnPropertyNameChanged(itk::ModifiedEvent()); + if (m_Renderer == nullptr && m_Controls.propertyListComboBox->currentText() == "Base data") + { + propertyList = m_SelectedNode->GetData() != nullptr + ? m_SelectedNode->GetData()->GetPropertyList() + : nullptr; + } + else + { + propertyList = m_SelectedNode->GetPropertyList(m_Renderer); + } - mitk::BaseProperty* nameProperty = m_SelectedNode->GetProperty("name"); + m_Model->SetPropertyList(propertyList, selectionClassName); + m_Delegate->SetPropertyList(propertyList); - if (nameProperty != nullptr) - { - itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); - command->SetCallbackFunction(this, &QmitkPropertyTreeView::OnPropertyNameChanged); - m_PropertyNameChangedTag = nameProperty->AddObserver(itk::ModifiedEvent(), command); - } + OnPropertyNameChanged(); - m_Controls.newButton->setEnabled(true); + mitk::BaseProperty* nameProperty = m_SelectedNode->GetProperty("name"); + if (nameProperty != nullptr) + { + auto command = itk::SimpleMemberCommand::New(); + command->SetCallbackFunction(this, &QmitkPropertyTreeView::OnPropertyNameChanged); + m_PropertyNameChangedTag = nameProperty->AddObserver(itk::ModifiedEvent(), command); } + m_Controls.newButton->setEnabled(true); + if (!m_ProxyModel->filterRegExp().isEmpty()) + { m_Controls.treeView->expandAll(); + } } -void QmitkPropertyTreeView::SetFocus() +void QmitkPropertyTreeView::HideAllIcons() { - m_Controls.filterLineEdit->setFocus(); + m_Controls.tagLabel->hide(); + m_Controls.tagsLabel->hide(); + m_Controls.saveLabel->hide(); } -void QmitkPropertyTreeView::RenderWindowPartActivated(mitk::IRenderWindowPart* /*renderWindowPart*/) +void QmitkPropertyTreeView::OnCurrentRowChanged(const QModelIndex& current, const QModelIndex&) { - if (m_Controls.propertyListComboBox->count() == 2) + if (m_PropertyDescriptions != nullptr && current.isValid()) { - QHash renderWindows = this->GetRenderWindowPart()->GetQmitkRenderWindows(); + QString name = this->GetPropertyNameOrAlias(current); - Q_FOREACH(QString renderWindow, renderWindows.keys()) + if (!name.isEmpty()) { - m_Controls.propertyListComboBox->insertItem(m_Controls.propertyListComboBox->count() - 1, QString("Data node: ") + renderWindow); + QString alias; + bool isTrueName = true; + + if (m_PropertyAliases != nullptr) + { + std::string trueName = m_PropertyAliases->GetPropertyName(name.toStdString()); + + if (trueName.empty() && !m_SelectionClassName.empty()) + trueName = m_PropertyAliases->GetPropertyName(name.toStdString(), m_SelectionClassName); + + if (!trueName.empty()) + { + alias = name; + name = QString::fromStdString(trueName); + isTrueName = false; + } + } + + QString description = QString::fromStdString(m_PropertyDescriptions->GetDescription(name.toStdString())); + std::vector aliases; + + if (!isTrueName && m_PropertyAliases != nullptr) + { + aliases = m_PropertyAliases->GetAliases(name.toStdString(), m_SelectionClassName); + + if (aliases.empty() && !m_SelectionClassName.empty()) + aliases = m_PropertyAliases->GetAliases(name.toStdString()); + } + + bool isPersistent = false; + + if (m_PropertyPersistence != nullptr) + isPersistent = m_PropertyPersistence->HasInfo(name.toStdString()); + + if (!description.isEmpty() || !aliases.empty() || isPersistent) + { + QString customizedDescription; + + if (m_ShowAliasesInDescription && !aliases.empty()) + { + customizedDescription = "

" + name + "

"; + + std::size_t numAliases = aliases.size(); + std::size_t lastAlias = numAliases - 1; + + for (std::size_t i = 0; i < numAliases; ++i) + { + customizedDescription += i != lastAlias + ? "
" + : "
"; + + customizedDescription += QString::fromStdString(aliases[i]) + "
"; + } + } + else + { + customizedDescription = "

" + name + "

"; + } + + if (!description.isEmpty()) + customizedDescription += "

" + description + "

"; + + m_Controls.tagsLabel->setVisible(!aliases.empty() && aliases.size() > 1); + m_Controls.tagLabel->setVisible(!aliases.empty() && aliases.size() == 1); + m_Controls.saveLabel->setVisible(isPersistent); + + m_Controls.descriptionLabel->setText(customizedDescription); + m_Controls.descriptionLabel->show(); + + return; + } } } -} -void QmitkPropertyTreeView::RenderWindowPartDeactivated(mitk::IRenderWindowPart*) -{ - if (m_Controls.propertyListComboBox->count() > 2) - { - m_Controls.propertyListComboBox->clear(); - m_Controls.propertyListComboBox->addItem("Data node: common"); - m_Controls.propertyListComboBox->addItem("Base data"); - } + m_Controls.descriptionLabel->hide(); + this->HideAllIcons(); } void QmitkPropertyTreeView::OnPropertyListChanged(int index) { if (index == -1) return; QString renderer = m_Controls.propertyListComboBox->itemText(index); if (renderer.startsWith("Data node: ")) renderer = QString::fromStdString(renderer.toStdString().substr(11)); m_Renderer = renderer != "common" && renderer != "Base data" ? this->GetRenderWindowPart()->GetQmitkRenderWindow(renderer)->GetRenderer() : nullptr; QList nodes; if (m_SelectedNode.IsNotNull()) nodes << m_SelectedNode; - berry::IWorkbenchPart::Pointer workbenchPart; - - this->OnSelectionChanged(workbenchPart, nodes); + this->OnCurrentSelectionChanged(nodes); } void QmitkPropertyTreeView::OnAddNewProperty() { std::unique_ptr dialog(m_Controls.propertyListComboBox->currentText() != "Base data" - ? new QmitkAddNewPropertyDialog(m_SelectedNode, m_Renderer, m_Parent) - : new QmitkAddNewPropertyDialog(m_SelectedNode->GetData())); + ? new QmitkAddNewPropertyDialog(m_SelectedNode, m_Renderer, m_Parent) + : new QmitkAddNewPropertyDialog(m_SelectedNode->GetData())); if (dialog->exec() == QDialog::Accepted) this->m_Model->Update(); } -void QmitkPropertyTreeView::HideAllIcons() +void QmitkPropertyTreeView::OnFilterTextChanged(const QString& filter) { - m_Controls.tagLabel->hide(); - m_Controls.tagsLabel->hide(); - m_Controls.saveLabel->hide(); + m_ProxyModel->setFilterWildcard(filter); + + if (filter.isEmpty()) + m_Controls.treeView->collapseAll(); + else + m_Controls.treeView->expandAll(); +} + +void QmitkPropertyTreeView::OnModelReset() +{ + m_Controls.descriptionLabel->hide(); + this->HideAllIcons(); } diff --git a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h index 4c5c23f6c1..609a2673be 100644 --- a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h +++ b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h @@ -1,84 +1,102 @@ /*============================================================================ 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 QmitkPropertyTreeView_h #define QmitkPropertyTreeView_h +#include + +// mitk core module #include + +// mitk gui common plugin #include + +// mitk gui qt common plugin #include -#include +#include "QmitkSelectionServiceConnector.h" class QmitkPropertyItemDelegate; class QmitkPropertyItemModel; class QmitkPropertyItemSortFilterProxyModel; namespace mitk { class IPropertyAliases; class IPropertyDescriptions; class IPropertyPersistence; } class QmitkPropertyTreeView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: + static const std::string VIEW_ID; berryObjectMacro(QmitkPropertyTreeView); QmitkPropertyTreeView(); ~QmitkPropertyTreeView() override; void SetFocus() override; void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; void RenderWindowPartDeactivated(mitk::IRenderWindowPart*) override; protected: + void CreateQtPartControl(QWidget* parent) override; private: - QString GetPropertyNameOrAlias(const QModelIndex& index); + void OnPreferencesChanged(const berry::IBerryPreferences* preferences) override; - void OnPropertyNameChanged(const itk::EventObject& event); - void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + + void SetAsSelectionListener(bool checked); + + QString GetPropertyNameOrAlias(const QModelIndex& index); + + void OnPropertyNameChanged(); + void OnCurrentSelectionChanged(QList nodes); void HideAllIcons(); -private slots: +private Q_SLOTS: + void OnCurrentRowChanged(const QModelIndex& current, const QModelIndex& previous); void OnPropertyListChanged(int index); void OnAddNewProperty(); void OnFilterTextChanged(const QString& filter); void OnModelReset(); private: + QWidget* m_Parent; unsigned long m_PropertyNameChangedTag; std::string m_SelectionClassName; mitk::IPropertyAliases* m_PropertyAliases; mitk::IPropertyDescriptions* m_PropertyDescriptions; mitk::IPropertyPersistence* m_PropertyPersistence; bool m_ShowAliasesInDescription; bool m_ShowPersistenceInDescription; bool m_DeveloperMode; Ui::QmitkPropertyTreeView m_Controls; QmitkPropertyItemSortFilterProxyModel* m_ProxyModel; QmitkPropertyItemModel* m_Model; QmitkPropertyItemDelegate* m_Delegate; mitk::DataNode::Pointer m_SelectedNode; mitk::BaseRenderer* m_Renderer; + + std::unique_ptr m_SelectionServiceConnector; }; #endif diff --git a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.ui b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.ui index f572c39667..d1c7d1acce 100644 --- a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.ui +++ b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.ui @@ -1,208 +1,249 @@ QmitkPropertyTreeView 0 0 300 600 + + + + + 0 + 0 + + + + Selected data node + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + + + + + 0 0 Property List 0 0 Add new property :/Properties/new.png:/Properties/new.png 16 16 false Filter Qt::NoFocus ::item { border-right: 1px solid palette(midlight); padding-bottom: 1px; padding-top: 1px; } ::item:last { border-right: 0; } ::item:selected { background: palette(highlight); color: palette(highlighted-text); } Qt::ScrollBarAsNeeded true true 54 0 0 Qt::RichText true Qt::Horizontal 40 20 32 32 32 32 32 32 32 32 32 32 32 32 + + + QmitkSingleNodeSelectionWidget + QWidget +
QmitkSingleNodeSelectionWidget.h
+ 1 +
+