diff --git a/Modules/Core/include/mitkAnnotationService.h b/Modules/Core/include/mitkAnnotationService.h index ea81fbf602..d22266d15c 100644 --- a/Modules/Core/include/mitkAnnotationService.h +++ b/Modules/Core/include/mitkAnnotationService.h @@ -1,49 +1,50 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkAnnotationService_h #define mitkAnnotationService_h #include #include #include namespace mitk { class AbstractAnnotationRenderer; class MITKCORE_EXPORT AnnotationService { public: typedef std::vector> AnnotationRendererServices; AnnotationService(); ~AnnotationService(); static AbstractAnnotationRenderer *GetAnnotationRenderer(const std::string &arTypeID, const std::string &rendererID); static void RegisterAnnotationRenderer(AbstractAnnotationRenderer *annotationRenderer); + static std::vector GetAnnotationRenderer(const std::string &rendererID); + static void UpdateAnnotationRenderer(const std::string &rendererID); private: - static std::vector GetAnnotationRenderer(const std::string &rendererID); AnnotationService(const AnnotationService &); AnnotationService &operator=(const AnnotationService &); }; } #endif diff --git a/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.cpp b/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.cpp index 1933d9654c..90d9f4b49e 100644 --- a/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.cpp +++ b/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.cpp @@ -1,537 +1,542 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include // Blueberry #include #include #include // Qmitk #include "QmitkAddNewPropertyDialog.h" #include "QmitkOverlayManagerView.h" #include "QmitkPropertyItemDelegate.h" #include "QmitkPropertyItemModel.h" #include // Qt #include #include #include +#include "internal/org_mitk_gui_qt_overlaymanager_Activator.h" + #include "mitkAnnotationPlacer.h" +#include "mitkAnnotationService.h" #include "mitkGetPropertyService.h" #include "mitkOverlayManager.h" #include "mitkRenderingManager.h" #include #include #include #include #include #include #include #include #include const std::string QmitkOverlayManagerView::VIEW_ID = "org.mitk.views.overlaymanager"; QmitkOverlayManagerView::QmitkOverlayManagerView() - : m_Parent(nullptr), + : ctkServiceTracker(mitk::org_mitk_gui_qt_overlaymanager_Activator::GetContext()), + m_Parent(nullptr), m_PropertyNameChangedTag(0), m_OverlayManagerObserverTag(0), m_PropertyAliases(nullptr), m_PropertyDescriptions(nullptr), m_PropertyPersistence(nullptr), m_ProxyModel(nullptr), m_Model(nullptr), m_Delegate(nullptr), m_Renderer(nullptr), m_AddOverlayMenu(nullptr) { } QmitkOverlayManagerView::~QmitkOverlayManagerView() { } void QmitkOverlayManagerView::SetFocus() { } void QmitkOverlayManagerView::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.m_OverlayList->clear(); mitk::IRenderWindowPart *renderWindowPart = this->GetRenderWindowPart(); if (renderWindowPart != NULL) { QHash renderWindows = renderWindowPart->GetQmitkRenderWindows(); Q_FOREACH (QString renderWindow, renderWindows.keys()) { m_Controls.m_RendererCB->addItem(renderWindow); } } InitializeAddAnimationMenu(); m_ProxyModel = new QSortFilterProxyModel(m_Controls.m_PropertyTree); 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.m_PropertyTree); m_Controls.m_PropertyTree->setItemDelegateForColumn(1, m_Delegate); m_Controls.m_PropertyTree->setModel(m_ProxyModel); m_Controls.m_PropertyTree->setColumnWidth(0, 160); m_Controls.m_PropertyTree->sortByColumn(0, Qt::AscendingOrder); m_Controls.m_PropertyTree->setSelectionBehavior(QAbstractItemView::SelectRows); m_Controls.m_PropertyTree->setSelectionMode(QAbstractItemView::SingleSelection); m_Controls.m_PropertyTree->setEditTriggers(QAbstractItemView::SelectedClicked | QAbstractItemView::DoubleClicked); connect(m_Controls.m_RendererCB, SIGNAL(currentIndexChanged(int)), this, SLOT(OnPropertyListChanged(int))); connect(m_Controls.newButton, SIGNAL(clicked()), this, SLOT(OnAddNewProperty())); connect(m_Controls.m_PropertyTree->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(OnCurrentRowChanged(const QModelIndex &, const QModelIndex &))); connect(m_Controls.m_OverlayList, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(OnOverlaySelectionChanged(QListWidgetItem *, QListWidgetItem *))); connect(m_Controls.m_DeleteOverlay, SIGNAL(clicked()), this, SLOT(OnDelete())); connect(m_Controls.m_AddOverlay, SIGNAL(clicked()), this, SLOT(OnAddOverlay())); itk::MemberCommand::Pointer command = itk::MemberCommand::New(); command->SetCallbackFunction(this, &QmitkOverlayManagerView::OnFocusChanged); m_RenderWindowFocusObserverTag = mitk::RenderingManager::GetInstance()->AddObserver(mitk::FocusChangedEvent(), command); } void QmitkOverlayManagerView::OnFocusChanged(itk::Object * /*caller*/, const itk::EventObject &event) { const mitk::FocusChangedEvent *focusEvent = dynamic_cast(&event); if (focusEvent) { QHash renderWindows = this->GetRenderWindowPart()->GetQmitkRenderWindows(); m_Controls.m_RendererCB->clear(); Q_FOREACH (QString renderWindow, renderWindows.keys()) { m_Controls.m_RendererCB->addItem(renderWindow); if (renderWindows[renderWindow]->GetVtkRenderWindow() == mitk::RenderingManager::GetInstance()->GetFocusedRenderWindow()) { m_Controls.m_RendererCB->setCurrentText(renderWindow); } } } } QString QmitkOverlayManagerView::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 QmitkOverlayManagerView::OnCurrentRowChanged(const QModelIndex ¤t, 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; // QString persistenceKey; if (m_PropertyPersistence != nullptr) { isPersistent = m_PropertyPersistence->HasInfo(name.toStdString()); /*if (isPersistent) { persistenceKey = QString::fromStdString(m_PropertyPersistence->GetInfo(name.toStdString())->GetKey()); if (persistenceKey.isEmpty()) persistenceKey = name; }*/ } if (!description.isEmpty() || !aliases.empty() || isPersistent) { QString customizedDescription; if (!description.isEmpty()) customizedDescription += "

