diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.viewnavigator/manifest_headers.cmake index 5fcab65742..b2b03c1ba2 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.viewnavigator/manifest_headers.cmake @@ -1,5 +1,9 @@ set(Plugin-Name "View Navigator") set(Plugin-Version "0.1") set(Plugin-Vendor "German Cancer Research Center (DKFZ)") set(Plugin-ContactAddress "") -set(Require-Plugin org.mitk.gui.qt.common) + +set(Require-Plugin + org.mitk.gui.qt.application + org.mitk.gui.qt.common +) diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.cpp b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.cpp index 4b47385e14..a5e9a5d6b2 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.cpp +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.cpp @@ -1,47 +1,59 @@ /*============================================================================ 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 "QmitkCategoryItem.h" #include "QmitkViewItem.h" #include QmitkCategoryItem::QmitkCategoryItem(const QString& category) : QStandardItem(category) { auto font = this->font(); font.setPointSizeF(font.pointSizeF() * 1.25); this->setFont(font); + + this->SetVisible(true); } QmitkCategoryItem::~QmitkCategoryItem() { } bool QmitkCategoryItem::HasMatch(const QRegularExpression& re) const { if (!this->hasChildren()) return false; const int rowCount = this->rowCount(); for (int row = 0; row < rowCount; ++row) { if (const auto* viewItem = dynamic_cast(this->child(row)); viewItem != nullptr) { if (viewItem->Match(re)) return true; } } return false; } + +bool QmitkCategoryItem::GetVisible() const +{ + return this->data().toBool(); +} + +void QmitkCategoryItem::SetVisible(bool visible) +{ + this->setData(visible); +} diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.h b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.h index a1765b0491..b872d74701 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.h +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkCategoryItem.h @@ -1,32 +1,40 @@ /*============================================================================ 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 QmitkCategoryItem_h #define QmitkCategoryItem_h #include #include class QmitkCategoryItem : public QStandardItem { public: explicit QmitkCategoryItem(const QString& category); ~QmitkCategoryItem() override; /** \brief Check if any view item child of this category item matches the given regular expression. * * \sa QmitkViewItem::Match() */ bool HasMatch(const QRegularExpression& re) const; + + /** \brief Get visibility of this item including its children. + */ + bool GetVisible() const; + + /** \brief Enable or disable visibility of this item including its children. + */ + void SetVisible(bool visible); }; #endif diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.cpp b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.cpp index 8250f4af2e..0eb0ae1219 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.cpp +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.cpp @@ -1,142 +1,165 @@ /*============================================================================ 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 "QmitkViewNavigatorView.h" +#include "QmitkCategoryItem.h" #include "QmitkViewItem.h" #include "QmitkViewModel.h" #include "QmitkViewProxyModel.h" +#include + +#include +#include +#include + #include #include QmitkViewNavigatorView::QmitkViewNavigatorView() : m_Ui(new Ui::QmitkViewNavigatorView), m_Model(nullptr), m_ProxyModel(nullptr) { } QmitkViewNavigatorView::~QmitkViewNavigatorView() { this->GetPartService()->RemovePartListener(this); } void QmitkViewNavigatorView::CreateQtPartControl(QWidget* parent) { m_Ui->setupUi(parent); m_Model = new QmitkViewModel(parent); m_ProxyModel = new QmitkViewProxyModel(parent); m_ProxyModel->setSourceModel(m_Model); m_Ui->viewTreeView->setModel(m_ProxyModel); - m_Ui->viewTreeView->expandAll(); connect(m_Ui->filterLineEdit, &QLineEdit::textChanged, this, &QmitkViewNavigatorView::OnFilterTextChanged); connect(m_Ui->viewTreeView, &QTreeView::doubleClicked, this, &QmitkViewNavigatorView::OnItemDoubleClicked); this->GetPartService()->AddPartListener(this); // The part service is not available earlier (e.g. in the constructor). } void QmitkViewNavigatorView::SetFocus() { m_Ui->filterLineEdit->setFocus(); } +mitk::IPreferences* QmitkViewNavigatorView::GetPreferences() const +{ + auto prefService = mitk::CoreServices::GetPreferencesService(); + return prefService->GetSystemPreferences()->Node(QmitkApplicationConstants::TOOL_BARS_PREFERENCES); +} + +void QmitkViewNavigatorView::OnPreferencesChanged(const mitk::IPreferences* prefs) +{ + for (const auto& category : prefs->Keys()) + { + if (auto* categoryItem = m_Model->GetCategoryItem(QString::fromStdString(category)); categoryItem != nullptr) + categoryItem->SetVisible(prefs->GetBool(category, true)); + } + + m_Ui->viewTreeView->expandAll(); +} + berry::IWorkbenchPage* QmitkViewNavigatorView::GetActivePage() const { if (auto site = this->GetSite(); site.IsNotNull()) { if (auto workbenchWindow = site->GetWorkbenchWindow(); workbenchWindow.IsNotNull()) return workbenchWindow->GetActivePage().GetPointer(); } return nullptr; } berry::IPartService* QmitkViewNavigatorView::GetPartService() const { if (auto site = this->GetSite(); site.IsNotNull()) { if (auto workbenchWindow = site->GetWorkbenchWindow(); workbenchWindow.IsNotNull()) return workbenchWindow->GetPartService(); } return nullptr; } void QmitkViewNavigatorView::OnFilterTextChanged(const QString& filter) { m_ProxyModel->setFilterFixedString(filter); m_Ui->viewTreeView->expandAll(); } void QmitkViewNavigatorView::OnItemDoubleClicked(const QModelIndex& index) { auto viewItem = dynamic_cast(m_Model->itemFromIndex(m_ProxyModel->mapToSource(index))); if (viewItem != nullptr) { if (auto activePage = this->GetActivePage(); activePage != nullptr) { try { activePage->ShowView(viewItem->data().toString()); } catch (const berry::PartInitException& e) { MITK_ERROR << e.what(); } } } } berry::IPartListener::Events::Types QmitkViewNavigatorView::GetPartEventTypes() const { return Events::OPENED | Events::CLOSED; } void QmitkViewNavigatorView::PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) { if (partRef->GetId() != "org.mitk.views.viewnavigator") { auto viewItem = m_Model->GetViewItemFromId(partRef->GetId()); if (viewItem != nullptr) viewItem->SetBoldFont(true); } else if (auto activePage = this->GetActivePage(); activePage != nullptr) { // The active page is not available during view initialization. Hence, we hook // into PartOpened() for the View Navigator itself, which is called shortly after, // to initialize the state of all views. for (const auto& view : activePage->GetViews()) { auto viewItem = m_Model->GetViewItemFromId(view->GetSite()->GetId()); if (viewItem != nullptr) viewItem->SetBoldFont(true); } } } void QmitkViewNavigatorView::PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) { auto viewItem = m_Model->GetViewItemFromId(partRef->GetId()); if (viewItem != nullptr) viewItem->SetBoldFont(false); } diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.h b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.h index 0707968b67..911440e1f7 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.h +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewNavigatorView.h @@ -1,60 +1,62 @@ /*============================================================================ 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 QmitkViewNavigatorView_h #define QmitkViewNavigatorView_h #include #include class QmitkViewModel; class QmitkViewProxyModel; namespace berry { struct IPartService; struct IWorkbenchPage; } namespace Ui { class QmitkViewNavigatorView; } class QmitkViewNavigatorView : public QmitkAbstractView, public berry::IPartListener { Q_OBJECT public: QmitkViewNavigatorView(); ~QmitkViewNavigatorView() override; private: void CreateQtPartControl(QWidget* parent) override; void SetFocus() override; + mitk::IPreferences* GetPreferences() const override; + void OnPreferencesChanged(const mitk::IPreferences* prefs) override; Events::Types GetPartEventTypes() const override; void PartOpened(const berry::IWorkbenchPartReference::Pointer& partRef) override; void PartClosed(const berry::IWorkbenchPartReference::Pointer& partRef) override; berry::IWorkbenchPage* GetActivePage() const; berry::IPartService* GetPartService() const; void OnFilterTextChanged(const QString& filter); void OnItemDoubleClicked(const QModelIndex& index); Ui::QmitkViewNavigatorView* m_Ui; QmitkViewModel* m_Model; QmitkViewProxyModel* m_ProxyModel; }; #endif diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewProxyModel.cpp b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewProxyModel.cpp index dd0d2e99f3..c34d600409 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewProxyModel.cpp +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/QmitkViewProxyModel.cpp @@ -1,67 +1,77 @@ /*============================================================================ 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 "QmitkViewProxyModel.h" #include "QmitkCategoryItem.h" #include "QmitkViewItem.h" #include QmitkViewProxyModel::QmitkViewProxyModel(QObject* parent) : QSortFilterProxyModel(parent) { this->setFilterCaseSensitivity(Qt::CaseInsensitive); this->setSortCaseSensitivity(Qt::CaseInsensitive); } QmitkViewProxyModel::~QmitkViewProxyModel() { } bool QmitkViewProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const { - // Primarily filter view items. Include their parent category items, though. + // Primarily filter view items. Include their parent category items, though. Consider only + // views of visible categories. auto model = dynamic_cast(this->sourceModel()); if (model == nullptr) return true; const auto re = this->filterRegularExpression(); auto index = model->index(sourceRow, 0, sourceParent); const auto* item = model->itemFromIndex(index); if (auto viewItem = dynamic_cast(item); viewItem != nullptr) { + if (auto categoryItem = dynamic_cast(viewItem->parent()); categoryItem != nullptr) + { + if (!categoryItem->GetVisible()) + return false; + } + return viewItem->Match(re); } else if (auto categoryItem = dynamic_cast(item); categoryItem != nullptr) { + if (!categoryItem->GetVisible()) + return false; + return categoryItem->HasMatch(re); } return true; } bool QmitkViewProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { // Sort by item text in ascending order. auto model = this->sourceModel(); auto leftText = model->data(left).toString(); auto rightText = model->data(right).toString(); auto caseSensitivity = this->sortCaseSensitivity(); return leftText.compare(rightText, caseSensitivity) > 0; } diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/src/internal/mitkPluginActivator.cpp b/Plugins/org.mitk.gui.qt.viewnavigator/src/internal/mitkPluginActivator.cpp index b22855c5e3..e0fd3cac1d 100644 --- a/Plugins/org.mitk.gui.qt.viewnavigator/src/internal/mitkPluginActivator.cpp +++ b/Plugins/org.mitk.gui.qt.viewnavigator/src/internal/mitkPluginActivator.cpp @@ -1,23 +1,28 @@ /*============================================================================ 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 "mitkPluginActivator.h" + #include +#include + +US_INITIALIZE_MODULE + void mitk::PluginActivator::start(ctkPluginContext* context) { BERRY_REGISTER_EXTENSION_CLASS(QmitkViewNavigatorView, context) } void mitk::PluginActivator::stop(ctkPluginContext*) { }