diff --git a/Modules/QtWidgets/files.cmake b/Modules/QtWidgets/files.cmake index 72319039b4..fc924b63fb 100644 --- a/Modules/QtWidgets/files.cmake +++ b/Modules/QtWidgets/files.cmake @@ -1,86 +1,87 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES QmitkApplicationCursor.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 QmitkColoredNodeDescriptor.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 +QmitkStyleManager.cpp ) set(MOC_H_FILES include/QmitkDataStorageComboBox.h include/QmitkDataStorageTableModel.h include/QmitkDataStorageTreeModel.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/QmitkColoredNodeDescriptor.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/QmitkStyleManager.h b/Modules/QtWidgets/include/QmitkStyleManager.h new file mode 100644 index 0000000000..29f07fc978 --- /dev/null +++ b/Modules/QtWidgets/include/QmitkStyleManager.h @@ -0,0 +1,36 @@ +/*=================================================================== + +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 QmitkStyleManager_h +#define QmitkStyleManager_h + +#include + +#include +#include +#include + +class MITKQTWIDGETS_EXPORT QmitkStyleManager +{ +public: + static QIcon ThemeIcon(const QByteArray &originalSVG); + static QIcon ThemeIcon(const QString &resourcePath); + + QmitkStyleManager() = delete; + ~QmitkStyleManager() = delete; +}; + +#endif diff --git a/Modules/QtWidgets/src/QmitkStyleManager.cpp b/Modules/QtWidgets/src/QmitkStyleManager.cpp new file mode 100644 index 0000000000..1497073b16 --- /dev/null +++ b/Modules/QtWidgets/src/QmitkStyleManager.cpp @@ -0,0 +1,73 @@ +/*=================================================================== + +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 + +#include + +#include +#include +#include +#include +#include + +namespace +{ + QString ParseColor(const QString &subject, const QString &pattern, const QString &fallback) + { + QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption); + auto match = re.match(subject); + + return match.hasMatch() + ? match.captured(1) + : fallback; + } +} + +QIcon QmitkStyleManager::ThemeIcon(const QByteArray &originalSVG) +{ + auto styleSheet = qApp->styleSheet(); + + if (styleSheet.isEmpty()) + return QPixmap::fromImage(QImage::fromData(originalSVG)); + + auto iconColor = ParseColor(styleSheet, + QStringLiteral("iconColor\\s*[=:]\\s*(#[0-9a-f]{6})"), + QStringLiteral("#000000")); + + auto iconAccentColor = ParseColor(styleSheet, + QStringLiteral("iconAccentColor\\s*[=:]\\s*(#[0-9a-f]{6})"), + QStringLiteral("#ffffff")); + + auto themedSVG = QString(originalSVG).replace(QStringLiteral("#00ff00"), iconColor, Qt::CaseInsensitive); + themedSVG = themedSVG.replace(QStringLiteral("#ff00ff"), iconAccentColor, Qt::CaseInsensitive); + + return QPixmap::fromImage(QImage::fromData(themedSVG.toLatin1())); +} + +QIcon QmitkStyleManager::ThemeIcon(const QString &resourcePath) +{ + QFile resourceFile(resourcePath); + + if (resourceFile.open(QIODevice::ReadOnly)) + { + auto originalSVG = resourceFile.readAll(); + return ThemeIcon(originalSVG); + } + + MITK_WARN << "Could not read " << resourcePath.toStdString(); + return QIcon(); +} \ No newline at end of file diff --git a/Modules/QtWidgetsExt/resource/QtWidgetsExt.qrc b/Modules/QtWidgetsExt/resource/QtWidgetsExt.qrc index fd4ad928b4..2e92201b32 100644 --- a/Modules/QtWidgetsExt/resource/QtWidgetsExt.qrc +++ b/Modules/QtWidgetsExt/resource/QtWidgetsExt.qrc @@ -1,41 +1,41 @@ btnAddPointSet.png - btnClear.xpm + eraser.svg btnCube.xpm btnCylinder.xpm - btnDown.xpm + arrow-down.svg btnEllipsoid.xpm - btnLoad.xpm + folder-open.svg btnMoveDown.png btnMoveUp.png btnPyramid.xpm btnRemovePoint.png - btnSave.xpm + save.svg btnSetPoints.png - btnSetPoints.xpm - btnSetPointsManually.xpm + plus.svg + plus-xyz.svg btnSetSeedPoint.xpm btnSwapSets.png - btnUp.xpm + arrow-up.svg cross.png icon_seedpoint.png defaultWatermarkSmall.png logo_mint-medical.png ModuleView.png QmitkStandardViewsDialogBar.xpm PlanarAngle_48.png PlanarBezierCurve_48.png PlanarCircle_48.png PlanarDoubleEllipse_48.png PlanarEllipse_48.png PlanarFourPointAngle_48.png PlanarLine_48.png PlanarPath_48.png PlanarPolygon_48.png PlanarRectangle_48.png PlanarSubdivisionPolygon_48.png play.xpm stop.xpm diff --git a/Modules/QtWidgetsExt/resource/arrow-down.svg b/Modules/QtWidgetsExt/resource/arrow-down.svg new file mode 100644 index 0000000000..6ff3a3a53c --- /dev/null +++ b/Modules/QtWidgetsExt/resource/arrow-down.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/resource/arrow-up.svg b/Modules/QtWidgetsExt/resource/arrow-up.svg new file mode 100644 index 0000000000..322b7932b8 --- /dev/null +++ b/Modules/QtWidgetsExt/resource/arrow-up.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/resource/btnClear.xpm b/Modules/QtWidgetsExt/resource/btnClear.xpm deleted file mode 100644 index 45a4deb47a..0000000000 --- a/Modules/QtWidgetsExt/resource/btnClear.xpm +++ /dev/null @@ -1,46 +0,0 @@ -/* XPM */ -static const char * btnClear_xpm[] = { -"13 9 34 1", -" c None", -". c #090909", -"+ c #080808", -"@ c #000000", -"# c #0D0D0D", -"$ c #ECECEC", -"% c #FFFFFF", -"& c #FCFCFC", -"* c #E6E6E6", -"= c #0B0B0B", -"- c #FBFBFB", -"; c #F5F5F5", -"> c #CDCDCD", -", c #FEFEFE", -"' c #FAFAFA", -") c #F4F4F4", -"! c #0C0C0C", -"~ c #CCCCCC", -"{ c #D8D8D8", -"] c #050505", -"^ c #F3F3F3", -"/ c #FDFDFD", -"( c #CBCBCB", -"_ c #010101", -": c #040404", -"< c #D4D4D4", -"[ c #D1D1D1", -"} c #C9C9C9", -"| c #EAEAEA", -"1 c #EEEEEE", -"2 c #F8F8F8", -"3 c #020202", -"4 c #0F0F0F", -"5 c #111111", -" .+@@#+@@", -" .$%%&*%=@", -" @-%;%%%@>@", -" @%,;%')!~{]", -" @^/%&''!>(@ ", -"@#_@:@:@<[@ ", -"@%%,%%&]}@ ", -"!|%/12%3@ ", -"@]@.45@@ "}; diff --git a/Modules/QtWidgetsExt/resource/btnDown.xpm b/Modules/QtWidgetsExt/resource/btnDown.xpm deleted file mode 100644 index 70bd78c1be..0000000000 --- a/Modules/QtWidgetsExt/resource/btnDown.xpm +++ /dev/null @@ -1,15 +0,0 @@ -/* XPM */ -static const char * btnDown_xpm[] = { -"9 10 2 1", -" c None", -". c #000000", -" . ", -" . ", -" . ", -" . ", -" . ", -". . .", -" . . . ", -" . . . ", -" ... ", -" . "}; diff --git a/Modules/QtWidgetsExt/resource/btnLoad.xpm b/Modules/QtWidgetsExt/resource/btnLoad.xpm deleted file mode 100644 index 4dcb28ab40..0000000000 --- a/Modules/QtWidgetsExt/resource/btnLoad.xpm +++ /dev/null @@ -1,18 +0,0 @@ -/* XPM */ -static const char * btnLoad_xpm[] = { -"15 12 3 1", -" c None", -". c #000000", -"+ c #FFFFFF", -" .... ", -" .++++. ", -".+++++...... ", -".+++++++++++. ", -".+++.......... ", -".++.++++++++++.", -".+.+++++++++++.", -".+.++++++++++. ", -"..+++++++++++. ", -".+++++++++++. ", -"..+++++++++. ", -" ........... "}; diff --git a/Modules/QtWidgetsExt/resource/btnSave.xpm b/Modules/QtWidgetsExt/resource/btnSave.xpm deleted file mode 100644 index 7af750e3df..0000000000 --- a/Modules/QtWidgetsExt/resource/btnSave.xpm +++ /dev/null @@ -1,20 +0,0 @@ -/* XPM */ -static const char * btnSave_xpm[] = { -"13 13 4 1", -" c None", -". c #000000", -"+ c #F2F2F2", -"@ c #FFFFFF", -".............", -".++.@@@..@.+.", -".++.@@@..@.+.", -".++.@@@..@.+.", -".++........+.", -".+++++++++++.", -".+++++++++++.", -".++.......++.", -".+.@@@@@@@.+.", -".+.@@@@@@@.+.", -".+.@@@@@@@.+.", -".+.@@@@@@@.+.", -"............."}; diff --git a/Modules/QtWidgetsExt/resource/btnSetPoints.xpm b/Modules/QtWidgetsExt/resource/btnSetPoints.xpm deleted file mode 100644 index da30057bf0..0000000000 --- a/Modules/QtWidgetsExt/resource/btnSetPoints.xpm +++ /dev/null @@ -1,14 +0,0 @@ -/* XPM */ -static const char * btnSetPoints_xpm[] = { -"9 9 2 1", -" c None", -". c #000000", -" . ", -" . ", -" . ", -" . ", -".........", -" . ", -" . ", -" . ", -" . "}; diff --git a/Modules/QtWidgetsExt/resource/btnSetPointsManually.xpm b/Modules/QtWidgetsExt/resource/btnSetPointsManually.xpm deleted file mode 100644 index c95e77c5e8..0000000000 --- a/Modules/QtWidgetsExt/resource/btnSetPointsManually.xpm +++ /dev/null @@ -1,25 +0,0 @@ -/* XPM */ -static char * btnSetPointsManually_xpm[] = { -"20 20 2 1", -" c None", -". c #000000", -" .. ", -" . ", -" .. ", -" . ", -" . ", -" ........... ", -" . ", -" . ", -" . ", -" . ", -" . ", -" ", -" ", -".. .. . . ......", -" .. .. .. .. ..", -" ... ... .. ", -" ... . .. ", -" .. .. . .. ", -".. .. . .. ", -". . . ......"}; diff --git a/Modules/QtWidgetsExt/resource/btnUp.xpm b/Modules/QtWidgetsExt/resource/btnUp.xpm deleted file mode 100644 index 34511a581b..0000000000 --- a/Modules/QtWidgetsExt/resource/btnUp.xpm +++ /dev/null @@ -1,15 +0,0 @@ -/* XPM */ -static const char * btnUp_xpm[] = { -"9 10 2 1", -" c None", -". c #000000", -" . ", -" ... ", -" . . . ", -" . . . ", -". . .", -" . ", -" . ", -" . ", -" . ", -" . "}; diff --git a/Modules/QtWidgetsExt/resource/eraser.svg b/Modules/QtWidgetsExt/resource/eraser.svg new file mode 100644 index 0000000000..725d88fed0 --- /dev/null +++ b/Modules/QtWidgetsExt/resource/eraser.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/resource/folder-open.svg b/Modules/QtWidgetsExt/resource/folder-open.svg new file mode 100644 index 0000000000..12990d0ae8 --- /dev/null +++ b/Modules/QtWidgetsExt/resource/folder-open.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/resource/plus-xyz.svg b/Modules/QtWidgetsExt/resource/plus-xyz.svg new file mode 100644 index 0000000000..303346fa4d --- /dev/null +++ b/Modules/QtWidgetsExt/resource/plus-xyz.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/Modules/QtWidgetsExt/resource/plus.svg b/Modules/QtWidgetsExt/resource/plus.svg new file mode 100644 index 0000000000..c180bc77f4 --- /dev/null +++ b/Modules/QtWidgetsExt/resource/plus.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/resource/save.svg b/Modules/QtWidgetsExt/resource/save.svg new file mode 100644 index 0000000000..e396a59486 --- /dev/null +++ b/Modules/QtWidgetsExt/resource/save.svg @@ -0,0 +1,2 @@ + + diff --git a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp index 7cdde12842..fa20956b6f 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp @@ -1,493 +1,487 @@ /*=================================================================== 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 "QmitkPointListWidget.h" #include "QmitkPointListView.h" #include "QmitkPointListModel.h" #include #include #include #include #include #include +#include #include #include QmitkPointListWidget::QmitkPointListWidget(QWidget *parent, int orientation) : QWidget(parent), m_PointListView(nullptr), m_PointSetNode(nullptr), m_Orientation(0), m_MovePointUpBtn(nullptr), m_MovePointDownBtn(nullptr), m_RemovePointBtn(nullptr), m_SavePointsBtn(nullptr), m_LoadPointsBtn(nullptr), m_ToggleAddPoint(nullptr), m_AddPoint(nullptr), m_TimeStepDisplay(nullptr), m_DataInteractor(nullptr), m_TimeStep(0), m_EditAllowed(true), m_NodeObserverTag(0) { m_PointListView = new QmitkPointListView(); if (orientation != 0) m_Orientation = orientation; SetupUi(); SetupConnections(); ObserveNewNode(nullptr); } QmitkPointListWidget::~QmitkPointListWidget() { m_DataInteractor = nullptr; if (m_PointSetNode && m_NodeObserverTag) { m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; } delete m_PointListView; } void QmitkPointListWidget::SetupConnections() { connect(this->m_LoadPointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnLoadPoints())); connect(this->m_SavePointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnSavePoints())); connect(this->m_MovePointUpBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointUp())); connect(this->m_MovePointDownBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointDown())); connect(this->m_RemovePointBtn, SIGNAL(clicked()), this, SLOT(RemoveSelectedPoint())); connect(this->m_ToggleAddPoint, SIGNAL(toggled(bool)), this, SLOT(OnBtnAddPoint(bool))); connect(this->m_AddPoint, SIGNAL(clicked()), this, SLOT(OnBtnAddPointManually())); connect(this->m_PointListView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(OnListDoubleClick())); connect(this->m_PointListView, SIGNAL(SignalPointSelectionChanged()), this, SLOT(OnPointSelectionChanged())); connect(this->m_PointListView, SIGNAL(SignalTimeStepChanged(int)), this, SLOT(OnTimeStepChanged(int))); } void QmitkPointListWidget::OnTimeStepChanged(int timeStep) { m_TimeStepLabel->setText(QString("%1").arg(timeStep)); } void QmitkPointListWidget::SetupUi() { // Setup the buttons m_ToggleAddPoint = new QPushButton(); m_ToggleAddPoint->setMaximumSize(25, 25); m_ToggleAddPoint->setCheckable(true); m_ToggleAddPoint->setToolTip("Toggle point editing (use SHIFT + Left Mouse Button to add Points)"); - QIcon iconAdd(":/QtWidgetsExt/btnSetPoints.xpm"); - m_ToggleAddPoint->setIcon(iconAdd); + m_ToggleAddPoint->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/plus.svg"))); m_AddPoint = new QPushButton(); m_AddPoint->setMaximumSize(25, 25); m_AddPoint->setToolTip("Manually add point"); - QIcon iconAddManually(":/QtWidgetsExt/btnSetPointsManually.xpm"); - m_AddPoint->setIcon(iconAddManually); + m_AddPoint->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/plus-xyz.svg"))); m_RemovePointBtn = new QPushButton(); m_RemovePointBtn->setMaximumSize(25, 25); - const QIcon iconDel(":/QtWidgetsExt/btnClear.xpm"); - m_RemovePointBtn->setIcon(iconDel); + m_RemovePointBtn->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/eraser.svg"))); m_RemovePointBtn->setToolTip("Erase one point from list (Hotkey: DEL)"); m_MovePointUpBtn = new QPushButton(); m_MovePointUpBtn->setMaximumSize(25, 25); - const QIcon iconUp(":/QtWidgetsExt/btnUp.xpm"); - m_MovePointUpBtn->setIcon(iconUp); + m_MovePointUpBtn->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/arrow-up.svg"))); m_MovePointUpBtn->setToolTip("Swap selected point upwards (Hotkey: F2)"); m_MovePointDownBtn = new QPushButton(); m_MovePointDownBtn->setMaximumSize(25, 25); - const QIcon iconDown(":/QtWidgetsExt/btnDown.xpm"); - m_MovePointDownBtn->setIcon(iconDown); + m_MovePointDownBtn->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/arrow-down.svg"))); m_MovePointDownBtn->setToolTip("Swap selected point downwards (Hotkey: F3)"); m_SavePointsBtn = new QPushButton(); m_SavePointsBtn->setMaximumSize(25, 25); - QIcon iconSave(":/QtWidgetsExt/btnSave.xpm"); - m_SavePointsBtn->setIcon(iconSave); + m_SavePointsBtn->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/save.svg"))); m_SavePointsBtn->setToolTip("Save points to file"); m_LoadPointsBtn = new QPushButton(); m_LoadPointsBtn->setMaximumSize(25, 25); - QIcon iconLoad(":/QtWidgetsExt/btnLoad.xpm"); - m_LoadPointsBtn->setIcon(iconLoad); + m_LoadPointsBtn->setIcon(QmitkStyleManager::ThemeIcon(QStringLiteral(":/QtWidgetsExt/folder-open.svg"))); m_LoadPointsBtn->setToolTip("Load list of points from file (REPLACES current content)"); int i; QBoxLayout *lay1; QBoxLayout *lay2; QBoxLayout *lay3; switch (m_Orientation) { case 0: lay1 = new QVBoxLayout(this); lay2 = new QHBoxLayout(); i = 0; break; case 1: lay1 = new QHBoxLayout(this); lay2 = new QVBoxLayout(); i = -1; break; case 2: lay1 = new QHBoxLayout(this); lay2 = new QVBoxLayout(); i = 0; break; default: lay1 = new QVBoxLayout(this); lay2 = new QHBoxLayout(); i = -1; break; } // setup Layouts this->setLayout(lay1); lay2->stretch(true); lay2->addWidget(m_ToggleAddPoint); lay2->addWidget(m_AddPoint); lay2->addWidget(m_RemovePointBtn); lay2->addWidget(m_MovePointUpBtn); lay2->addWidget(m_MovePointDownBtn); lay2->addWidget(m_SavePointsBtn); lay2->addWidget(m_LoadPointsBtn); // setup Labels m_TimeStepDisplay = new QLabel; m_TimeStepLabel = new QLabel; lay3 = new QHBoxLayout; m_TimeStepDisplay->setMaximumSize(200, 15); lay3->stretch(true); lay3->setAlignment(Qt::AlignLeft); lay3->addWidget(m_TimeStepDisplay); lay3->addWidget(m_TimeStepLabel); m_TimeStepDisplay->setText("Time Step: "); m_TimeStepLabel->setMaximumSize(10, 15); this->OnTimeStepChanged(0); //Add Layouts lay1->insertWidget(i, m_PointListView); this->setLayout(lay1); lay1->addLayout(lay2); lay1->addLayout(lay3); } void QmitkPointListWidget::SetPointSet(mitk::PointSet *newPs) { if (newPs == nullptr) return; this->m_PointSetNode->SetData(newPs); dynamic_cast(this->m_PointListView->model())->SetPointSetNode(m_PointSetNode); ObserveNewNode(m_PointSetNode); } void QmitkPointListWidget::SetPointSetNode(mitk::DataNode *newNode) { if (m_DataInteractor.IsNotNull()) m_DataInteractor->SetDataNode(newNode); ObserveNewNode(newNode); dynamic_cast(this->m_PointListView->model())->SetPointSetNode(newNode); } void QmitkPointListWidget::OnBtnSavePoints() { if ((dynamic_cast(m_PointSetNode->GetData())) == nullptr) return; // don't write empty point sets. If application logic requires something else then do something else. if ((dynamic_cast(m_PointSetNode->GetData()))->GetSize() == 0) return; // take the previously defined name of node as proposal for filename std::string nodeName = m_PointSetNode->GetName(); nodeName = "/" + nodeName + ".mps"; QString fileNameProposal = QString(); fileNameProposal.append(nodeName.c_str()); QString aFilename = QFileDialog::getSaveFileName( nullptr, "Save point set", QDir::currentPath() + fileNameProposal, "MITK Pointset (*.mps)"); if (aFilename.isEmpty()) return; try { mitk::IOUtil::Save(m_PointSetNode->GetData(), aFilename.toStdString()); } catch (...) { QMessageBox::warning(this, "Save point set", QString("File writer reported problems writing %1\n\n" "PLEASE CHECK output file!") .arg(aFilename)); } } void QmitkPointListWidget::OnBtnLoadPoints() { // get the name of the file to load QString filename = QFileDialog::getOpenFileName(nullptr, "Open MITK Pointset", "", "MITK Point Sets (*.mps)"); if (filename.isEmpty()) return; // attempt to load file try { mitk::PointSet::Pointer pointSet = dynamic_cast(mitk::IOUtil::Load(filename.toStdString())[0].GetPointer()); if (pointSet.IsNull()) { QMessageBox::warning(this, "Load point set", QString("File reader could not read %1").arg(filename)); return; } // loading successful this->SetPointSet(pointSet); } catch (...) { QMessageBox::warning(this, "Load point set", QString("File reader collapsed while reading %1").arg(filename)); } emit PointListChanged(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } mitk::PointSet *QmitkPointListWidget::GetPointSet() { return dynamic_cast(m_PointSetNode->GetData()); } mitk::DataNode *QmitkPointListWidget::GetPointSetNode() { return m_PointSetNode; } void QmitkPointListWidget::SetMultiWidget(QmitkStdMultiWidget *multiWidget) { m_PointListView->SetMultiWidget(multiWidget); } void QmitkPointListWidget::RemoveSelectedPoint() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->RemoveSelectedPoint(); emit PointListChanged(); } void QmitkPointListWidget::MoveSelectedPointDown() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->MoveSelectedPointDown(); emit PointListChanged(); } void QmitkPointListWidget::MoveSelectedPointUp() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->MoveSelectedPointUp(); emit PointListChanged(); } void QmitkPointListWidget::OnBtnAddPoint(bool checked) { if (m_PointSetNode.IsNotNull()) { if (checked) { m_DataInteractor = m_PointSetNode->GetDataInteractor(); // If no data Interactor is present create a new one if (m_DataInteractor.IsNull()) { // Create PointSetData Interactor m_DataInteractor = mitk::PointSetDataInteractor::New(); // Load the according state machine for regular point set interaction m_DataInteractor->LoadStateMachine("PointSet.xml"); // Set the configuration file that defines the triggers for the transitions m_DataInteractor->SetEventConfig("PointSetConfig.xml"); // set the DataNode (which already is added to the DataStorage m_DataInteractor->SetDataNode(m_PointSetNode); } } else { m_PointSetNode->SetDataInteractor(nullptr); m_DataInteractor = nullptr; } emit EditPointSets(checked); } } void QmitkPointListWidget::OnBtnAddPointManually() { mitk::PointSet *pointSet = this->GetPointSet(); QmitkEditPointDialog editPointDialog(this); if (this->GetPointSet()->IsEmpty()) { editPointDialog.SetPoint(pointSet, 0, m_TimeStep); } else { mitk::PointSet::PointsIterator maxIt = pointSet->GetMaxId(); mitk::PointSet::PointIdentifier maxId = maxIt->Index(); editPointDialog.SetPoint(pointSet, maxId + 1, m_TimeStep); } editPointDialog.exec(); } void QmitkPointListWidget::OnListDoubleClick() { } void QmitkPointListWidget::OnPointSelectionChanged() { emit this->PointSelectionChanged(); } void QmitkPointListWidget::DeactivateInteractor(bool) { } void QmitkPointListWidget::EnableEditButton(bool enabled) { m_EditAllowed = enabled; if (enabled == false) m_ToggleAddPoint->setEnabled(false); else m_ToggleAddPoint->setEnabled(true); OnBtnAddPoint(enabled); } void QmitkPointListWidget::ObserveNewNode(mitk::DataNode *node) { if (m_DataInteractor.IsNotNull()) m_DataInteractor->SetDataNode(node); // remove old observer if (m_PointSetNode) { if (m_DataInteractor) { m_DataInteractor = nullptr; m_ToggleAddPoint->setChecked(false); } m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; } m_PointSetNode = node; // add new observer if necessary if (m_PointSetNode) { itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction(this, &QmitkPointListWidget::OnNodeDeleted); m_NodeObserverTag = m_PointSetNode->AddObserver(itk::DeleteEvent(), command); } else { m_NodeObserverTag = 0; } if (m_EditAllowed == true) m_ToggleAddPoint->setEnabled(m_PointSetNode); else m_ToggleAddPoint->setEnabled(false); m_RemovePointBtn->setEnabled(m_PointSetNode); m_LoadPointsBtn->setEnabled(m_PointSetNode); m_SavePointsBtn->setEnabled(m_PointSetNode); m_AddPoint->setEnabled(m_PointSetNode); } void QmitkPointListWidget::OnNodeDeleted(const itk::EventObject &) { if (m_PointSetNode.IsNotNull() && !m_NodeObserverTag) m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; m_PointSetNode = nullptr; m_PointListView->SetPointSetNode(nullptr); m_ToggleAddPoint->setEnabled(false); m_RemovePointBtn->setEnabled(false); m_LoadPointsBtn->setEnabled(false); m_SavePointsBtn->setEnabled(false); m_AddPoint->setEnabled(false); } void QmitkPointListWidget::AddSliceNavigationController(mitk::SliceNavigationController *snc) { m_PointListView->AddSliceNavigationController(snc); } void QmitkPointListWidget::RemoveSliceNavigationController(mitk::SliceNavigationController *snc) { m_PointListView->RemoveSliceNavigationController(snc); } void QmitkPointListWidget::UnselectEditButton() { m_ToggleAddPoint->setChecked(false); }