" + description + "

"; if (!aliases.empty() || isPersistent) { customizedDescription += "
"; if (!aliases.empty()) { customizedDescription += aliases.size() > 1 ? "" : ""; } if (isPersistent) customizedDescription += ""; customizedDescription += "
"; } return; } } } } void QmitkOverlayManagerView::OnPropertyNameChanged(const itk::EventObject &) { mitk::PropertyList *propertyList = m_Model->GetPropertyList(); if (propertyList != NULL) { mitk::BaseProperty *nameProperty = propertyList->GetProperty("name"); if (nameProperty != NULL) { QString partName = "Properties ("; partName.append(QString::fromStdString(nameProperty->GetValueAsString())).append(')'); this->SetPartName(partName); } } } void QmitkOverlayManagerView::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList &nodes) { } void QmitkOverlayManagerView::InitializeAddAnimationMenu() { m_AddOverlayMenu = new QMenu(m_Controls.m_AddOverlay); m_AddOverlayMenu->addAction("TextOverlay2D"); m_AddOverlayMenu->addAction("TextOverlay3D"); m_AddOverlayMenu->addAction("LabelOverlay"); m_AddOverlayMenu->addAction("ColorBarOverlay"); m_AddOverlayMenu->addAction("ScaleLegendOverlay"); m_AddOverlayMenu->addAction("LogoOverlay"); } void QmitkOverlayManagerView::OnOverlayAdded(itk::Object *, const itk::EventObject &event) { const mitk::OverlayAddEvent *addEvent = dynamic_cast(&event); if (addEvent) { OnActivateOverlayList(); } } void QmitkOverlayManagerView::Activated() { } void QmitkOverlayManagerView::Deactivated() { } void QmitkOverlayManagerView::Visible() { mitk::OverlayManager *om = mitk::OverlayManager::GetInstance(); if (om && m_OverlayManagerObserverTag == 0) { itk::MemberCommand::Pointer command = itk::MemberCommand::New(); command->SetCallbackFunction(this, &QmitkOverlayManagerView::OnOverlayAdded); m_OverlayManagerObserverTag = om->AddObserver(mitk::OverlayAddEvent(), command); } this->OnActivateOverlayList(); } void QmitkOverlayManagerView::Hidden() { } void QmitkOverlayManagerView::OnPropertyListChanged(int index) { if (index == -1) return; QString renderer = m_Controls.m_RendererCB->itemText(index); QmitkRenderWindow *renwin = this->GetRenderWindowPart()->GetQmitkRenderWindow(renderer); m_Renderer = renwin ? renwin->GetRenderer() : nullptr; this->OnOverlaySelectionChanged(m_Controls.m_OverlayList->currentItem(), nullptr); } void QmitkOverlayManagerView::OnAddNewProperty() { std::unique_ptr dialog( new QmitkAddNewPropertyDialog(m_SelectedOverlay, m_Renderer, m_Parent)); if (dialog->exec() == QDialog::Accepted) this->m_Model->Update(); } void QmitkOverlayManagerView::OnActivateOverlayList() { - typedef mitk::OverlayManager::OverlaySet OverlaySet; - mitk::OverlayManager *om = mitk::OverlayManager::GetInstance(); - m_Controls.m_OverlayList->clear(); - if (om) + if (!m_Renderer) + return; + std::vector arList = + mitk::AnnotationService::GetAnnotationRenderer(m_Renderer->GetName()); + // m_Controls.m_OverlayList->clear(); + for (auto ar : arList) { - OverlaySet oset = om->GetAllOverlays(); - for (auto overlay : oset) + for (auto overlay : ar->GetServices()) { QListWidgetItem *item = new QListWidgetItem(); - item->setData(Qt::UserRole, QVariant::fromValue(overlay.GetPointer())); + item->setData(Qt::UserRole, QVariant::fromValue(overlay)); QString text(overlay->GetName().c_str()); if (text.length() > 0) { text.append(" : "); } text.append(overlay->GetNameOfClass()); item->setText(text); m_Controls.m_OverlayList->addItem(item); } } } void QmitkOverlayManagerView::OnOverlaySelectionChanged(QListWidgetItem *current, QListWidgetItem *) { mitk::PropertyList *propertyList = m_Model->GetPropertyList(); if (propertyList != NULL) { mitk::BaseProperty *nameProperty = propertyList->GetProperty("name"); if (nameProperty != NULL) nameProperty->RemoveObserver(m_PropertyNameChangedTag); m_PropertyNameChangedTag = 0; } mitk::Overlay *overlay = nullptr; if (current) overlay = reinterpret_cast(current->data(Qt::UserRole).value()); if (!overlay) { m_SelectedOverlay = NULL; this->SetPartName("Overlay Properties"); m_Model->SetPropertyList(NULL); m_Delegate->SetPropertyList(NULL); m_Controls.newButton->setEnabled(false); } else { m_SelectedOverlay = overlay; QString selectionClassName = m_SelectedOverlay->GetNameOfClass(); m_SelectionClassName = selectionClassName.toStdString(); mitk::PropertyList::Pointer propertyList = overlay->GetPropertyList(); m_Model->SetPropertyList(propertyList, selectionClassName); m_Delegate->SetPropertyList(propertyList); OnPropertyNameChanged(itk::ModifiedEvent()); mitk::BaseProperty *nameProperty = m_SelectedOverlay->GetProperty("name"); if (nameProperty != NULL) { itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction(this, &QmitkOverlayManagerView::OnPropertyNameChanged); m_PropertyNameChangedTag = nameProperty->AddObserver(itk::ModifiedEvent(), command); } m_Controls.newButton->setEnabled(true); } if (!m_ProxyModel->filterRegExp().isEmpty()) m_Controls.m_PropertyTree->expandAll(); } void QmitkOverlayManagerView::OnDelete() { auto items = m_Controls.m_OverlayList->selectedItems(); if (items.count() < 1) return; mitk::Overlay *overlay = nullptr; QListWidgetItem *item = items[0]; if (item) overlay = reinterpret_cast(item->data(Qt::UserRole).value()); mitk::OverlayManager::GetInstance()->RemoveOverlay(overlay); } void QmitkOverlayManagerView::OnAddOverlay() { QAction *action = m_AddOverlayMenu->exec(QCursor::pos()); if (action != NULL) { const QString widgetKey = action->text(); if (widgetKey == "TextOverlay2D") OnAddTextOverlay2D(); else if (widgetKey == "TextOverlay3D") OnAddTextOverlay3D(); else if (widgetKey == "LabelOverlay") OnAddLabelOverlay(); else if (widgetKey == "ColorBarOverlay") OnAddColorBarOverlay(); else if (widgetKey == "ScaleLegendOverlay") OnAddScaleLegendOverlay(); else if (widgetKey == "LogoOverlay") OnAddLogoOverlay(); } } void QmitkOverlayManagerView::OnAddTextOverlay2D() { mitk::TextOverlay2D::Pointer to = mitk::TextOverlay2D::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::OnAddTextOverlay3D() { mitk::TextOverlay3D::Pointer to = mitk::TextOverlay3D::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::OnAddLabelOverlay() { mitk::LabelOverlay3D::Pointer to = mitk::LabelOverlay3D::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::OnAddColorBarOverlay() { mitk::ColorBarOverlay::Pointer to = mitk::ColorBarOverlay::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::OnAddScaleLegendOverlay() { mitk::ScaleLegendOverlay::Pointer to = mitk::ScaleLegendOverlay::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::OnAddLogoOverlay() { mitk::LogoOverlay::Pointer to = mitk::LogoOverlay::New(); mitk::BaseRenderer *renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow(m_Controls.m_RendererCB->currentText())->GetRenderer(); mitk::AnnotationPlacer::AddOverlay(to.GetPointer(), renderer); } void QmitkOverlayManagerView::RenderWindowPartActivated(mitk::IRenderWindowPart * /*renderWindowPart*/) { if (m_Controls.m_RendererCB->count() == 0) { QHash renderWindows = this->GetRenderWindowPart()->GetQmitkRenderWindows(); Q_FOREACH (QString renderWindow, renderWindows.keys()) { m_Controls.m_RendererCB->addItem(renderWindow); } } OnActivateOverlayList(); } void QmitkOverlayManagerView::RenderWindowPartDeactivated(mitk::IRenderWindowPart *) { if (m_Controls.m_RendererCB->count() > 0) { m_Controls.m_RendererCB->clear(); } m_Controls.m_OverlayList->clear(); } diff --git a/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.h b/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.h index a343b05c8d..606631eb5d 100644 --- a/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.h +++ b/Plugins/org.mitk.gui.qt.overlaymanager/src/internal/QmitkOverlayManagerView.h @@ -1,125 +1,129 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkOverlayManagerView_h #define QmitkOverlayManagerView_h #include +#include "ctkServiceTracker.h" #include "mitkILifecycleAwarePart.h" #include "mitkOverlay.h" #include "ui_QmitkOverlayManagerViewControls.h" #include #include class QmitkPropertyItemDelegate; class QmitkPropertyItemModel; class QSortFilterProxyModel; namespace mitk { class IPropertyAliases; class IPropertyDescriptions; class IPropertyPersistence; } /** \brief QmitkOverlayManagerView allows to view all overlays added to the mitk::OverlayManager. Properties of these overlays can be modified. \sa QmitkAbstractView \ingroup ${plugin_target}_internal */ class QmitkOverlayManagerView : public QmitkAbstractView, public mitk::IRenderWindowPartListener, - public mitk::ILifecycleAwarePart + public mitk::ILifecycleAwarePart, + public ctkServiceTracker { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkOverlayManagerView(); ~QmitkOverlayManagerView(); protected: virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; void RenderWindowPartActivated(mitk::IRenderWindowPart *renderWindowPart) override; void RenderWindowPartDeactivated(mitk::IRenderWindowPart *) override; Ui::QmitkOverlayManagerViewControls m_Controls; void OnFocusChanged(itk::Object *, const itk::EventObject &event); private slots: void OnCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous); void OnPropertyListChanged(int index); void OnAddNewProperty(); void OnActivateOverlayList(); void OnOverlaySelectionChanged(QListWidgetItem *current, QListWidgetItem *); void OnDelete(); void OnAddOverlay(); private: void OnAddTextOverlay2D(); void OnAddTextOverlay3D(); void OnAddLabelOverlay(); void OnAddColorBarOverlay(); void OnAddScaleLegendOverlay(); void OnAddLogoOverlay(); QString GetPropertyNameOrAlias(const QModelIndex &index); void OnPropertyNameChanged(const itk::EventObject &event); void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList &nodes) override; void InitializeAddAnimationMenu(); void OnOverlayAdded(itk::Object * /*caller*/, const itk::EventObject &event); /** \see berry::IPartListener::PartActivated */ virtual void Activated(); /** \see berry::IPartListener::PartDeactivated */ virtual void Deactivated(); /** \see berry::IPartListener::PartVisible */ virtual void Visible(); /** \see berry::IPartListener::PartHidden */ virtual void Hidden(); + mitk::Overlay *AddingService(const ctkServiceReference &) { OnActivateOverlayList(); } + void RemovedService(const ctkServiceReference &, mitk::Overlay *) { OnActivateOverlayList(); } QWidget *m_Parent; unsigned long m_PropertyNameChangedTag; unsigned long m_OverlayManagerObserverTag; std::string m_SelectionClassName; mitk::IPropertyAliases *m_PropertyAliases; mitk::IPropertyDescriptions *m_PropertyDescriptions; mitk::IPropertyPersistence *m_PropertyPersistence; QSortFilterProxyModel *m_ProxyModel; QmitkPropertyItemModel *m_Model; QmitkPropertyItemDelegate *m_Delegate; mitk::Overlay::Pointer m_SelectedOverlay; mitk::BaseRenderer *m_Renderer; QMenu *m_AddOverlayMenu; unsigned long m_RenderWindowFocusObserverTag; }; #endif // QmitkOverlayManagerView_h