35 #include <QTextStream> 42 bool _PlaceNewNodesOnTop,
44 : QAbstractItemModel(parent),
46 m_PlaceNewNodesOnTop(_PlaceNewNodesOnTop),
48 m_BlockDataStorageEvents(false),
49 m_AllowHierarchyChange(false)
76 if (!parent.isValid())
79 parentItem =
static_cast<TreeItem *
>(parent.internalPointer());
83 return createIndex(row, column, childItem);
98 return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable |
99 Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
103 return Qt::ItemIsDropEnabled;
114 if (!index.isValid())
115 return QModelIndex();
121 return QModelIndex();
123 return this->createIndex(parentItem->
GetIndex(), 0, parentItem);
129 return static_cast<TreeItem *>(index.internalPointer());
135 return Qt::CopyAction | Qt::MoveAction;
140 return Qt::CopyAction | Qt::MoveAction;
144 const QMimeData *
data, Qt::DropAction action,
int row,
int ,
const QModelIndex &
parent)
147 if (action == Qt::IgnoreAction)
153 bool returnValue =
false;
155 if (data->hasFormat(
"application/x-qabstractitemmodeldatalist"))
161 if (listOfItemsToDrop.empty())
186 bool isValidDragAndDropOperation(
true);
191 QList<TreeItem *>::iterator diIter;
192 for (diIter = listOfItemsToDrop.begin() + 1; diIter != listOfItemsToDrop.end(); diIter++)
194 if (firstParent != (*diIter)->
GetParent())
196 isValidDragAndDropOperation =
false;
207 isValidDragAndDropOperation = listOfItemsToDrop[0]->
GetParent() == parentItem;
211 isValidDragAndDropOperation = listOfItemsToDrop[0]->
GetParent() == dropItem;
217 QList<TreeItem *>::iterator diIter;
218 for (diIter = listOfItemsToDrop.begin(); diIter != listOfItemsToDrop.end(); diIter++)
222 while (tempItem !=
m_Root)
225 if (tempItem == *diIter)
227 isValidDragAndDropOperation =
false;
233 if (!isValidDragAndDropOperation)
234 return isValidDragAndDropOperation;
236 if (listOfItemsToDrop[0] != dropItem && isValidDragAndDropOperation)
244 QList<TreeItem *>::iterator diIter;
245 for (diIter = listOfItemsToDrop.begin(); diIter != listOfItemsToDrop.end(); diIter++)
257 this->beginRemoveRows(
260 this->endRemoveRows();
279 if ((row == -1 && dropItemModelIndex.row() == -1) || dropItemModelIndex.row() > parentItem->
GetChildCount())
286 this->beginInsertRows(dropItemModelIndex, dropIndex, dropIndex + listOfItemsToDrop.size() - 1);
290 this->beginInsertRows(parentModelIndex, dropIndex, dropIndex + listOfItemsToDrop.size() - 1);
293 for (diIter = listOfItemsToDrop.begin(); diIter != listOfItemsToDrop.end(); diIter++)
303 dataStorage->Remove(droppedNode);
304 dataStorage->Add(droppedNode, dropOntoNode);
323 this->endInsertRows();
329 else if (data->hasFormat(
"application/x-mitk-datanodes"))
333 int numberOfNodesDropped = 0;
337 foreach (node, dataNodeList)
344 if (basedata.IsNotNull())
349 numberOfNodesDropped++;
354 if (numberOfNodesDropped > 0)
365 QStringList types = QAbstractItemModel::mimeTypes();
366 types <<
"application/x-qabstractitemmodeldatalist";
367 types <<
"application/x-mitk-datanodes";
378 QMimeData *ret =
new QMimeData;
380 QString treeItemAddresses(
"");
381 QString dataNodeAddresses(
"");
383 QByteArray baTreeItemPtrs;
384 QByteArray baDataNodePtrs;
386 QDataStream dsTreeItemPtrs(&baTreeItemPtrs, QIODevice::WriteOnly);
387 QDataStream dsDataNodePtrs(&baDataNodePtrs, QIODevice::WriteOnly);
389 for (
int i = 0; i < indexes.size(); i++)
391 TreeItem *treeItem =
static_cast<TreeItem *
>(indexes.at(i).internalPointer());
393 dsTreeItemPtrs << reinterpret_cast<quintptr>(treeItem);
394 dsDataNodePtrs << reinterpret_cast<quintptr>(treeItem->
GetDataNode().GetPointer());
397 unsigned long long treeItemAddress =
reinterpret_cast<unsigned long long>(treeItem);
398 unsigned long long dataNodeAddress =
reinterpret_cast<unsigned long long>(treeItem->
GetDataNode().GetPointer());
399 QTextStream(&treeItemAddresses) << treeItemAddress;
400 QTextStream(&dataNodeAddresses) << dataNodeAddress;
402 if (i != indexes.size() - 1)
404 QTextStream(&treeItemAddresses) <<
",";
405 QTextStream(&dataNodeAddresses) <<
",";
411 ret->setData(
"application/x-qabstractitemmodeldatalist", QByteArray(treeItemAddresses.toLatin1()));
412 ret->setData(
"application/x-mitk-datanodes", QByteArray(dataNodeAddresses.toLatin1()));
426 QString nodeName = QString::fromStdString(dataNode->
GetName());
427 if (nodeName.isEmpty())
429 nodeName =
"unnamed";
432 if (role == Qt::DisplayRole)
434 else if (role == Qt::ToolTipRole)
436 else if (role == Qt::DecorationRole)
439 return nodeDescriptor->
GetIcon(dataNode);
441 else if (role == Qt::CheckStateRole)
451 return QVariant::fromValue<mitk::DataNode *>(dataNode);
457 bool QmitkDataStorageTreeModel::DicomPropertiesExists(
const mitk::DataNode &node)
const 459 bool propertiesExists =
false;
470 if (patientsName !=
nullptr && studyDescription !=
nullptr && seriesDescription !=
nullptr)
475 propertiesExists =
true;
480 if (patientsName_deprecated !=
nullptr && studyDescription_deprecated !=
nullptr && seriesDescription_deprecated !=
nullptr)
486 propertiesExists =
true;
490 return propertiesExists;
495 if (orientation == Qt::Horizontal && role == Qt::DisplayRole &&
m_Root)
510 dataStorage->RemoveObserver(m_DataStorageDeletedTag);
513 dataStorage->AddNodeEvent.RemoveListener(
517 dataStorage->ChangedNodeEvent.RemoveListener(
521 dataStorage->RemoveNodeEvent.RemoveListener(
533 rootDataNode->SetName(
"Data Manager");
535 this->beginResetModel();
536 this->endResetModel();
543 auto command = itk::SimpleMemberCommand<QmitkDataStorageTreeModel>::New();
545 m_DataStorageDeletedTag = dataStorage->AddObserver(itk::DeleteEvent(), command);
551 dataStorage->ChangedNodeEvent.AddListener(
555 dataStorage->RemoveNodeEvent.AddListener(
559 mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = dataStorage->GetSubset(
m_Predicate);
572 void QmitkDataStorageTreeModel::AddNodeInternal(
const mitk::DataNode *node)
584 parentTreeItem =
m_Root->
Find(parentDataNode);
588 parentTreeItem =
m_Root->
Find(parentDataNode);
594 index = this->createIndex(parentTreeItem->
GetIndex(), 0, parentTreeItem);
601 beginInsertRows(index, 0, 0);
606 int firstRowWithASiblingBelow = 0;
611 int siblingLayer = -1;
614 siblingNode->GetIntProperty(
"layer", siblingLayer);
616 if (nodeLayer > siblingLayer)
620 ++firstRowWithASiblingBelow;
622 beginInsertRows(index, firstRowWithASiblingBelow, firstRowWithASiblingBelow);
623 parentTreeItem->
InsertChild(
new TreeItem(const_cast<mitk::DataNode*>(node)), firstRowWithASiblingBelow);
641 this->AddNodeInternal(node);
649 void QmitkDataStorageTreeModel::RemoveNodeInternal(
const mitk::DataNode *node)
662 this->beginRemoveRows(parentIndex, treeItem->
GetIndex(), treeItem->
GetIndex());
665 std::vector<TreeItem *> children = treeItem->
GetChildren();
672 for (std::vector<TreeItem *>::iterator it = children.begin(); it != children.end(); it++)
692 this->RemoveNodeInternal(node);
704 QModelIndex
index = this->createIndex(treeItem->
GetIndex(), 0, treeItem);
707 emit dataChanged(index, index);
715 mitk::DataStorage::SetOfObjects::ConstPointer _Sources =
m_DataStorage.
Lock()->GetSources(node);
717 if (_Sources->Size() > 0)
718 dataNode = _Sources->front();
729 if (role == Qt::EditRole && !value.toString().isEmpty())
735 if (planarFigure !=
nullptr)
738 else if (role == Qt::CheckStateRole)
743 QVariant qcheckstate = index.data(Qt::CheckStateRole);
744 int checkstate = qcheckstate.toInt();
745 bool isVisible = bool(checkstate);
750 emit dataChanged(index, index);
765 std::vector<TreeItem *> vec;
768 int i = vec.size() - 1;
769 for (std::vector<TreeItem *>::const_iterator it = vec.begin(); it != vec.end(); ++it)
772 bool fixedLayer =
false;
774 if (!(dataNode->GetBoolProperty(
"fixedLayer", fixedLayer) && fixedLayer))
775 dataNode->SetIntProperty(
"layer", i);
789 vec.push_back(current);
796 return QModelIndex();
798 return this->createIndex(item->
GetIndex(), 0, item);
803 QList<mitk::DataNode::Pointer> res;
829 return QModelIndex();
836 return QList<TreeItem *>();
843 QList<TreeItem *> result;
847 quintptr treeItemPtr;
849 result.push_back(reinterpret_cast<TreeItem *>(treeItemPtr));
858 mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet =
m_DataStorage.
Lock()->GetAll();
865 for (
const auto& node: *_NodeSet)
867 this->AddNodeInternal(node);
static QMimeData * mimeDataFromModelIndexList(const QModelIndexList &indexes)
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
virtual bool InitializeViews(const BaseGeometry *geometry, RequestType type=REQUEST_UPDATE_ALL, bool preserveRoughOrientationInWorldSpace=false)
void SetDataStorage(mitk::DataStorage *_DataStorage)
virtual void SetNodeModified(const mitk::DataNode *node)
Data management class that handles 'was created by' relations.
itk::SmartPointer< T > Lock() const
Decorator class for mitk::DataNode.
void SetVisibility(bool visible, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="visible")
Convenience method for setting visibility properties (instances of BoolProperty)
void TreeToNodeSet(TreeItem *parent, QList< mitk::DataNode::Pointer > &vec) const
void AddChild(QmitkDataStorageTreeModelInternalItem *item)
QmitkDataStorageTreeModel(mitk::DataStorage *_DataStorage, bool _PlaceNewNodesOnTop=false, QObject *parent=nullptr)
QModelIndex parent(const QModelIndex &index) const override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
bool m_PlaceNewNodesOnTop
void AdjustLayerProperty()
void SetAllowHierarchyChange(bool allowHierarchyChange)
Set whether to allow hierarchy changes by dragging and dropping.
QModelIndex GetIndex(const mitk::DataNode *) const
QModelIndex IndexFromTreeItem(TreeItem *) const
std::string MITKCORE_EXPORT GeneratePropertyNameForDICOMTag(unsigned int group, unsigned int element)
virtual QList< mitk::DataNode::Pointer > GetNodeSet() const
Qt::DropActions supportedDropActions() const override
static QList< mitk::DataNode * > ToDataNodePtrList(const QByteArray &ba)
const mitk::DataStorage::Pointer GetDataStorage() const
bool m_BlockDataStorageEvents
Flag to block the data storage events if nodes are added/removed by this class.
bool m_AllowHierarchyChange
Qt::ItemFlags flags(const QModelIndex &index) const override
static const QString DataNodePtrs
mitk::DataNode::Pointer GetNode(const QModelIndex &index) const
bool GetIntProperty(const char *propertyKey, int &intValue, const mitk::BaseRenderer *renderer=nullptr) const
Convenience access method for int properties (instances of IntProperty)
virtual void AddNode(const mitk::DataNode *node)
void SetPlaceNewNodesOnTop(bool _PlaceNewNodesOnTop)
itk::SmartPointer< Self > Pointer
QmitkNodeDescriptor * GetDescriptor(const mitk::DataNode *node) const
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
virtual std::string GetValueAsString() const
Abstract base class for properties.
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role=Qt::EditRole) override
bool IsVisible(const mitk::BaseRenderer *renderer, const char *propertyKey="visible", bool defaultIsOn=true) const
Convenience access method for visibility properties (instances of BoolProperty). Return value is the ...
mitk::DataNode::Pointer GetDataNode() const
mitk::DataStorage::Pointer m_DataStorage
QmitkDataStorageTreeModelInternalItem * GetChild(int index) const
static RenderingManager * GetInstance()
mitk::WeakPointer< mitk::DataStorage > m_DataStorage
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
bool IsExpired() const noexcept
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void SetDataStorageDeleted()
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QmitkDataStorageTreeModelInternalItem * GetParent() const
int GetChildCount() const
TreeItem * TreeItemFromIndex(const QModelIndex &index) const
QmitkDataStorageTreeModelInternalItem * Find(const mitk::DataNode *_DataNode) const
mitk::NodePredicateBase::Pointer m_Predicate
void SetStringProperty(const char *propertyKey, const char *string, const mitk::BaseRenderer *renderer=nullptr)
Convenience method for setting string properties (instances of StringProperty)
virtual void RemoveNode(const mitk::DataNode *node)
Qt::DropActions supportedDragActions() const override
QList< TreeItem * > ToTreeItemPtrList(const QMimeData *mimeData)
QStringList mimeTypes() const override
QmitkDataStorageTreeModelInternalItem TreeItem
std::vector< QmitkDataStorageTreeModelInternalItem * > GetChildren() const
virtual QIcon GetIcon(const mitk::DataNode *node) const
mitk::DataNode * GetParentNode(const mitk::DataNode *node) const
QMimeData * mimeData(const QModelIndexList &indexes) const override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
void TreeToVector(TreeItem *parent, std::vector< TreeItem *> &vec) const
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
static QmitkNodeDescriptorManager * GetInstance()
Class for nodes of the DataTree.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
bool GetName(std::string &nodeName, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="name") const
Convenience access method for accessing the name of an object (instance of StringProperty with proper...
void nodeVisibilityChanged()
static const QString DataStorageTreeItemPtrs
~QmitkDataStorageTreeModel() override
void InsertChild(QmitkDataStorageTreeModelInternalItem *item, int index=-1)
void RemoveChild(QmitkDataStorageTreeModelInternalItem *item)