diff --git a/Modules/QtWidgets/files.cmake b/Modules/QtWidgets/files.cmake index fdd28ea7bd..81fe15edf6 100644 --- a/Modules/QtWidgets/files.cmake +++ b/Modules/QtWidgets/files.cmake @@ -1,86 +1,89 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES -QmitkApplicationCursor.cpp -QmitkDataStorageAbstractView.cpp -QmitkDataStorageComboBox.cpp -QmitkDataStorageListModel.cpp -QmitkDataStorageTableModel.cpp -QmitkDataStorageTreeModel.cpp -QmitkFileReaderOptionsDialog.cpp -QmitkFileReaderWriterOptionsWidget.cpp -QmitkFileWriterOptionsDialog.cpp -QmitkIOUtil.cpp -QmitkLevelWindowPresetDefinitionDialog.cpp -QmitkLevelWindowRangeChangeDialog.cpp -QmitkLevelWindowWidgetContextMenu.cpp -QmitkLevelWindowWidget.cpp -QmitkLineEditLevelWindowWidget.cpp -QmitkMemoryUsageIndicatorView.cpp -QmitkMimeTypes.cpp -QmitkNodeDescriptor.cpp -QmitkNodeDescriptorManager.cpp -QmitkRenderWindowMenu.cpp -QmitkProgressBar.cpp -QmitkPropertiesTableEditor.cpp -QmitkPropertiesTableModel.cpp -QmitkPropertyDelegate.cpp -QmitkRegisterClasses.cpp -QmitkRenderingManager.cpp -QmitkRenderingManagerFactory.cpp -QmitkRenderWindow.cpp -QmitkServiceListWidget.cpp -QmitkSliderLevelWindowWidget.cpp -QmitkStdMultiWidget.cpp -QmitkMouseModeSwitcher.cpp -QmitkDataStorageFilterProxyModel.cpp -QmitkDataStorageComboBoxWithSelectNone.cpp -QmitkPropertyItem.cpp -QmitkPropertyItemDelegate.cpp -QmitkPropertyItemModel.cpp + QmitkApplicationCursor.cpp + QmitkDataStorageAbstractView.cpp + QmitkDataStorageComboBox.cpp + QmitkDataStorageDefaultListModel.cpp + QmitkDataStorageDefaultView.cpp + QmitkDataStorageListModel.cpp + QmitkDataStorageTableModel.cpp + QmitkDataStorageTreeModel.cpp + QmitkFileReaderOptionsDialog.cpp + QmitkFileReaderWriterOptionsWidget.cpp + QmitkFileWriterOptionsDialog.cpp + QmitkIOUtil.cpp + QmitkLevelWindowPresetDefinitionDialog.cpp + QmitkLevelWindowRangeChangeDialog.cpp + QmitkLevelWindowWidgetContextMenu.cpp + QmitkLevelWindowWidget.cpp + QmitkLineEditLevelWindowWidget.cpp + QmitkMemoryUsageIndicatorView.cpp + QmitkMimeTypes.cpp + QmitkNodeDescriptor.cpp + QmitkNodeDescriptorManager.cpp + QmitkRenderWindowMenu.cpp + QmitkProgressBar.cpp + QmitkPropertiesTableEditor.cpp + QmitkPropertiesTableModel.cpp + QmitkPropertyDelegate.cpp + QmitkRegisterClasses.cpp + QmitkRenderingManager.cpp + QmitkRenderingManagerFactory.cpp + QmitkRenderWindow.cpp + QmitkServiceListWidget.cpp + QmitkSliderLevelWindowWidget.cpp + QmitkStdMultiWidget.cpp + QmitkMouseModeSwitcher.cpp + QmitkDataStorageFilterProxyModel.cpp + QmitkDataStorageComboBoxWithSelectNone.cpp + QmitkPropertyItem.cpp + QmitkPropertyItemDelegate.cpp + QmitkPropertyItemModel.cpp ) set(MOC_H_FILES include/QmitkIDataStorageViewModel.h include/QmitkDataStorageAbstractView.h include/QmitkDataStorageComboBox.h + include/QmitkDataStorageDefaultView.h include/QmitkDataStorageTableModel.h include/QmitkFileReaderOptionsDialog.h include/QmitkFileReaderWriterOptionsWidget.h include/QmitkFileWriterOptionsDialog.h include/QmitkLevelWindowPresetDefinitionDialog.h include/QmitkLevelWindowRangeChangeDialog.h include/QmitkLevelWindowWidgetContextMenu.h include/QmitkLevelWindowWidget.h include/QmitkLineEditLevelWindowWidget.h include/QmitkMemoryUsageIndicatorView.h include/QmitkNodeDescriptor.h include/QmitkNodeDescriptorManager.h include/QmitkRenderWindowMenu.h include/QmitkProgressBar.h include/QmitkPropertiesTableEditor.h include/QmitkPropertyDelegate.h include/QmitkRenderingManager.h include/QmitkRenderWindow.h include/QmitkServiceListWidget.h include/QmitkSliderLevelWindowWidget.h include/QmitkStdMultiWidget.h include/QmitkMouseModeSwitcher.h include/QmitkDataStorageComboBoxWithSelectNone.h include/QmitkPropertyItemDelegate.h include/QmitkPropertyItemModel.h ) set(UI_FILES src/QmitkFileReaderOptionsDialog.ui src/QmitkFileWriterOptionsDialog.ui src/QmitkLevelWindowPresetDefinition.ui src/QmitkLevelWindowWidget.ui src/QmitkLevelWindowRangeChange.ui src/QmitkMemoryUsageIndicator.ui src/QmitkServiceListWidgetControls.ui ) set(QRC_FILES resource/Qmitk.qrc ) diff --git a/Modules/QtWidgets/include/QmitkDataStorageDefaultListModel.h b/Modules/QtWidgets/include/QmitkDataStorageDefaultListModel.h new file mode 100644 index 0000000000..908e445e51 --- /dev/null +++ b/Modules/QtWidgets/include/QmitkDataStorageDefaultListModel.h @@ -0,0 +1,74 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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 QMITKDATASTORAGEDEFAULTLISTMODEL_H +#define QMITKDATASTORAGEDEFAULTLISTMODEL_H + +#include + +// qt widgets module +#include + +// qt +#include + +/** +* @brief The 'QmitkDataStorageDefaultListModel' is a basic list model, that implements the 'QmitkIDataStorageViewModel'. +* It provides functions to accept a data storage and a node predicate in order to customize the model data nodes. +* Furthermore it overrides the functions of 'QAbstractItemModel' to create a simple qt list model. +* This model can be used inside a concrete implementation of the 'QmitkDataStorageAbstractView' and therefore be +* connected to the data storage and the signals and slots of a concrete data storage viewer. +*/ +class MITKQTWIDGETS_EXPORT QmitkDataStorageDefaultListModel : public QmitkIDataStorageViewModel +{ + +public: + + QmitkDataStorageDefaultListModel(QObject *parent); + + // override from 'QmitkIDataStorageViewModel' + /* + * @brief See 'QmitkIDataStorageViewModel' + */ + void SetDataStorage(mitk::DataStorage* dataStorage) override; + /* + * @brief See 'QmitkIDataStorageViewModel' + */ + void SetNodePredicate(mitk::NodePredicateBase* nodePredicate) override; + + // override pure virtual from 'QAbstractItemModel' + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &child) const override; + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + // override for customization + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + +private: + + mitk::DataStorage::Pointer m_DataStorage; + std::vector m_DataNodes; + + mitk::NodePredicateBase::Pointer m_NodePredicate; + +}; + +#endif // QMITKDATASTORAGEDEFAULTLISTMODEL_H diff --git a/Modules/QtWidgets/include/QmitkDataStorageDefaultView.h b/Modules/QtWidgets/include/QmitkDataStorageDefaultView.h new file mode 100644 index 0000000000..268dd457d6 --- /dev/null +++ b/Modules/QtWidgets/include/QmitkDataStorageDefaultView.h @@ -0,0 +1,84 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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 QMITKDATASTORAGEDEFAULTVIEW_H +#define QMITKDATASTORAGEDEFAULTVIEW_H + +#include + +// qt widgets module +#include +#include + +// qt +#include + +/** +* @brief The QmitkDataStorageDefaultView serves as a standard view on the data storage. It contains a simple +* 'QListView' and a custom 'QmitkDataStorageDefaultListModel'. +* The model is basically a list model, that extends the 'QmitkIDataStorageViewModel' interface. +*/ +class MITKQTWIDGETS_EXPORT QmitkDataStorageDefaultView : public QmitkDataStorageAbstractView +{ + Q_OBJECT + +public: + + QmitkDataStorageDefaultView(QWidget* parent = nullptr); + QmitkDataStorageDefaultView(mitk::DataStorage* dataStorage, QWidget* parent = nullptr); + + ~QmitkDataStorageDefaultView() override; + +private: + + /* + * @brief Properly initializes the UI. + * + * Calls 'SetModel' and 'SetView' of the parent class to correctly connect its model and view. + */ + void SetupUI(); + + /* + * @brief Callback for the data storage node added event. + * + * WIP implementation: Reset the model by resetting the data storage of the model. + * + * @par node The data node that was added. + */ + void NodeAdded(const mitk::DataNode* node) override; + /* + * @brief Callback for the data storage node changed event. + * + * WIP implementation: Reset the model by resetting the data storage of the model. + * + * @par node The data node that was changed. + */ + void NodeChanged(const mitk::DataNode* node) override; + /* + * @brief Callback for the data storage node changed event. + * + * WIP implementation: Reset the model by resetting the data storage of the model. + * + * @par node The data node that was removed. + */ + void NodeRemoved(const mitk::DataNode* node) override; + + QmitkDataStorageDefaultListModel* m_DataStorageDefaultListModel; + QListView* m_DataStorageListView; + +}; + +#endif // QMITKDATASTORAGEDEFAULTVIEW_H diff --git a/Modules/QtWidgets/src/QmitkDataStorageDefaultListModel.cpp b/Modules/QtWidgets/src/QmitkDataStorageDefaultListModel.cpp new file mode 100644 index 0000000000..14dcf39e03 --- /dev/null +++ b/Modules/QtWidgets/src/QmitkDataStorageDefaultListModel.cpp @@ -0,0 +1,147 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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 + +// qt widgets module +#include "QmitkCustomVariants.h" +#include "QmitkEnums.h" + +QmitkDataStorageDefaultListModel::QmitkDataStorageDefaultListModel(QObject *parent) + : m_DataStorage(nullptr) + , m_NodePredicate(nullptr) +{ + // nothing here +} + +void QmitkDataStorageDefaultListModel::SetDataStorage(mitk::DataStorage* dataStorage) +{ + /* TEMPORARY + if (m_DataStorage == dataStorage) + { + return; + } + */ + m_DataStorage = dataStorage; + + mitk::DataStorage::SetOfObjects::ConstPointer dataNodes; + if (m_DataStorage != nullptr) + { + if (m_NodePredicate != nullptr) + { + dataNodes = m_DataStorage->GetSubset(m_NodePredicate); + } + else + { + dataNodes = m_DataStorage->GetAll(); + } + } + + // update the model, so that it will be filled with the nodes of the new data storage + beginResetModel(); + m_DataNodes.clear(); + + // add all (filtered) nodes to the vector of nodes + if (dataNodes != nullptr) + { + for (auto& node : *dataNodes) + { + m_DataNodes.push_back(node); + } + } + endResetModel(); +} + +void QmitkDataStorageDefaultListModel::SetNodePredicate(mitk::NodePredicateBase* nodePredicate) +{ + m_NodePredicate = nodePredicate; +} + +QModelIndex QmitkDataStorageDefaultListModel::index(int row, int column, const QModelIndex &parent) const +{ + bool hastIndex = hasIndex(row, column, parent); + if (hastIndex) + { + return createIndex(row, column); + } + + return QModelIndex(); +} + +QModelIndex QmitkDataStorageDefaultListModel::parent(const QModelIndex &child) const +{ + return QModelIndex(); +} + +int QmitkDataStorageDefaultListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + { + return 0; + } + + return m_DataNodes.size(); +} + +int QmitkDataStorageDefaultListModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + { + return 0; + } + + return 1; +} + +QVariant QmitkDataStorageDefaultListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + { + return QVariant(); + } + + if(index.row() < 0 || index.row() >= m_DataNodes.size()) + { + return QVariant(); + } + + mitk::DataNode::Pointer dataNode = m_DataNodes.at(index.row()); + if (Qt::DisplayRole == role) + { + return QVariant(QString::fromStdString(dataNode->GetName())); + } + else if (QmitkDataNodeRole == role) + { + return QVariant::fromValue(dataNode); + } + + return QVariant(); +} + +QVariant QmitkDataStorageDefaultListModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + return QVariant(tr("Nodes")); +} + +Qt::ItemFlags QmitkDataStorageDefaultListModel::flags(const QModelIndex &index) const +{ + if (index.isValid()) + { + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + } + + return Qt::NoItemFlags; +} diff --git a/Modules/QtWidgets/src/QmitkDataStorageDefaultView.cpp b/Modules/QtWidgets/src/QmitkDataStorageDefaultView.cpp new file mode 100644 index 0000000000..72de8cecea --- /dev/null +++ b/Modules/QtWidgets/src/QmitkDataStorageDefaultView.cpp @@ -0,0 +1,74 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical Image Computing. +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 + +// qt +#include + +QmitkDataStorageDefaultView::QmitkDataStorageDefaultView(QWidget* parent/* = nullptr*/) + : QmitkDataStorageAbstractView(parent) +{ + SetupUI(); +} + +QmitkDataStorageDefaultView::QmitkDataStorageDefaultView(mitk::DataStorage* dataStorage, QWidget* parent/* = nullptr*/) + : QmitkDataStorageAbstractView(dataStorage, parent) +{ + SetupUI(); +} + +QmitkDataStorageDefaultView::~QmitkDataStorageDefaultView() +{ + // nothing here +} + +void QmitkDataStorageDefaultView::SetupUI() +{ + m_DataStorageDefaultListModel = new QmitkDataStorageDefaultListModel(this); + m_DataStorageListView = new QListView(this); + + m_DataStorageListView->setSelectionMode(QAbstractItemView::ExtendedSelection); + m_DataStorageListView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_DataStorageListView->setAlternatingRowColors(true); + m_DataStorageListView->setModel(m_DataStorageDefaultListModel); + + SetModel(m_DataStorageDefaultListModel); + SetView(m_DataStorageListView); + + QHBoxLayout* layout = new QHBoxLayout(); + layout->addWidget(m_DataStorageListView); + + setLayout(layout); +} + +void QmitkDataStorageDefaultView::NodeAdded(const mitk::DataNode* node) +{ + // work around to force an update of the data nodes + m_Model->SetDataStorage(m_DataStorage); +} + +void QmitkDataStorageDefaultView::NodeChanged(const mitk::DataNode* node) +{ + // work around to force an update of the data nodes + m_Model->SetDataStorage(m_DataStorage); +} + +void QmitkDataStorageDefaultView::NodeRemoved(const mitk::DataNode* node) +{ + // work around to force an update of the data nodes + m_Model->SetDataStorage(m_DataStorage); +}