Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkToolWorkingDataSelectionBox.h"
00019
00020
00021 QmitkToolWorkingDataSelectionBox::QmitkToolWorkingDataSelectionBox(QWidget* parent, mitk::DataStorage* storage)
00022 :QListWidget(parent),
00023 m_SelfCall(false),
00024 m_LastSelectedReferenceData(NULL),
00025 m_ToolGroupsForFiltering("default"),
00026 m_DisplayOnlyDerivedNodes(true)
00027 {
00028 m_ToolManager = mitk::ToolManager::New( storage );
00029
00030 QListWidget::setSelectionMode( QListWidget::MultiSelection );
00031 QListWidget::setDragDropMode(QListWidget::InternalMove);
00032
00033 connect( this, SIGNAL(itemSelectionChanged()), this, SLOT(OnWorkingDataSelectionChanged()) );
00034
00035 m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerReferenceDataModified );
00036 m_ToolManager->WorkingDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerWorkingDataModified );
00037 }
00038
00039 QmitkToolWorkingDataSelectionBox::~QmitkToolWorkingDataSelectionBox()
00040 {
00041
00042 }
00043
00044 mitk::DataStorage* QmitkToolWorkingDataSelectionBox::GetDataStorage()
00045 {
00046 return m_ToolManager->GetDataStorage();
00047 }
00048
00049 void QmitkToolWorkingDataSelectionBox::SetDataStorage(mitk::DataStorage& storage)
00050 {
00051 m_ToolManager->SetDataStorage(storage);
00052 }
00053
00054
00055 mitk::ToolManager* QmitkToolWorkingDataSelectionBox::GetToolManager()
00056 {
00057 return m_ToolManager;
00058 }
00059
00060 void QmitkToolWorkingDataSelectionBox::SetToolManager(mitk::ToolManager& newManager)
00061 {
00062 m_ToolManager->ReferenceDataChanged -= mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerReferenceDataModified );
00063 m_ToolManager->WorkingDataChanged -= mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerWorkingDataModified );
00064
00065 m_ToolManager = &newManager;
00066
00067 m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerReferenceDataModified );
00068 m_ToolManager->WorkingDataChanged += mitk::MessageDelegate<QmitkToolWorkingDataSelectionBox>( this, &QmitkToolWorkingDataSelectionBox::OnToolManagerWorkingDataModified );
00069
00070 UpdateDataDisplay();
00071 }
00072
00073 void QmitkToolWorkingDataSelectionBox::OnWorkingDataSelectionChanged()
00074 {
00075 static mitk::ToolManager::DataVectorType previouslySelectedNodes;
00076
00077 mitk::ToolManager::DataVectorType selection = this->GetSelectedNodes();
00078
00079 previouslySelectedNodes = selection;
00080
00081 if (selection.size() >0)
00082 {
00083 const mitk::DataNode* node = selection[0];
00084 emit WorkingNodeSelected(node);
00085 }
00086 else
00087 {
00088 emit WorkingNodeSelected(NULL);
00089 }
00090
00091 m_SelfCall = true;
00092 m_ToolManager->SetWorkingData( selection );
00093 m_SelfCall = false;
00094 }
00095
00096 void QmitkToolWorkingDataSelectionBox::OnToolManagerWorkingDataModified()
00097 {
00098 if (m_SelfCall) return;
00099
00100 const mitk::DataNode* node = m_ToolManager->GetWorkingData(0);
00101 emit WorkingNodeSelected(node);
00102
00103 UpdateDataDisplay();
00104 }
00105
00106 void QmitkToolWorkingDataSelectionBox::OnToolManagerReferenceDataModified()
00107 {
00108 if ( m_ToolManager->GetReferenceData(0) != m_LastSelectedReferenceData )
00109 {
00110 m_ToolManager->SetWorkingData(NULL);
00111 UpdateDataDisplay();
00112
00113 m_LastSelectedReferenceData = m_ToolManager->GetReferenceData(0);
00114 }
00115 }
00116
00117 void QmitkToolWorkingDataSelectionBox::UpdateDataDisplay()
00118 {
00119
00120
00121 QListWidget::clear();
00122 m_Node.clear();
00123
00124
00125 mitk::ToolManager::DataVectorType allObjects = GetAllNodes( false );
00126 for ( mitk::ToolManager::DataVectorType::const_iterator objectIter = allObjects.begin();
00127 objectIter != allObjects.end();
00128 ++objectIter)
00129 {
00130 mitk::DataNode* node = *objectIter;
00131
00132 if (node)
00133 {
00134
00135 std::string name = node->GetName();
00136 float rgb[3]; rgb[0] = 1.0; rgb[1] = 0.0; rgb[2] = 0.0;
00137 node->GetColor(rgb);
00138 QRgb qrgb = qRgb( (int)(rgb[0]*255.0), (int)(rgb[1]*255.0), (int)(rgb[2]*255.0) );
00139
00140 QPixmap pixmap(25,18);
00141 pixmap.fill(QColor(qrgb));
00142
00143
00144 QListWidgetItem* newItem = new QListWidgetItem();
00145 QString qname = QString::fromLocal8Bit(name.c_str());
00146
00147
00148 newItem->setText(qname);
00149 newItem->setIcon(QIcon(pixmap));
00150
00151 this->addItem(newItem);
00152
00153 m_Node.insert( std::make_pair( newItem, node ) );
00154 }
00155 }
00156 }
00157
00158 mitk::ToolManager::DataVectorType QmitkToolWorkingDataSelectionBox::GetSelectedNodes()
00159 {
00160 mitk::ToolManager::DataVectorType result;
00161
00162 QList<QListWidgetItem *> items;
00163 for (int j=0; j<this->count(); j++)
00164 {
00165 if (this->item(j)->isSelected())
00166 items.append(this->item(j));
00167 }
00168
00169 for (int i=0; i<items.size();++i)
00170 {
00171
00172 QListWidgetItem* item = items.at(i);
00173 if (item)
00174 {
00175 ItemNodeMapType::iterator it = m_Node.find(item);
00176 if (it != m_Node.end())
00177 {
00178 mitk::DataNode::Pointer node = it->second;
00179 if (node)
00180 result.push_back(node);
00181 }
00182 }
00183 }
00184
00185 return result;
00186 }
00187
00188 mitk::DataNode* QmitkToolWorkingDataSelectionBox::GetSelectedNode()
00189 {
00190 QListWidgetItem* item = QListWidget::selectedItems().first();
00191 if (item)
00192 {
00193 ItemNodeMapType::iterator iter = m_Node.find(item);
00194 if ( iter != m_Node.end() )
00195 {
00196 return iter->second;
00197 }
00198 }
00199
00200 return NULL;
00201 }
00202
00203 mitk::ToolManager::DataVectorType QmitkToolWorkingDataSelectionBox::GetAllNodes( bool onlyDerivedFromOriginal )
00204 {
00205 mitk::DataStorage* dataStorage = m_ToolManager->GetDataStorage();
00206 if (!dataStorage)
00207 {
00208 return mitk::ToolManager::DataVectorType();
00209 }
00210
00218 std::vector< mitk::NodePredicateBase::ConstPointer > m_Predicates;
00219 mitk::NodePredicateBase::ConstPointer completePredicate = NULL;
00220 bool rebuildNeeded = true;
00221 if (rebuildNeeded)
00222 {
00223 m_Predicates.clear();
00224
00225 const mitk::ToolManager::ToolVectorTypeConst allTools = m_ToolManager->GetTools();
00226
00227 for ( mitk::ToolManager::ToolVectorTypeConst::const_iterator iter = allTools.begin();
00228 iter != allTools.end();
00229 ++iter )
00230 {
00231 const mitk::Tool* tool = *iter;
00232
00233 if ( (m_ToolGroupsForFiltering.empty()) || ( m_ToolGroupsForFiltering.find( tool->GetGroup() ) != std::string::npos ) ||
00234 ( m_ToolGroupsForFiltering.find( tool->GetName() ) != std::string::npos )
00235 )
00236 {
00237 if (completePredicate.IsNotNull())
00238 {
00239
00240 m_Predicates.push_back( mitk::NodePredicateOr::New( completePredicate, tool->GetWorkingDataPreference()).GetPointer() );
00241
00242 completePredicate = m_Predicates.back();
00243 }
00244 else
00245 {
00246 completePredicate = tool->GetWorkingDataPreference();
00247 }
00248 }
00249 }
00250 }
00251
00252
00253 mitk::DataStorage::SetOfObjects::ConstPointer allObjects;
00254
00261 if ( onlyDerivedFromOriginal )
00262 {
00263 mitk::DataNode* sourceNode( m_ToolManager->GetReferenceData(0) );
00264 if (sourceNode)
00265 {
00266 allObjects = dataStorage->GetDerivations( sourceNode, completePredicate, false );
00267 }
00268 else
00269 {
00270 allObjects = mitk::DataStorage::SetOfObjects::New();
00271 }
00272 }
00273 else
00274 {
00275 if (completePredicate)
00276 {
00277 allObjects = dataStorage->GetSubset( completePredicate );
00278 }
00279 else
00280 {
00281 allObjects = dataStorage->GetAll();
00282 }
00283 }
00284
00285 m_Predicates.clear();
00286 completePredicate = NULL;
00287
00288 mitk::ToolManager::DataVectorType resultVector;
00289
00290 for ( mitk::DataStorage::SetOfObjects::const_iterator objectIter = allObjects->begin();
00291 objectIter != allObjects->end();
00292 ++objectIter )
00293 {
00294 mitk::DataNode* node = (*objectIter).GetPointer();
00295 resultVector.push_back( node );
00296 }
00297
00298 return resultVector;
00299 }