diff --git a/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.cpp b/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.cpp index 1c4ccd9994..cff28799ac 100644 --- a/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.cpp +++ b/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.cpp @@ -1,128 +1,234 @@ /*=================================================================== 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 "QmitkDataManagerLightView.h" #include "mitkNodePredicateDataType.h" #include +#include +#include +#include +#include +#include const std::string QmitkDataManagerLightView::VIEW_ID = "org.mitk.views.datamanagerlight"; struct QmitkDataManagerLightViewData { // static mitk::NodePredicateBase::Pointer m_Predicate; QIcon m_ItemIcon; // data QList m_DataNodes; int m_CurrentIndex; // widget QListWidget* m_ListWidget; QLabel* m_ImageInfoLabel; + QPushButton* m_RemoveButton; }; QmitkDataManagerLightView::QmitkDataManagerLightView() : d( new QmitkDataManagerLightViewData ) { d->m_Predicate = mitk::NodePredicateDataType::New("Image"); d->m_ItemIcon = QIcon(":/org.mitk.gui.qt.datamanagerlight/Image_24.png"); d->m_CurrentIndex = -1; d->m_ListWidget = 0; d->m_ImageInfoLabel = 0; + d->m_RemoveButton = 0; } QmitkDataManagerLightView::~QmitkDataManagerLightView() { delete d; } void QmitkDataManagerLightView::NodeAdded(const mitk::DataNode *node) { if( d->m_Predicate->CheckNode(node) ) { mitk::DataNode* nonConstNode = const_cast(node); d->m_DataNodes.append(nonConstNode); d->m_ListWidget->addItem( new QListWidgetItem( d->m_ItemIcon, QString::fromStdString( node->GetName() ) ) ); } } void QmitkDataManagerLightView::NodeRemoved(const mitk::DataNode *node) +{ + this->RemoveNode( const_cast(node) ); +} + +void QmitkDataManagerLightView::RemoveNode(mitk::DataNode *node) { mitk::DataNode* nonConstNode = const_cast(node); int index = d->m_DataNodes.indexOf(nonConstNode); if( index >= 0 ) { MITK_INFO << "removing node at: " << index; QListWidgetItem* item = d->m_ListWidget->takeItem(index); delete item; d->m_DataNodes.removeAt(index); MITK_INFO << "item deleted"; } } void QmitkDataManagerLightView::CreateQtPartControl(QWidget* parent) { - QPushButton* loadButton = new QPushButton("Load image"); + QPushButton* loadButton = new QPushButton(QIcon(":/org.mitk.gui.qt.datamanagerlight/Load_48.png"), "Load"); + d->m_RemoveButton = new QPushButton(QIcon(":/org.mitk.gui.qt.datamanagerlight/Remove_48.png"), "Remove"); + d->m_RemoveButton->setEnabled(false); d->m_ListWidget = new QListWidget; d->m_ImageInfoLabel = new QLabel; QGridLayout* layout = new QGridLayout; layout->addWidget( loadButton, 0,0 ); - layout->addWidget( d->m_ImageInfoLabel, 1,0 ); - layout->addWidget( d->m_ListWidget, 2,0 ); + layout->addWidget( d->m_RemoveButton, 0,1 ); + layout->addWidget( d->m_ImageInfoLabel, 1,0, 1, 2 ); + layout->addWidget( d->m_ListWidget, 2,0,1,2 ); parent->setLayout(layout); connect(d->m_ListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(on_DataItemList_currentRowChanged(int)) ); - this->EvaluateLabelString(); + connect(loadButton, SIGNAL(pressed()), this, SLOT(on_Load_pressed()) ); + connect(d->m_RemoveButton, SIGNAL(pressed()), this, SLOT(on_Remove_pressed()) ); + + this->ListSelectionChanged(); } void QmitkDataManagerLightView::SetFocus() { } void QmitkDataManagerLightView::on_DataItemList_currentRowChanged(int currentRow) { MITK_INFO << "DataItemList currentRowChanged: " << currentRow; Q_UNUSED(currentRow) - this->EvaluateLabelString(); + this->ListSelectionChanged(); } -void QmitkDataManagerLightView::EvaluateLabelString() +void QmitkDataManagerLightView::ListSelectionChanged() { d->m_CurrentIndex = d->m_ListWidget->currentRow(); MITK_INFO << "the currently selected index: " << d->m_CurrentIndex; QString newLabelText = "Current patient: "; if( d->m_CurrentIndex >= 0 ) { // TODO WHERE IS THE PATIENT NAME? std::string name = d->m_DataNodes.at(d->m_CurrentIndex)->GetName(); newLabelText.append( QString("%1" ).arg( QString::fromStdString(name) ) ); + d->m_RemoveButton->setEnabled(true); } else { newLabelText.append("Unknown"); + d->m_RemoveButton->setEnabled(false); } d->m_ImageInfoLabel->setText(newLabelText); } + +void QmitkDataManagerLightView::on_Load_pressed() +{ + MITK_INFO << "on_Load_pressed"; + QStringList fileNames = QFileDialog::getOpenFileNames(NULL, "Load data", "", mitk::CoreObjectFactory::GetInstance()->GetFileExtensions()); + for ( QStringList::Iterator it = fileNames.begin(); it != fileNames.end(); ++it ) + { + FileOpen((*it).toAscii(), 0); + } +} + +void QmitkDataManagerLightView::FileOpen( const char * fileName, mitk::DataNode* parentNode ) +{ + mitk::DataNodeFactory::Pointer factory = mitk::DataNodeFactory::New(); + + try + { + factory->SetFileName( fileName ); + + QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) ); + + factory->Update(); + + for ( unsigned int i = 0 ; i < factory->GetNumberOfOutputs( ); ++i ) + { + mitk::DataNode::Pointer node = factory->GetOutput( i ); + if ( ( node.IsNotNull() ) && ( node->GetData() != NULL ) ) + { + this->GetDataStorage()->Add(node, parentNode); + mitk::BaseData::Pointer basedata = node->GetData(); + mitk::RenderingManager::GetInstance()->InitializeViews( + basedata->GetTimeSlicedGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); + //mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + } + } + } + catch ( itk::ExceptionObject & ex ) + { + MITK_ERROR << "Exception during file open: " << ex; + } + + QApplication::restoreOverrideCursor(); +} + +void QmitkDataManagerLightView::on_Remove_pressed() +{ + d->m_CurrentIndex = d->m_ListWidget->currentRow(); + MITK_INFO << "the currently selected index: " << d->m_CurrentIndex; + + mitk::DataNode* node = d->m_DataNodes.at(d->m_CurrentIndex); + QString question = tr("Do you really want to remove "); + // TODO patient name? + question.append( QString::fromStdString( node->GetName() ) ); + question.append(" ?"); + + QMessageBox::StandardButton answerButton = QMessageBox::question( NULL + , tr("DataManagerLight") + , question + , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + + if(answerButton == QMessageBox::Yes) + { + this->GetDataStorage()->Remove(node); + this->GlobalReinit(); + } +} + +void QmitkDataManagerLightView::GlobalReinit() +{ + mitk::IRenderWindowPart* renderWindow = this->GetRenderWindowPart(); + + // no render window available + if (renderWindow == NULL) return; + + // get all nodes that have not set "includeInBoundingBox" to false + mitk::NodePredicateNot::Pointer pred + = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox" + , mitk::BoolProperty::New(false))); + + mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred); + // calculate bounding geometry of these nodes + mitk::TimeSlicedGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs, "visible"); + + // initialize the views to the bounding geometry + renderWindow->GetRenderingManager()->InitializeViews(bounds); +} diff --git a/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.h b/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.h index 5c8c95cb2d..29a5b24aa3 100644 --- a/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.h +++ b/Plugins/org.mitk.gui.qt.datamanagerlight/src/internal/QmitkDataManagerLightView.h @@ -1,79 +1,84 @@ /*=================================================================== 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 QmitkDataManagerLightView_H_ #define QmitkDataManagerLightView_H_ /// Qmitk #include struct QmitkDataManagerLightViewData; /// /// \brief Data management view with reduced functions ("light") /// class QmitkDataManagerLightView : public QmitkAbstractView { Q_OBJECT public: static const std::string VIEW_ID; // = "org.mitk.extapp.defaultperspective" /// /// \brief Standard ctor. /// QmitkDataManagerLightView(); /// /// \brief Standard dtor. /// virtual ~QmitkDataManagerLightView(); /// /// add the node to the list ... /// virtual void NodeAdded(const mitk::DataNode* node); /// /// remove the node /// virtual void NodeRemoved(const mitk::DataNode* node); protected slots: void on_DataItemList_currentRowChanged ( int currentRow ); + void on_Remove_pressed(); + void on_Load_pressed(); protected: /// /// \brief Create the view here. /// virtual void CreateQtPartControl(QWidget* parent); /// /// evaluate the new label string /// - void EvaluateLabelString(); + void ListSelectionChanged(); + void FileOpen(const char *fileName, mitk::DataNode *parentNode); + void RemoveNode(mitk::DataNode *node); + void GlobalReinit(); /// /// focus on load image /// void SetFocus(); private: QmitkDataManagerLightViewData* d; }; #endif /*QmitkDataManagerLightView_H_*/