diff --git a/Modules/Qmitk/QmitkServiceListWidget.cpp b/Modules/Qmitk/QmitkServiceListWidget.cpp index ff2397e1ed..bd737d59f3 100644 --- a/Modules/Qmitk/QmitkServiceListWidget.cpp +++ b/Modules/Qmitk/QmitkServiceListWidget.cpp @@ -1,190 +1,183 @@ /*=================================================================== 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. ===================================================================*/ //#define _USE_MATH_DEFINES #include // STL HEaders #include //QT headers #include //microservices #include #include "mitkModuleContext.h" #include const std::string QmitkServiceListWidget::VIEW_ID = "org.mitk.views.QmitkServiceListWidget"; QmitkServiceListWidget::QmitkServiceListWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f) { m_Controls = NULL; CreateQtPartControl(this); } QmitkServiceListWidget::~QmitkServiceListWidget() { } //////////////////// INITIALIZATION ///////////////////// void QmitkServiceListWidget::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkServiceListWidgetControls; m_Controls->setupUi(parent); this->CreateConnections(); } + m_Context = mitk::GetModuleContext(); } void QmitkServiceListWidget::CreateConnections() { if ( m_Controls ) { connect( m_Controls->m_ServiceList, SIGNAL(currentItemChanged( QListWidgetItem *, QListWidgetItem *)), this, SLOT(OnDeviceSelectionChanged()) ); } } -void QmitkServiceListWidget::Initialize(std::string interfaceName, std::string namingProperty, std::string filter) +void QmitkServiceListWidget::InitPrivate(const std::string& namingProperty, const std::string& filter) { - m_Context = mitk::GetModuleContext(); if (filter.empty()) - m_Filter = "(" + mitk::ServiceConstants::OBJECTCLASS() + "=" + interfaceName + ")"; + m_Filter = "(" + mitk::ServiceConstants::OBJECTCLASS() + "=" + m_Interface + ")"; else m_Filter = filter; - m_Interface = interfaceName; m_NamingProperty = namingProperty; m_Context->RemoveServiceListener(this, &QmitkServiceListWidget::OnServiceEvent); m_Context->AddServiceListener(this, &QmitkServiceListWidget::OnServiceEvent, m_Filter); // Empty ListWidget this->m_ListContent.clear(); m_Controls->m_ServiceList->clear(); // get Services std::list services = this->GetAllRegisteredServices(); // Transfer them to the List for(std::list::iterator it = services.begin(); it != services.end(); ++it) AddServiceToList(*it); } - -///////////////////////// Getter & Setter ///////////////////////////////// - -//template -//T* QmitkServiceListWidget::GetSelectedService2() -//{ -// mitk::ServiceReference ref = GetServiceForListItem(this->m_Controls->m_ServiceList->currentItem()); -// return dynamic_cast m_Context->GetService(ref); -//} - ///////////// Methods & Slots Handling Direct Interaction ///////////////// void QmitkServiceListWidget::OnServiceSelectionChanged(){ mitk::ServiceReference ref = this->GetServiceForListItem(this->m_Controls->m_ServiceList->currentItem()); if (! ref) return; emit (ServiceSelected(ref)); } ///////////////// Methods & Slots Handling Logic ////////////////////////// void QmitkServiceListWidget::OnServiceEvent(const mitk::ServiceEvent event){ switch (event.GetType()) { case mitk::ServiceEvent::MODIFIED: emit(ServiceModified(event.GetServiceReference())); RemoveServiceFromList(event.GetServiceReference()); AddServiceToList(event.GetServiceReference()); break; case mitk::ServiceEvent::REGISTERED: emit(ServiceRegistered(event.GetServiceReference())); AddServiceToList(event.GetServiceReference()); break; case mitk::ServiceEvent::UNREGISTERING: emit(ServiceUnregistering(event.GetServiceReference())); RemoveServiceFromList(event.GetServiceReference()); break; + case mitk::ServiceEvent::MODIFIED_ENDMATCH: + emit(ServiceModiefiedEndMatch(event.GetServiceReference())); + RemoveServiceFromList(event.GetServiceReference()); + break; //default: // mitkThrow() << "ServiceListenerWidget recieved an unrecognized event. Please Update Implementation of QmitkServiceListWidget::OnServiceEvent()"; } } /////////////////////// HOUSEHOLDING CODE ///////////////////////////////// QListWidgetItem* QmitkServiceListWidget::AddServiceToList(mitk::ServiceReference serviceRef){ QListWidgetItem *newItem = new QListWidgetItem; std::string caption; //TODO allow more complex formatting if (m_NamingProperty.empty()) caption = m_Interface; else caption = serviceRef.GetProperty(m_NamingProperty).ToString(); newItem->setText(caption.c_str()); //Add new item to QListWidget m_Controls->m_ServiceList->addItem(newItem); // Construct link and add to internal List for reference QmitkServiceListWidget::ServiceListLink link; link.service = serviceRef; link.item = newItem; m_ListContent.push_back(link); return newItem; } bool QmitkServiceListWidget::RemoveServiceFromList(mitk::ServiceReference serviceRef){ for(std::vector::iterator it = m_ListContent.begin(); it != m_ListContent.end(); ++it){ if ( serviceRef == it->service ) { int row = m_Controls->m_ServiceList->row(it->item); QListWidgetItem* oldItem = m_Controls->m_ServiceList->takeItem(row); delete oldItem; this->m_ListContent.erase(it); return true; } } return false; } mitk::ServiceReference QmitkServiceListWidget::GetServiceForListItem(QListWidgetItem* item) { for(std::vector::iterator it = m_ListContent.begin(); it != m_ListContent.end(); ++it) if (item == it->item) return it->service; } std::list QmitkServiceListWidget::GetAllRegisteredServices(){ //Get Service References return m_Context->GetServiceReferences(m_Interface, m_Filter); } ////////// DEBUG /////////// mitk::ModuleContext* QmitkServiceListWidget::provideContext(){ return m_Context; } diff --git a/Modules/Qmitk/QmitkServiceListWidget.h b/Modules/Qmitk/QmitkServiceListWidget.h index bf89f9e5c7..08077b5615 100644 --- a/Modules/Qmitk/QmitkServiceListWidget.h +++ b/Modules/Qmitk/QmitkServiceListWidget.h @@ -1,171 +1,216 @@ /*=================================================================== 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 _QmitkServiceListWidget_H_INCLUDED #define _QmitkServiceListWidget_H_INCLUDED #include "QmitkExports.h" #include "ui_QmitkServiceListWidgetControls.h" #include //QT headers #include #include //Microservices #include "usServiceReference.h" #include "usModuleContext.h" #include "usServiceEvent.h" +#include "usServiceInterface.h" + + /** * @brief This widget provides abstraction for MicroServices. Place one in your Plugin and set it to a certain interface. * One can also specify a filter and / or a property to use for captioning of the services. It also offers functionality to be * informed of ServiceEvents and to return the sctual classes, so only a minimum of interaction with the MicroserviceInterface is required. +* To get started, just put it in your Plugin or Widget, call the Initialize Method and optionally connect it's signals. +* As QT limits templating possibilities, events only throw ServiceReferences. You can manually dereference them using TranslateServiceReference() * * @ingroup QMITK */ class QMITK_EXPORT QmitkServiceListWidget :public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT + private: + + mitk::ModuleContext* m_Context; + /** \brief a filter to further narrow down the list of results **/ + std::string m_Filter; + /** \brief The name of the ServiceInterface that this class should list **/ + std::string m_Interface; + /** \brief The name of the ServiceProperty that will be displayed in the List to represent the service **/ + std::string m_NamingProperty; + public: static const std::string VIEW_ID; QmitkServiceListWidget(QWidget* p = 0, Qt::WindowFlags f1 = 0); virtual ~QmitkServiceListWidget(); /* @brief This method is part of the widget an needs not to be called seperately. */ virtual void CreateQtPartControl(QWidget *parent); /* @brief This method is part of the widget an needs not to be called seperately. (Creation of the connections of main and control widget.)*/ virtual void CreateConnections(); + /* - * \brief Initializes the connection to the registry. The string filter is an LDAP parsable String, compare mitk::ModuleContext for examples on filtering. - * interfaceName is the name of the interface that is defined in the classes header file and that is used register it it with the MicroServices. NamingProperty - * is a property that will be used to caption the Items in the list. If no filter is supplied, all matching interfaces are shown. If no namingProperty is supplied, - * the interfaceName will be used to caption Items in the list. + * \brief Returns the currently selected Service as a ServiceReference. */ - void Initialize(std::string interfaceName, std::string namingProperty, std::string filter); + mitk::ServiceReference GetSelectedService(); /* * \brief Use this function to returns the currently selected service as a class directly. * Make sure you pass the appropriate type, or else this call will fail. - * Commented out until depency issues are resolved */ -// template -// T* GetSelectedService2(); + template + T* GetSelectedServiceAsClass() + { + mitk::ServiceReference ref = GetServiceForListItem( this->m_Controls->m_ServiceList->currentItem() ); + return dynamic_cast ( m_Context->GetService(ref) ); + } /* - * \brief Returns the currently selected Service as a ServiceReference. + * \brief Initializes the connection to the registry. The string filter is an LDAP parsable String, compare mitk::ModuleContext for examples on filtering. + * This. Pass class T to tell the widget which class it should filter for - only services of this class will be listed. + * NamingProperty is a property that will be used to caption the Items in the list. If no filter is supplied, all matching interfaces are shown. If no namingProperty is supplied, + * the interfaceName will be used to caption Items in the list. */ - mitk::ServiceReference GetSelectedService(); + template + void Initialize(const std::string& namingProperty, std::string& filter) + { + std::string interfaceName ( us_service_interface_iid() ); + m_Interface = interfaceName; + InitPrivate(namingProperty, filter); + } + + /* + * \brief Translates a serviceReference to a class of the given type. Use this to translate the signal's parameters. + * To adhere to the MicroService contract, only ServiceReferences stemming from the same widget should be this method. + */ + template + T* TranslateReference(mitk::ServiceReference reference) + { + return dynamic_cast ( m_Context->GetService(reference) ); + } /* *\brief This Function listens to ServiceRegistry changes and updates the * list of services accordingly. The user of this widget does not need to call this method, * it is instead used to recieve events from the module registry. */ void OnServiceEvent(const mitk::ServiceEvent event); + /* + *\brief This is a legacy method that will be removed in the near future, do not use. + * Use the templated functions instead, as they provide a much cleaner API. + */ mitk::ModuleContext* provideContext(); signals: /* - *\brief Emitted when a new Service mathing the filter is being registered. + *\brief Emitted when a new Service matching the filter is being registered. Be careful if you use a filter: + * If a device does not match the filter when registering, but modifies it's properties later to match the filter, + * then the first signal you will see this device in will be ServiceModified. */ void ServiceRegistered(mitk::ServiceReference); /* *\brief Emitted directly before a Service matching the filter is being unregistered. */ void ServiceUnregistering(mitk::ServiceReference); /* - *\brief Emitted when a Service matching the filter changes it's properties. + *\brief Emitted when a Service matching the filter changes it's properties, or when a service that formerly not matched the filter + * changed it's properties and now matches the filter. */ void ServiceModified(mitk::ServiceReference); + /* + *\brief Emitted when a Service matching the filter changes it's properties, + * and the new properties make it fall trough the filter. This effectively means that + * the widget will not track the service anymore. Usually, the Service should still be useable though + */ + void ServiceModiefiedEndMatch(mitk::ServiceReference); /* *\brief Emitted the user selects a Service from the list */ void ServiceSelected(mitk::ServiceReference); public slots: protected slots: /* \brief Called, when the selection in the list of Services changes */ void OnServiceSelectionChanged(); protected: Ui::QmitkServiceListWidgetControls* m_Controls; ///< member holding the UI elements of this widget /* * \brief Internal structure used to link ServiceReferences to their QListWidgetItems */ struct ServiceListLink { mitk::ServiceReference service; QListWidgetItem* item; }; + /* + * \brief Finishes initialization after Initialize has been called. This function assumes that m_Interface is set correctly (Which Initialize does). + */ + void InitPrivate(const std::string& namingProperty, const std::string& filter); + /* * \brief Contains a list of currently active services and their entires in the list. This is wiped with every ServiceRegistryEvent. */ std::vector m_ListContent; /* * \brief Constructs a ListItem from the given service, displays it, and locally stores the service. */ QListWidgetItem* AddServiceToList(mitk::ServiceReference serviceRef); /* * \brief Removes the given service from the list and cleans up. Returns true if successful, false if service was not found. */ bool RemoveServiceFromList(mitk::ServiceReference serviceRef); /* * \brief Returns the serviceReference corresponding to the given ListEntry or null if none was found (which really shouldn't happen). */ mitk::ServiceReference GetServiceForListItem(QListWidgetItem* item); /* * \brief Returns a list of ServiceReferences matching the filter criteria by querying the service registry. */ std::list GetAllRegisteredServices(); - private: - mitk::ModuleContext* m_Context; - /** \brief a filter to further narrow down the list of results **/ - std::string m_Filter; - /** \brief The name of the ServiceInterface that this class should list **/ - std::string m_Interface; - /** \brief The name of the ServiceProperty that will be displayed in the List to represent the service **/ - std::string m_NamingProperty; }; #endif // _QmitkServiceListWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.cpp b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.cpp index fbc327f7cd..4a356dae68 100644 --- a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.cpp +++ b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.cpp @@ -1,120 +1,119 @@ /*=================================================================== 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. ===================================================================*/ // Blueberry #include #include //Mitk #include "mitkDataNode.h" // Qmitk #include "UltrasoundSupport.h" #include // Qt #include // Ultrasound #include "mitkUSDevice.h" const std::string UltrasoundSupport::VIEW_ID = "org.mitk.views.ultrasoundsupport"; void UltrasoundSupport::SetFocus() { m_Controls.m_AddDevice->setFocus(); } void UltrasoundSupport::CreateQtPartControl( QWidget *parent ) { m_Timer = new QTimer(this); // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi( parent ); connect( m_Controls.m_AddDevice, SIGNAL(clicked()), this, SLOT(OnClickedAddNewDevice()) ); // Change Widget Visibilities connect( m_Controls.m_AddDevice, SIGNAL(clicked()), this->m_Controls.m_NewVideoDeviceWidget, SLOT(CreateNewDevice()) ); // Init NewDeviceWidget connect( m_Controls.m_NewVideoDeviceWidget, SIGNAL(Finished()), this, SLOT(OnNewDeviceWidgetDone()) ); // After NewDeviceWidget finished editing connect( m_Controls.m_BtnView, SIGNAL(clicked()), this, SLOT(OnClickedViewDevice()) ); connect( m_Timer, SIGNAL(timeout()), this, SLOT(DisplayImage())); //connect (m_Controls.m_ActiveVideoDevices, SIGNAL()) // Initializations m_Controls.m_NewVideoDeviceWidget->setVisible(false); std::string filter = "(&(" + mitk::ServiceConstants::OBJECTCLASS() + "=" + "org.mitk.services.UltrasoundDevice)(IsActive=true))"; - m_Controls.m_ActiveVideoDevices->Initialize(filter); + m_Controls.m_ActiveVideoDevices->Initialize(mitk::USImageMetadata::PROP_DEV_MODEL ,filter); m_Node = mitk::DataNode::New(); m_Node->SetName("US Image Stream"); this->GetDataStorage()->Add(m_Node); } void UltrasoundSupport::OnClickedAddNewDevice() { m_Controls.m_NewVideoDeviceWidget->setVisible(true); m_Controls.m_DeviceManagerWidget->setVisible(false); m_Controls.m_AddDevice->setVisible(false); m_Controls.m_Headline->setText("Add New Device:"); } void UltrasoundSupport::DisplayImage() { //QList nodes = this->GetDataManagerSelection(); // if (nodes.empty()) return; m_Device->UpdateOutputData(0); mitk::USImage::Pointer image = m_Device->GetOutput(); m_Node->SetData(image); // m_Image->Update(); this->RequestRenderWindowUpdate(); } void UltrasoundSupport::OnClickedViewDevice() { // We use the activity state of the timer to determine whether we are currently viewing images if ( ! m_Timer->isActive() ) // Activate Imaging { - m_Device = m_Controls.m_ActiveVideoDevices->GetSelectedDevice(); - // if (m_Node) m_Node->ReleaseData(); + m_Device = m_Controls.m_ActiveVideoDevices->GetSelectedServiceAsClass(); if (m_Device.IsNull()){ m_Timer->stop(); return; } m_Device->UpdateOutputData(0); m_Image = m_Device->GetOutput(0); m_Node->SetData(m_Device->GetOutput(0)); int interval = (1000 / m_Controls.m_FrameRate->value()); m_Timer->setInterval(interval); m_Timer->start(); m_Controls.m_BtnView->setText("Stop Viewing"); } else { //deactivate Imaging m_Controls.m_BtnView->setText("Start Viewing"); m_Timer->stop(); m_Node->ReleaseData(); this->RequestRenderWindowUpdate(); } } void UltrasoundSupport::OnNewDeviceWidgetDone() { m_Controls.m_NewVideoDeviceWidget->setVisible(false); m_Controls.m_DeviceManagerWidget->setVisible(true); m_Controls.m_AddDevice->setVisible(true); m_Controls.m_Headline->setText("Connected Devices:"); } \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupportControls.ui b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupportControls.ui index ae8c41b15f..463b82d22d 100644 --- a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupportControls.ui +++ b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupportControls.ui @@ -1,186 +1,186 @@ UltrasoundSupportControls 0 0 467 461 0 0 QmitkTemplate - 0 + 1 Device Management 12 75 true Connected Devices: New Device Qt::Vertical 20 40 US Imaging 12 75 true Active Ultrasound Devices: - + 0 0 Start Viewing 75 true Framerate: 1 50 30 (Restart viewing to make changes effective) Qt::Vertical 20 40 QmitkUSDeviceManagerWidget QWidget
QmitkUSDeviceManagerWidget.h
1
QmitkUSNewVideoDeviceWidget QWidget
QmitkUSNewVideoDeviceWidget.h
1
- QmitkUSDeviceListWidget + QmitkServiceListWidget QWidget -
QmitkUSDeviceListWidget.h
+
QmitkServiceListWidget.h
1