diff --git a/Modules/IGTUI/Qmitk/QmitkFiducialRegistrationWidget.ui b/Modules/IGTUI/Qmitk/QmitkFiducialRegistrationWidget.ui index b0d6be8822..843344e01c 100755 --- a/Modules/IGTUI/Qmitk/QmitkFiducialRegistrationWidget.ui +++ b/Modules/IGTUI/Qmitk/QmitkFiducialRegistrationWidget.ui @@ -1,367 +1,279 @@ QmitkFiducialRegistrationWidget 0 0 - 570 - 442 + 569 + 402 0 0 Form - - - - - - - - 0 - 0 - - - - Status: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - - - Qt::AlignCenter - - - - - - - - - - 0 - 0 - - - - - 0 - 40 - - - - Register (object is moved) - - - - - - - - - Move Image Points - - - - - - - - 0 - 40 - - - - <html><head/><body><p>Find fiducial correspondences (needs 6+ fiducial pairs)</p></body></html> - - - Find fiducial - correspondences - - - - - + Fiducial Registration method true Static true true Hybrid Continuous false - + + + + + + Move Image Points + + + + + + + + 0 + 40 + + + + <html><head/><body><p>Find fiducial correspondences (needs 6+ fiducial pairs)</p></body></html> + + + + Find fiducial + correspondences + + + + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Register (object is moved) + + + + - + 0 0 Image / object / moving fiducials - - - - 30 - 30 - 210 - 171 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - 10 - 229 - 252 - 88 - - - - - 0 - 0 - - - - - 0 - 37 - - - - - 16777215 - 170 - - - - - - - Qt::AlignCenter - - - false - - - - - 20 - 20 - 201 - 35 - - - - - 0 - 0 - - - - - 0 - 35 - - - - - 16777215 - 70 - - - - Add image fiducial - - - + + + + + + 0 + 0 + + + + + + + + + 0 + 55 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + 0 + 0 + + + + + 0 + 35 + + + + Add image fiducial + + + + + + + - + 0 0 - - - 16777215 - 800 - - Tracker / fixed fiducials - - - - 7 - 216 - 251 - 101 - - - - - 0 - 0 - - - - - 0 - 37 - - - - - 16777215 - 170 - - - - - - - Qt::AlignCenter - - - false - - - - - 10 - 20 - 221 - 71 - - - - - 0 - 0 - - - - - 0 - 37 - - - - - 16777215 - 170 - - - - &Add current -instrument position - - - - - - - 40 - 40 - 221 - 141 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - + + + + + + 0 + 0 + + + + + + + + + 0 + 55 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + 0 + 0 + + + + + 0 + 35 + + + + &Add current + instrument position + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Status: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + Qt::AlignCenter + m_RegisterFiducialsBtn m_gbFiducialRegistration - QmitkPointListWidget - QWidget + QListWidget
QmitkPointListWidget.h
- 1
diff --git a/Modules/QtWidgetsExt/include/QmitkPointListView.h b/Modules/QtWidgetsExt/include/QmitkPointListView.h index 9210842248..e5705e1ac6 100644 --- a/Modules/QtWidgetsExt/include/QmitkPointListView.h +++ b/Modules/QtWidgetsExt/include/QmitkPointListView.h @@ -1,131 +1,131 @@ /*=================================================================== 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 QMITK_POINTLIST_VIEW_H_INCLUDED #define QMITK_POINTLIST_VIEW_H_INCLUDED #include "MitkQtWidgetsExtExports.h" #include "QmitkPointListModel.h" #include #include #include class QmitkStdMultiWidget; /*! * \brief GUI widget for handling mitk::PointSet * * Displays all the points in a mitk::PointSet graphically. * Reacts automatically to changes in the PointSet's selection status. * Updates PointSet's selection status when this list's selection changes. * * If a QmitkStdMultiWidget is assigned via SetMultiWidget(), the * crosshair of the QmitkStdMultiWidget is moved to the currently selected * point. * */ class MITKQTWIDGETSEXT_EXPORT QmitkPointListView : public QListView { Q_OBJECT public: QmitkPointListView(QWidget *parent = 0); ~QmitkPointListView() override; + QLabel *m_TimeStepFaderLabel; /// assign a point set for observation void SetPointSetNode(mitk::DataNode *pointSetNode); /// which point set to work on const mitk::PointSet *GetPointSet() const; /** * \brief If Multiwidget is set, the crosshair is automatically centering to the selected point * As an alternative, if you dont have a multiwidget, you can call SetSnc1, SetSnc2, SetSnc3 to set the * SliceNavigationControllers directly to enable the focussing feature. */ void SetMultiWidget(QmitkStdMultiWidget *multiWidget); QmitkStdMultiWidget *GetMultiWidget() const; ///< return the QmitkStdMultiWidget that is used for updating render window crosshair void SetTimesStep(int i); ///< which time step to display/model /** * @brief Add a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method adds \c snc to the set of slice navigation controllers which are * used to navigate to the selected point. */ void AddSliceNavigationController(mitk::SliceNavigationController *snc); /** * @brief Remove a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method removes \c snc from the set of slice navigation controllers which are * used to navigate to the selected point. */ void RemoveSliceNavigationController(mitk::SliceNavigationController *snc); signals: void SignalPointSelectionChanged(); ///< this signal is emmitted, if the selection of a point in the pointset is changed protected slots: /// Filtering double click event for editing point coordinates via a dialog void OnPointDoubleClicked(const QModelIndex &index); /// called when the point set data structure changes void OnPointSetSelectionChanged(); /// called when the selection of the view widget changes void OnListViewSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); /// fade the shown timestep out void fadeTimeStepOut(); /// open ContextMenu void ctxMenu(const QPoint &pos); /// Turn TimeStep Fading On/Off void SetFading(bool onOff); /// Delete all points in the list void ClearPointList(); /// delete all points in the list in the current timestep void ClearPointListTS(); protected: void keyPressEvent(QKeyEvent *e) override; ///< react to F2, F3 and DEL keys void wheelEvent(QWheelEvent *event) override; ///< change timestep of the current pointset by mouse wheel void fadeTimeStepIn(); ///< fade a label with the currently shown timestep in std::set m_Sncs; QmitkPointListModel *m_PointListModel; bool m_SelfCall; bool m_showFading; /// used to position the planes on a selected point QmitkStdMultiWidget *m_MultiWidget; - QLabel *m_TimeStepFaderLabel; }; #endif diff --git a/Modules/QtWidgetsExt/include/QmitkPointListWidget.h b/Modules/QtWidgetsExt/include/QmitkPointListWidget.h index a7136b489f..c667dcad51 100644 --- a/Modules/QtWidgetsExt/include/QmitkPointListWidget.h +++ b/Modules/QtWidgetsExt/include/QmitkPointListWidget.h @@ -1,150 +1,155 @@ /*=================================================================== 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 QmitkPointListWidget_H #define QmitkPointListWidget_H #include "MitkQtWidgetsExtExports.h" #include #include #include #include #include #include #include +#include /*! * \brief Widget for regular operations on point sets * * Displays a list of point coordinates and a couple of * buttons which * * \li enable point set interaction * \li clear all points from a set * \li load points from file * \li save points to file * * The user/application module of this widget needs to * assign a mitk::PointSet object to this widget. The user * also has to decide whether it wants to put the point set * into (a) DataStorage. This widget will not add/remove * point sets to DataStorage. * * If the render window crosshair should be moved to the * currently selected point, the widget user has to provide * a QmitkStdMultiWidget object. */ class MITKQTWIDGETSEXT_EXPORT QmitkPointListWidget : public QWidget { Q_OBJECT public: QmitkPointListWidget(QWidget *parent = 0, int orientation = 0); ~QmitkPointListWidget() override; void SetupConnections(); /** * @brief Add a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method adds \c snc to the set of slice navigation controllers which are * used to navigate to the selected point. */ void AddSliceNavigationController(mitk::SliceNavigationController *snc); /** * @brief Remove a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method removes \c snc from the set of slice navigation controllers which are * used to navigate to the selected point. */ void RemoveSliceNavigationController(mitk::SliceNavigationController *snc); /** @brief assign a point set (contained in a node of DataStorage) for observation */ void SetPointSet(mitk::PointSet *newPs); mitk::PointSet *GetPointSet(); /** @brief assign a point set (contained in a node of DataStorage) for observation */ void SetPointSetNode(mitk::DataNode *newNode); mitk::DataNode *GetPointSetNode(); /** @brief assign a QmitkStdMultiWidget for updating render window crosshair */ void SetMultiWidget(QmitkStdMultiWidget *multiWidget); /** @brief itk observer for node "delete" events */ void OnNodeDeleted(const itk::EventObject &e); /** @brief Unselects the edit button if it is selected. */ void UnselectEditButton(); public slots: void DeactivateInteractor(bool deactivate); void EnableEditButton(bool enabled); signals: /** @brief signal to inform about the state of the EditPointSetButton, whether an interactor for setting points is * active or not */ void EditPointSets(bool active); /// signal to inform that the selection of a point in the pointset has changed void PointSelectionChanged(); /// signal to inform about cleared or loaded point sets void PointListChanged(); protected slots: void OnBtnSavePoints(); void OnBtnLoadPoints(); void RemoveSelectedPoint(); void MoveSelectedPointDown(); void MoveSelectedPointUp(); void OnBtnAddPoint(bool checked); void OnBtnAddPointManually(); /*! \brief pass through signal from PointListView that point selection has changed */ void OnPointSelectionChanged(); void OnListDoubleClick(); protected: void SetupUi(); + void updateTimeStepStatus(); void ObserveNewNode(mitk::DataNode *node); QmitkPointListView *m_PointListView; mitk::DataNode::Pointer m_PointSetNode; int m_Orientation; QPushButton *m_MovePointUpBtn; QPushButton *m_MovePointDownBtn; QPushButton *m_RemovePointBtn; QPushButton *m_SavePointsBtn; QPushButton *m_LoadPointsBtn; QPushButton *m_ToggleAddPoint; QPushButton *m_AddPoint; + QLabel *m_TimeStepDisplay; mitk::DataInteractor::Pointer m_DataInteractor; int m_TimeStep; bool m_EditAllowed; unsigned long m_NodeObserverTag; + + QmitkPointListModel *m_PointListModel; }; #endif diff --git a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp index 61faec0506..c61b4b6f67 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp @@ -1,371 +1,339 @@ /*=================================================================== 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 "QmitkPointListView.h" #include "QmitkEditPointDialog.h" #include "QmitkPointListModel.h" #include "QmitkStdMultiWidget.h" #include "mitkRenderingManager.h" #include #include #include #include #include QmitkPointListView::QmitkPointListView(QWidget *parent) : QListView(parent), m_PointListModel(new QmitkPointListModel()), m_SelfCall(false), m_showFading(false), m_MultiWidget(nullptr) { QListView::setAlternatingRowColors(true); QListView::setSelectionBehavior(QAbstractItemView::SelectRows); QListView::setSelectionMode(QAbstractItemView::SingleSelection); QListView::setModel(m_PointListModel); QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse " "wheel to change the timestep.\n\nTimeStep:\t%1") .arg(0); QListView::setToolTip(tooltip); this->setContextMenuPolicy(Qt::CustomContextMenu); m_TimeStepFaderLabel = new QLabel(this); - QFont font("Arial", 17); - m_TimeStepFaderLabel->setFont(font); this->setMinimumHeight(40); this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); connect(m_PointListModel, SIGNAL(SignalUpdateSelection()), this, SLOT(OnPointSetSelectionChanged())); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(OnPointDoubleClicked(const QModelIndex &))); connect(QListView::selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(OnListViewSelectionChanged(const QItemSelection &, const QItemSelection &))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &))); } QmitkPointListView::~QmitkPointListView() { delete m_PointListModel; } void QmitkPointListView::SetPointSetNode(mitk::DataNode *pointSetNode) { m_PointListModel->SetPointSetNode(pointSetNode); } const mitk::PointSet *QmitkPointListView::GetPointSet() const { return m_PointListModel->GetPointSet(); } void QmitkPointListView::SetMultiWidget(QmitkStdMultiWidget *multiWidget) { m_MultiWidget = multiWidget; this->AddSliceNavigationController(multiWidget->mitkWidget1->GetSliceNavigationController()); this->AddSliceNavigationController(multiWidget->mitkWidget2->GetSliceNavigationController()); this->AddSliceNavigationController(multiWidget->mitkWidget3->GetSliceNavigationController()); } QmitkStdMultiWidget *QmitkPointListView::GetMultiWidget() const { return m_MultiWidget; } void QmitkPointListView::OnPointDoubleClicked(const QModelIndex &index) { mitk::PointSet::PointType p; mitk::PointSet::PointIdentifier id; m_PointListModel->GetPointForModelIndex(index, p, id); QmitkEditPointDialog _EditPointDialog(this); _EditPointDialog.SetPoint(m_PointListModel->GetPointSet(), id, m_PointListModel->GetTimeStep()); _EditPointDialog.exec(); } void QmitkPointListView::OnPointSetSelectionChanged() { const mitk::PointSet *pointSet = m_PointListModel->GetPointSet(); if (pointSet == nullptr) return; // update this view's selection status as a result to changes in the point set data structure m_SelfCall = true; int timeStep = m_PointListModel->GetTimeStep(); if (pointSet->GetNumberOfSelected(timeStep) > 1) { MITK_ERROR << "Point set has multiple selected points. This view is not designed for more than one selected point."; } int selectedIndex = pointSet->SearchSelectedPoint(timeStep); if (selectedIndex == -1) // no selected point is found { m_SelfCall = false; return; } QModelIndex index; bool modelIndexOkay = m_PointListModel->GetModelIndexForPointID(selectedIndex, index); if (modelIndexOkay == true) QListView::selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); emit SignalPointSelectionChanged(); m_SelfCall = false; } void QmitkPointListView::OnListViewSelectionChanged(const QItemSelection &selected, const QItemSelection & /*deselected*/) { if (m_SelfCall) return; mitk::PointSet *pointSet = const_cast(m_PointListModel->GetPointSet()); if (pointSet == nullptr) return; // (take care that this widget doesn't react to self-induced changes by setting m_SelfCall) m_SelfCall = true; // update selection of all points in pointset: select the one(s) that are selected in the view, deselect all others QModelIndexList selectedIndexes = selected.indexes(); for (mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->Begin(); it != pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->End(); ++it) { QModelIndex index; if (m_PointListModel->GetModelIndexForPointID(it->Index(), index)) { if (selectedIndexes.indexOf(index) != -1) // index is found in the selected indices list { pointSet->SetSelectInfo(it->Index(), true, m_PointListModel->GetTimeStep()); mitk::Point3D p = pointSet->GetPoint(it->Index(), m_PointListModel->GetTimeStep()); for (auto snc : m_Sncs) snc->SelectSliceByPoint(p); } else { pointSet->SetSelectInfo(it->Index(), false, m_PointListModel->GetTimeStep()); } } } m_SelfCall = false; emit SignalPointSelectionChanged(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPointListView::keyPressEvent(QKeyEvent *e) { if (m_PointListModel == nullptr) return; int key = e->key(); switch (key) { case Qt::Key_F2: m_PointListModel->MoveSelectedPointUp(); break; case Qt::Key_F3: m_PointListModel->MoveSelectedPointDown(); break; case Qt::Key_Delete: m_PointListModel->RemoveSelectedPoint(); break; default: break; } } void QmitkPointListView::wheelEvent(QWheelEvent *event) { if (!m_PointListModel || !m_PointListModel->GetPointSet() || (int)(m_PointListModel->GetPointSet()->GetTimeSteps()) == 1) return; int whe = event->delta(); mitk::PointSet::Pointer ps = dynamic_cast(m_PointListModel->GetPointSet()); unsigned int numberOfTS = ps->GetTimeSteps(); if (numberOfTS == 1) return; int currentTS = this->m_PointListModel->GetTimeStep(); if (whe > 0) { if ((currentTS + 1 >= (int)numberOfTS)) return; this->m_PointListModel->SetTimeStep(++currentTS); } else { if ((currentTS <= 0)) return; this->m_PointListModel->SetTimeStep(--currentTS); } QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse " "wheel to change the timestep.\n\nTimeStep:\t%1") .arg(currentTS); this->setToolTip(tooltip); fadeTimeStepIn(); } void QmitkPointListView::fadeTimeStepIn() { - // Setup Widget - QWidget *m_TimeStepFader = new QWidget(this); - QHBoxLayout *layout = new QHBoxLayout(m_TimeStepFader); - - int x = (int)(this->geometry().x() + this->width() * 0.6); - int y = (int)(this->geometry().y() + this->height() * 0.8); - m_TimeStepFader->move(x, y); - m_TimeStepFader->resize(60, 55); - m_TimeStepFader->setLayout(layout); - m_TimeStepFader->setAttribute(Qt::WA_DeleteOnClose); - - layout->addWidget(m_TimeStepFaderLabel); - m_TimeStepFaderLabel->setAlignment(Qt::AlignCenter); - m_TimeStepFaderLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); - m_TimeStepFaderLabel->setLineWidth(2); m_TimeStepFaderLabel->setText(QString("%1").arg(this->m_PointListModel->GetTimeStep())); - - // give the widget opacity and some colour - QPalette pal = m_TimeStepFaderLabel->palette(); - QColor semiTransparentColor(139, 192, 223, 50); - QColor labelTransparentColor(0, 0, 0, 200); - pal.setColor(m_TimeStepFaderLabel->backgroundRole(), semiTransparentColor); - pal.setColor(m_TimeStepFaderLabel->foregroundRole(), labelTransparentColor); - m_TimeStepFaderLabel->setAutoFillBackground(true); - m_TimeStepFaderLabel->setPalette(pal); - - // show the widget - m_TimeStepFader->show(); - - // and start the timer m_TimeStepFaderLabel->setVisible(true); - QTimer::singleShot(2000, this, SLOT(fadeTimeStepOut())); } void QmitkPointListView::fadeTimeStepOut() { m_TimeStepFaderLabel->hide(); } void QmitkPointListView::ctxMenu(const QPoint &pos) { QMenu *menu = new QMenu; // add Fading check QAction *showFading = new QAction(this); showFading->setCheckable(false); // TODO: reset when fading is working showFading->setEnabled(false); // TODO: reset when fading is working showFading->setText("Fade TimeStep"); connect(showFading, SIGNAL(triggered(bool)), this, SLOT(SetFading(bool))); menu->addAction(showFading); // add Clear action QAction *clearList = new QAction(this); clearList->setText("Clear List"); connect(clearList, SIGNAL(triggered()), this, SLOT(ClearPointList())); menu->addAction(clearList); // add Clear TimeStep action QAction *clearTS = new QAction(this); clearTS->setText("Clear current time step"); connect(clearTS, SIGNAL(triggered()), this, SLOT(ClearPointListTS())); menu->addAction(clearTS); menu->exec(this->mapToGlobal(pos)); } void QmitkPointListView::SetFading(bool onOff) { m_showFading = onOff; } void QmitkPointListView::ClearPointList() { if (!m_PointListModel->GetPointSet()) return; mitk::PointSet::Pointer curPS = m_PointListModel->GetPointSet(); if (curPS->GetSize() == 0) return; switch (QMessageBox::question(this, tr("Clear Points"), tr("Remove all points from the displayed list?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { case QMessageBox::Yes: { mitk::PointSet::PointsIterator it; mitk::PointSet::PointsContainer *curPsPoints; while (!curPS->IsEmptyTimeStep(0)) { curPsPoints = curPS->GetPointSet()->GetPoints(); it = curPsPoints->Begin(); curPS->SetSelectInfo(it->Index(), true); m_PointListModel->RemoveSelectedPoint(); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); break; } case QMessageBox::No: default: break; } } void QmitkPointListView::ClearPointListTS() { } void QmitkPointListView::AddSliceNavigationController(mitk::SliceNavigationController *snc) { if (snc == nullptr) return; m_Sncs.insert(snc); } void QmitkPointListView::RemoveSliceNavigationController(mitk::SliceNavigationController *snc) { if (snc == nullptr) return; m_Sncs.erase(snc); } diff --git a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp index b4179590be..d97c49f65e 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp @@ -1,463 +1,494 @@ /*=================================================================== 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 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_DataInteractor(nullptr), m_TimeStep(0), m_EditAllowed(true), - m_NodeObserverTag(0) + m_NodeObserverTag(0), + m_TimeStepDisplay(nullptr) + { 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->m_TimeStepFaderLabel, SIGNAL(m_PointListView->wheelEvent(QWheelEvent)), this, SLOT(updateTimeStepStatus())); } 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_AddPoint = new QPushButton(); m_AddPoint->setMaximumSize(25, 25); m_AddPoint->setToolTip("Manually add point"); QIcon iconAddManually(":/QtWidgetsExt/btnSetPointsManually.xpm"); m_AddPoint->setIcon(iconAddManually); m_RemovePointBtn = new QPushButton(); m_RemovePointBtn->setMaximumSize(25, 25); const QIcon iconDel(":/QtWidgetsExt/btnClear.xpm"); m_RemovePointBtn->setIcon(iconDel); 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->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->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->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->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); - lay1->addLayout(lay2); - 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(); + lay3 = new QHBoxLayout(); + + m_TimeStepDisplay->setMaximumSize(50, 15); + m_PointListView->m_TimeStepFaderLabel->setMaximumSize(10, 15); + + lay3->stretch(true); + lay3->setAlignment(Qt::AlignLeft); + lay3->addWidget(m_TimeStepDisplay); + lay3->addWidget(m_PointListView->m_TimeStepFaderLabel); + + m_TimeStepDisplay->setText("Time Step: "); + m_PointListModel = new QmitkPointListModel; + m_PointListView->m_TimeStepFaderLabel->setText(QString("%1").arg((this->m_PointListModel)->GetTimeStep())); + + //Add Layouts + lay1->insertWidget(i, m_PointListView); this->setLayout(lay1); + lay1->addLayout(lay2); + lay1->addLayout(lay3); +} + +void QmitkPointListWidget::updateTimeStepStatus() +{ + m_PointListView->m_TimeStepFaderLabel = new QLabel(this); + m_PointListView->m_TimeStepFaderLabel->setVisible(true); } 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); } diff --git a/Plugins/org.blueberry.ui.qt/resources/darkstyle.qss b/Plugins/org.blueberry.ui.qt/resources/darkstyle.qss index 369a7853a8..f936c54999 100644 --- a/Plugins/org.blueberry.ui.qt/resources/darkstyle.qss +++ b/Plugins/org.blueberry.ui.qt/resources/darkstyle.qss @@ -1,1485 +1,1485 @@ /*=================================================================== BlueBerry Platform 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. ===================================================================*/ /* * The MIT License (MIT) * * Copyright (c) <2013-2014> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* foregroundColor = #adb1b6 iconColor = #adb1b6 <- This line is parsed by MITK iconAccentColor = #db7039 <- This line is parsed by MITK backgroundColor = #323231 inactiveColor = #1d1d1c highlightColor = #3399cc popupColor = #027c90 warningColor = #ffb400 borderColor = #1d1d1c */ QToolTip { border: 1px solid #1d1d1c; background-color: #323231; color: #adb1b6; padding: 3px; opacity: 200; } QWidget { color: #adb1b6; background-color: #323231; selection-background-color: #3399cc; selection-color: #1d1d1c; background-clip: border; border-image: none; border: 0px transparent #1d1d1c; outline: 0; } QWidget:item:hover { background-color: #3399cc; color: #adb1b6; } QWidget:item:selected { background-color: #3399cc; } QCheckBox { spacing: 5px; outline: none; color: #adb1b6; margin-bottom: 2px; } QCheckBox:disabled { color: #1d1d1c; } QCheckBox::indicator, QGroupBox::indicator { width: 18px; height: 30px; } QGroupBox::indicator { margin-left: 0px; } QCheckBox::indicator:unchecked { image: url(:/org.blueberry.ui.qt/dark/checkbox_unchecked.png); } QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed, QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { border: none; image: url(:/org.blueberry.ui.qt/dark/checkbox_unchecked_focus.png); } QCheckBox::indicator:checked { image: url(:/org.blueberry.ui.qt/dark/checkbox_checked.png); } QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed, QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { border: none; image: url(:/org.blueberry.ui.qt/dark/checkbox_checked_focus.png); } QCheckBox::indicator:indeterminate { image: url(:/org.blueberry.ui.qt/dark/checkbox_indeterminate.png); } QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { image: url(:/org.blueberry.ui.qt/dark/checkbox_indeterminate_focus.png); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { image: url(:/org.blueberry.ui.qt/dark/checkbox_checked_disabled.png); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { image: url(:/org.blueberry.ui.qt/dark/checkbox_unchecked_disabled.png); } QRadioButton { spacing: 5px; outline: none; color: #adb1b6; margin-bottom: 2px; } QRadioButton:disabled { color: #1d1d1c; } QRadioButton::indicator { width: 21px; height: 21px; } QRadioButton::indicator:unchecked { image: url(:/org.blueberry.ui.qt/dark/radio_unchecked.png); } QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { border: none; outline: none; image: url(:/org.blueberry.ui.qt/dark/radio_unchecked_focus.png); } QRadioButton::indicator:checked { border: none; outline: none; image: url(:/org.blueberry.ui.qt/dark/radio_checked.png); } QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { border: none; outline: none; image: url(:/org.blueberry.ui.qt/dark/radio_checked_focus.png); } QRadioButton::indicator:checked:disabled { outline: none; image: url(:/org.blueberry.ui.qt/dark/radio_checked_disabled.png); } QRadioButton::indicator:unchecked:disabled { image: url(:/org.blueberry.ui.qt/dark/radio_unchecked_disabled.png); } QMenuBar { background-color: #323231; color: #adb1b6; } QMenuBar::item { background: transparent; } QMenuBar::item:selected { background: transparent; border: 1px solid #1d1d1c; } QMenuBar::item:pressed { border: 1px solid #1d1d1c; background-color: #3399cc; color: #adb1b6; margin-bottom:-1px; padding-bottom:1px; } QMenu { border: 1px solid #1d1d1c; color: #adb1b6; margin: 2px; } QMenu::icon { margin: 5px; } QMenu::item { padding: 5px 30px 5px 30px; margin-left: 5px; border: 1px solid transparent; /* leave some space for selection border */ } QMenu::item:selected { color: #adb1b6; } QMenu::separator { height: 2px; background: #3399cc; margin-left: 10px; margin-right: 5px; } QMenu::indicator { width: 18px; height: 18px; } /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ QMenu::indicator:non-exclusive:unchecked { image: url(:/org.blueberry.ui.qt/dark/checkbox_unchecked.png); } QMenu::indicator:non-exclusive:unchecked:selected { image: url(:/org.blueberry.ui.qt/dark/checkbox_unchecked_disabled.png); } QMenu::indicator:non-exclusive:checked { image: url(:/org.blueberry.ui.qt/dark/checkbox_checked.png); } QMenu::indicator:non-exclusive:checked:selected { image: url(:/org.blueberry.ui.qt/dark/checkbox_checked_disabled.png); } /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ QMenu::indicator:exclusive:unchecked { image: url(:/org.blueberry.ui.qt/dark/radio_unchecked.png); } QMenu::indicator:exclusive:unchecked:selected { image: url(:/org.blueberry.ui.qt/dark/radio_unchecked_disabled.png); } QMenu::indicator:exclusive:checked { image: url(:/org.blueberry.ui.qt/dark/radio_checked.png); } QMenu::indicator:exclusive:checked:selected { image: url(:/org.blueberry.ui.qt/dark/radio_checked_disabled.png); } QMenu::right-arrow { margin: 5px; image: url(:/org.blueberry.ui.qt/dark/right_arrow.png) } QWidget:disabled { color: #1d1d1c; background-color: #323231; } QAbstractItemView { alternate-background-color: #323231; color: #adb1b6; border: 1px solid 3A3939; border-radius: 0px; } QWidget:focus, QMenuBar:focus { border: 1px solid #3399cc; } QCheckBox:focus, QRadioButton:focus, QSlider:focus { border: none; } QLineEdit { background-color: #1d1d1c; padding: 2px; border-style: solid; border: 1px solid #1d1d1c; border-radius: 0px; color: #adb1b6; } QGroupBox { border:1px solid #323231; border-radius: 0px; padding-top: 24px; font-weight: bold; } QGroupBox::title { border:1px solid #323231; border-right:0px; border-bottom:0px; subcontrol-position: top left; subcontrol-origin: margin; padding: 1px; } QAbstractScrollArea { border-radius: 0px; border: 1px solid #1d1d1c; background-color: #323231; } QScrollBar:horizontal { height: 15px; margin: 3px 15px 3px 15px; border: 1px transparent #1d1d1c; border-radius: 0px; background-color: #1d1d1c; } QScrollBar::handle:horizontal { background-color: #323231; border: 2px solid #1d1d1c; min-width: 5px; border-radius: 0px; } QScrollBar::add-line:horizontal { margin: 0px 3px 0px 3px; border-image: url(:/org.blueberry.ui.qt/dark/right_arrow_disabled.png); width: 10px; height: 10px; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal { margin: 0px 3px 0px 3px; border-image: url(:/org.blueberry.ui.qt/dark/left_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { border-image: url(:/org.blueberry.ui.qt/dark/right_arrow.png); height: 10px; width: 10px; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { border-image: url(:/org.blueberry.ui.qt/dark/left_arrow.png); height: 10px; width: 10px; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { background: none; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; } QScrollBar:vertical { background-color: #1d1d1c; width: 15px; margin: 15px 2px 15px 2px; border: 1px transparent #1d1d1c; border-radius: 0px; } QScrollBar::handle:vertical { background-color: #323231; border: 2px solid #1d1d1c; min-height: 5px; border-radius: 0px; } QScrollBar::sub-line:vertical { margin: 3px 0px 3px 0px; border-image: url(:/org.blueberry.ui.qt/dark/up_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical { margin: 3px 0px 3px 0px; border-image: url(:/org.blueberry.ui.qt/dark/down_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { border-image: url(:/org.blueberry.ui.qt/dark/up_arrow.png); height: 10px; width: 10px; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { border-image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); height: 10px; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { background: none; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; } QTextEdit { background-color: #1d1d1c; color: #adb1b6; border: 1px solid #1d1d1c; } QPlainTextEdit { background-color: #1d1d1c;; color: #adb1b6; border-radius: 0px; border: 1px solid #1d1d1c; } QHeaderView::section { background-color: #1d1d1c; color: #adb1b6; padding: 5px; border: 1px solid #1d1d1c; } QSizeGrip { image: url(:/org.blueberry.ui.qt/dark/sizegrip.png); width: 12px; height: 12px; } QMainWindow::separator { background-color: #323231; color: #adb1b6; padding-left: 4px; spacing: 2px; border: 1px dashed #1d1d1c; } QMainWindow::separator:hover { background-color: #adb1b6; color: #adb1b6; padding-left: 4px; border: 1px solid #1d1d1c; spacing: 2px; } QMenu::separator { height: 1px; background-color: #1d1d1c; color: #adb1b6; padding-left: 4px; margin-left: 10px; margin-right: 5px; } QFrame { border-radius: 0px; border: 1px solid #1d1d1c; } QFrame[frameShape="0"] { border-radius: 0px; border: 1px transparent #1d1d1c; } QStackedWidget { border: 1px transparent #1d1d1c; } QToolBar { border: 1px transparent #393838; background: 1px solid #323231; font-weight: bold; } /* this fixes the size of the plugin icons in the toolbar */ QToolBar QToolButton { background-color: #323231; border: 1px solid #323231; border-radius: 0px; min-width: 30px; min-height: 30px; margin: 0px; padding: 0px; } QToolBar::handle:horizontal { image: url(:/org.blueberry.ui.qt/dark/Hmovetoolbar.png); } QToolBar::handle:vertical { image: url(:/org.blueberry.ui.qt/dark/Vmovetoolbar.png); } QToolBar::separator:horizontal { image: url(:/org.blueberry.ui.qt/dark/Hsepartoolbar.png); } QToolBar::separator:vertical { image: url(:/org.blueberry.ui.qt/dark/Vsepartoolbar.png); } QToolButton { background-color: #323231; border: 1px solid #323231; border-radius: 0px; min-width: 12px; min-height: 12px; margin: 0px; padding: 0px; } /* only for MenuButtonPopup */ QToolButton[popupMode="1"] { border: 0px solid #1d1d1c; } /* only for InstantPopup */ QToolButton[popupMode="2"] { border: 0px solid #1d1d1c; } /* this fixes the size of the standard icons in the toolbar */ QToolButton:hover, QToolButton::menu-button:hover { background-color: #3399cc; border: 1px solid #3399cc; min-width: 30px; min-height: 30px; margin: 0px; padding: 0px; } QToolButton#qt_toolbar_ext_button, QToolBarExtension { qproperty-icon: url(:/org.blueberry.ui.qt/dark/right_arrows.svg); min-width: 10px; } QPushButton { color: #adb1b6; background-color: #323231; - min-width: 68px; + border-width: 1px; border-color: #1d1d1c; border-style: solid; padding: 3px; border-radius: 0px; outline: none; } QPushButton:disabled { background-color: #1d1d1c; color: #323231; } QPushButton:focus { color: #3399cc; border-color: #3399cc; border-style: solid; border-width: 1px; } QPushButton:pressed { background-color: #3399cc; color: #1d1d1c; padding-top: -15px; padding-bottom: -17px; border-width: 1px; border-color: #1d1d1c; } QComboBox { selection-background-color: #3399cc; selection-color: #1d1d1c; border: 1px solid #1d1d1c; border-radius: 0px; padding: 3px; min-width: 75px; } QPushButton:checked{ background-color: #1d1d1c; border-color: #adb1b6; } QComboBox:hover, QAbstractSpinBox:hover, QLineEdit:hover, QTextEdit:hover, QPlainTextEdit:hover, QAbstractView:hover { border: 1px solid #3399cc; color: #adb1b6; } QPushButton:hover,QTreeView:hover { border: 1px solid #1d1d1c; color: #3399cc; } QComboBox QAbstractItemView { background-color: #323231; border-radius: 0px; border: 1px solid #1d1d1c; selection-background-color: #3399cc; selection-color: #adb1b6; } QComboBox:on { padding-top: 3px; padding-left: 3px; selection-background-color: #3399cc; color: #adb1b6; selection-color: #adb1b6; } QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; min-width: 15px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; } QComboBox::down-arrow { image: url(:/org.blueberry.ui.qt/dark/down_arrow_disabled.png); } QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); } QAbstractSpinBox { border: 1px solid #1d1d1c; background-color: #1d1d1c; padding-top: 1px; padding-bottom: 1px; color: #adb1b6; border-radius: 0px; min-width: 50px; } QAbstractSpinBox:up-button { border: 2px transparent #1d1d1c; background-color: #323231; subcontrol-origin: border; subcontrol-position: top right; padding-top: 1px; margin-bottom: 1px; margin-top: 2px; margin-right: 2px; margin-left: 2px; } QAbstractSpinBox:down-button { border: 2px transparent #1d1d1c; background-color: #323231; subcontrol-origin: border; subcontrol-position: bottom right; padding-bottom: 0px; margin-bottom: 2px; margin-top: 1px; margin-right: 2px; margin-left: 2px; } QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { image: url(:/org.blueberry.ui.qt/dark/up_arrow_disabled.png); width: 10px; height: 10px; } QAbstractSpinBox::up-arrow:hover { image: url(:/org.blueberry.ui.qt/dark/up_arrow.png); } QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off { image: url(:/org.blueberry.ui.qt/dark/down_arrow_disabled.png); width: 10px; height: 10px; } QAbstractSpinBox::down-arrow:hover { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); } QLabel { border: 1px solid #1d1d1c; } QTabWidget::pane { border: 1px solid #adb1b6; padding: 1px; margin: 0px; } /* TABS IN GENERAL */ QTabBar { qproperty-drawBase: 0; left: 0px; border-radius: 0px; border: 1px transparent #adb1b6; } QTabBar:focus { border: 1px solid #adb1b6; } QTabBar::close-button { image: url(:/org.blueberry.ui.qt/dark/tab_close_grey.svg); background: transparent; } QTabBar::close-button:hover { image: url(:/org.blueberry.ui.qt/dark/tab_close_grey.svg); background: transparent; } QTabBar::close-button:pressed { image: url(:/org.blueberry.ui.qt/dark/tab_close_grey.svg); background: transparent; } QTabBar::tab:right:!selected:hover { color: #3399cc; } QTabBar QToolButton::right-arrow:enabled { image: url(:/org.blueberry.ui.qt/dark/right_arrow.png); } QTabBar QToolButton::left-arrow:enabled { image: url(:/org.blueberry.ui.qt/dark/left_arrow.png); } QTabBar QToolButton::right-arrow:disabled { image: url(:/org.blueberry.ui.qt/dark/right_arrow_disabled.png); } QTabBar QToolButton::left-arrow:disabled { image: url(:/org.blueberry.ui.qt/dark/left_arrow_disabled.png); } QTabBar::scroller { margin: 0px; padding: 0px; } /* TOP TABS */ QTabBar::tab:top { font-weight: normal; color:#1d1d1c; border: 1px solid #adb1b6; border-bottom: 0px; background: #adb1b6; padding: 2px; min-width: 150px; border-top-left-radius: 0px; border-top-right-radius: 0px; } QTabBar::tab:top:!selected { color: #adb1b6; font-weight: normal; background-color: #323231; border: 0px solid #323231; border-top-left-radius: 0px; border-top-right-radius: 0px; } QTabBar::tab:top:!selected:hover { color: #3399cc; } /* BOTTOM TABS */ QTabBar::tab:bottom { font-weight: bold; color: #ffffff ; border: 0px solid #1d1d1c; background-color: #1d1d1c; padding: 5px; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; min-width: 50px; } QTabBar::tab:bottom:!selected { color: #adb1b6; font-weight: normal; background-color: #323231; border: 0px solid #1d1d1c; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; } QTabBar::tab:bottom:!selected:hover { color: #3399cc; } /* LEFT TABS */ QTabBar::tab:left { color: #adb1b6; font-weight: bold; border: 0px solid #1d1d1c; background-color: #1d1d1c; padding: 5px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; min-height: 50px; } QTabBar::tab:left:!selected { color: #adb1b6; font-weight: normal; background-color: #323231; border: 0px solid #1d1d1c; border-top-right-radius: 0px; border-bottom-right-radius: 0px; } QTabBar::tab:left:!selected:hover { color: #3399cc; } /* RIGHT TABS */ QTabBar::tab:right { color: #adb1b6; font-weight: bold; border: 0px solid #1d1d1c; background-color: #1d1d1c; padding: 5px; border-top-left-radius: 0px; border-bottom-left-radius: 0px; min-height: 50px; } QTabBar::tab:right:!selected { color: #adb1b6; font-weight: normal; background-color: #323231; border: 0px solid #1d1d1c; border-top-left-radius: 0px; border-bottom-left-radius: 0px; } /* TODO check if #403F3F is nice */ QDockWidget { background: #323231; border: 1px solid #403F3F; titlebar-close-icon: url(:/org.blueberry.ui.qt/dark/tab_close_grey.svg); titlebar-normal-icon: url(:/org.blueberry.ui.qt/dark/undock.png); } QDockWidget::close-button, QDockWidget::float-button { border: 1px solid transparent; border-radius: 0px; background: transparent; } /* TODO check if rgba(255, 255, 255, 10) is nice */ QDockWidget::close-button:hover, QDockWidget::float-button:hover { background: rgba(255, 255, 255, 10); } QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { padding: 1px -1px -1px 1px; background: rgba(255, 255, 255, 10); } QTreeView, QListView { border: 1px solid #1d1d1c; background-color: #1d1d1c; } QTreeView::indicator:unchecked { image: url(:/org.blueberry.ui.qt/dark/checkbox_big_unchecked.png); } QTreeView::indicator:checked, QTreeView::indicator:indeterminate { image: url(:/org.blueberry.ui.qt/dark/checkbox_big_checked.png); } QTreeView::indicator:unchecked:selected { image: url(:/org.blueberry.ui.qt/dark/checkbox_big_unchecked_disabled.png); } QTreeView::indicator:indeterminate:selected, QTreeView::indicator:checked:selected { image: url(:/org.blueberry.ui.qt/dark/checkbox_big_checked_disabled.png); } QTreeView:branch:selected, QTreeView:branch:hover { background: url(:/org.blueberry.ui.qt/dark/transparent.png); } QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/org.blueberry.ui.qt/dark/transparent.png); } QTreeView::branch:has-siblings:adjoins-item { border-image: url(:/org.blueberry.ui.qt/dark/transparent.png); } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/org.blueberry.ui.qt/dark/transparent.png); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { image: url(:/org.blueberry.ui.qt/dark/branch_closed.png); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { image: url(:/org.blueberry.ui.qt/dark/branch_open.png); } QTreeView::branch:has-children:!has-siblings:closed:hover, QTreeView::branch:closed:has-children:has-siblings:hover { image: url(:/org.blueberry.ui.qt/dark/branch_closed-on.png); } QTreeView::branch:open:has-children:!has-siblings:hover, QTreeView::branch:open:has-children:has-siblings:hover { image: url(:/org.blueberry.ui.qt/dark/branch_open-on.png); } QListView::item:!selected:hover, QTreeView::item:!selected:hover { background: #323231; outline: 0; color: #adb1b6 } QListView::item:selected:hover, QTreeView::item:selected:hover { background: #3399cc; color: #adb1b6; } QSlider::groove:horizontal { border: 1px solid #1d1d1c; height: 3px; background: #1d1d1c; margin: 0px; border-radius: 0px; } QSlider::handle:horizontal { background: #adb1b6; border: 1px solid #1d1d1c; width: 7px; height: 16px; margin: -8px 0; border-radius: 0px; } QSlider::groove:vertical { border: 1px solid #1d1d1c; width: 3px; background: #1d1d1c; margin: 0px; border-radius: 0px; } QSlider::handle:vertical { background: #adb1b6; border: 1px solid #1d1d1c; width: 16px; height: 7px; margin: 0 -8px; border-radius: 0px; } QmitkRenderWindowMenu { background-color: transparent; } /* this fixes the size of the icons in the stdMultiWidget */ QmitkRenderWindowMenu QToolButton, QmitkRenderWindowMenu QToolButton::menu-button { background-color: transparent; border: 0px solid #1d1d1c; border-radius: 0px; width: 15px; height: 15px; margin: 1px; padding: 0px; } QmitkRenderWindowMenu QToolButton:hover, QmitkRenderWindowMenu QToolButton::menu-button:hover { background-color: #adb1b6; border: 0px solid #3399cc; width: 15px; height: 15px; margin: 1px; padding: 0px; } QToolButton:checked, QToolButton:pressed, QToolButton::menu-button:pressed { color: #3399cc; border: 1px solid #3399cc; padding: 0px; } /* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ QToolButton::menu-indicator { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); top: -7px; left: -2px; /* shift it a bit */ } /* the subcontrols below are used only in the MenuButtonPopup mode */ QToolButton::menu-button { border: 1px transparent #1d1d1c; border-top-right-radius: 0px; border-bottom-right-radius: 0px; /* 16px width + 4px for border = 20px allocated above */ width: 16px; outline: none; } QToolButton::menu-arrow { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); } QToolButton::menu-arrow:open { border: 1px solid #1d1d1c; } QPushButton::menu-indicator { subcontrol-origin: padding; subcontrol-position: bottom right; left: 8px; } QTableView { border: 1px solid #1d1d1c; gridline-color: #323231; background-color: #1d1d1c; } QTableView, QHeaderView { border-radius: 0px; } QTableView::item:pressed, QListView::item:pressed, QTreeView::item:pressed { background: #3399cc; color: #1d1d1c; } QTableView::item:selected:active, QTreeView::item:selected:active, QListView::item:selected:active { background: #3399cc; color: #1d1d1c; } QHeaderView { background-color: #323231; border: 1px transparent; border-radius: 0px; margin: 0px; padding: 0px; } QHeaderView::section { background-color: #323231; color: #adb1b6; padding: 5px; border: 1px solid #1d1d1c; border-radius: 0px; text-align: left; } QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { border-top: 1px solid #1d1d1c; } QHeaderView::section::vertical { border-top: transparent; } QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { border-left: 1px solid #1d1d1c; } QHeaderView::section::horizontal { border-left: transparent; } QHeaderView::section:checked { color: #adb1b6; background-color: #323231; } /* sort indicator */ QHeaderView::down-arrow { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); } QHeaderView::up-arrow { image: url(:/org.blueberry.ui.qt/dark/up_arrow.png); } QTableCornerButton::section { background-color: #323231; border: 1px transparent #1d1d1c; border-radius: 0px; } QToolBox { color: #adb1b6; background-color: #323231; padding: 5px; border: 1px solid #adb1b6; border-bottom: 1px solid #adb1b6; } QToolBox::tab { color:#adb1b6; background-color: #323231; border: 1px solid #adb1b6; border-bottom: 1px solid #adb1b6; border-top-left-radius: 0px; border-top-right-radius: 0px; } QToolBox::tab:hover { color : #3399cc; } QToolBox::tab:selected { color :#1d1d1c; font-weight: normal; border: 1px solid #adb1b6; border-bottom: 1px solid #adb1b6; background: #adb1b6; frame: Box; midLineWidth:1; lineWidth:1; } QStatusBar::item { border: 0px transparent #1d1d1c; } QSplitter::handle { border: 1px dashed #1d1d1c; } QSplitter::handle:hover { background-color: #adb1b6; border: 1px solid #1d1d1c; } QSplitter::handle:horizontal { width: 1px; } QSplitter::handle:vertical { height: 1px; } QProgressBar { border: 1px solid #1d1d1c; border-radius: 0px; text-align: center; } QProgressBar::chunk { background-color: #3399cc; } QDateEdit { selection-background-color: #3399cc; selection-color: #1d1d1c; border: 1px solid #1d1d1c; border-radius: 0px; padding: 1px; min-width: 75px; } QDateEdit:on { padding-top: 3px; padding-left: 4px; } QDateEdit QAbstractItemView { background-color: #1d1d1c; border-radius: 0px; border: 1px solid #1d1d1c; selection-background-color: #3399cc; selection-color: #1d1d1c; } QDateEdit::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 15px; border-left-width: 0px; border-left-color: darkgray; border-left-style: solid; border-top-right-radius: 0px; border-bottom-right-radius: 0px; } QDateEdit::down-arrow { image: url(:/org.blueberry.ui.qt/dark/down_arrow_disabled.png); } QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus { image: url(:/org.blueberry.ui.qt/dark/down_arrow.png); }