29 m_RenderWindowLayerController = std::make_unique<mitk::RenderWindowLayerController>();
48 for (
const auto renderer : m_ControlledRenderer)
56 auto baseRenderer = m_BaseRenderer.
Lock();
57 AddNodeInternal(node, baseRenderer);
63 auto item = m_Root->
Find(node);
68 if (
nullptr == parentItem)
73 auto index = createIndex(item->GetIndex(), 0, item);
80 RemoveNodeInternal(node);
85 auto item = GetItemByIndex(parent);
88 item = item->GetChild(row);
96 return createIndex(row, column, item);
101 auto item = GetItemByIndex(parent);
104 item = item->GetParent();
109 return QModelIndex();
114 return QModelIndex();
117 return createIndex(item->GetIndex(), 0, item);
122 auto item = GetItemByIndex(parent);
128 return item->GetChildCount();
149 auto baseRenderer = m_BaseRenderer.
Lock();
151 if (!index.isValid() ||
this != index.model())
156 auto item = GetItemByIndex(index);
162 auto dataNode = item->GetDataNode();
163 if (
nullptr == dataNode)
168 if (Qt::CheckStateRole == role)
170 bool visibility =
false;
171 dataNode->GetVisibility(visibility, baseRenderer);
178 return Qt::Unchecked;
181 else if (Qt::DisplayRole == role)
183 return QVariant(QString::fromStdString(dataNode->GetName()));
185 else if (Qt::ToolTipRole == role)
187 return QVariant(
"Name of the data node.");
189 else if (Qt::DecorationRole == role)
192 return nodeDescriptor->
GetIcon(dataNode);
198 return QVariant::fromValue<mitk::DataNode*>(dataNode);
215 auto baseRenderer = m_BaseRenderer.
Lock();
217 if (!index.isValid() ||
this != index.model())
222 auto item = GetItemByIndex(index);
228 auto dataNode = item->GetDataNode();
229 if (
nullptr == dataNode)
234 if (Qt::EditRole == role && !value.toString().isEmpty())
236 dataNode->SetName(value.toString().toStdString().c_str());
237 emit dataChanged(index, index);
240 if (Qt::CheckStateRole == role)
242 Qt::CheckState newCheckState =
static_cast<Qt::CheckState
>(value.toInt());
243 bool isVisible = newCheckState;
244 dataNode->SetVisibility(isVisible, baseRenderer);
246 emit dataChanged(index, index);
255 if (
this != index.model())
257 return Qt::NoItemFlags;
260 if (!index.isValid())
262 return Qt::ItemIsDropEnabled;
265 auto item = GetItemByIndex(index);
268 return Qt::NoItemFlags;
271 const auto dataNode = item->GetDataNode();
274 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
277 return Qt::NoItemFlags;
282 return Qt::CopyAction | Qt::MoveAction;
287 return Qt::CopyAction | Qt::MoveAction;
292 QStringList types = QAbstractItemModel::mimeTypes();
299 QMimeData*
mimeData =
new QMimeData();
300 QByteArray encodedData;
302 QDataStream stream(&encodedData, QIODevice::WriteOnly);
304 for (
const auto&
index : indexes)
309 stream << reinterpret_cast<quintptr>(dataNode);
324 auto baseRenderer = m_BaseRenderer.
Lock();
326 if (action == Qt::IgnoreAction)
336 if (!parent.isValid())
343 if (
nullptr != dataNode)
349 for (
const auto& dataNode : dataNodeList)
351 m_RenderWindowLayerController->MoveNodeToPosition(dataNode, layer, baseRenderer);
356 AdjustLayerProperty();
362 m_RenderWindowLayerController->SetControlledRenderer(controlledRenderer);
363 m_ControlledRenderer = controlledRenderer;
373 for (
const auto& renderer : controlledRenderer)
375 if (
nullptr == renderer)
380 auto allDataNodes = dataStorage->GetAll();
381 for (
const auto& dataNode : *allDataNodes)
391 if (m_BaseRenderer == baseRenderer)
398 m_BaseRenderer = baseRenderer;
410 return m_BaseRenderer.
Lock().GetPointer();
413 void QmitkRenderWindowDataStorageTreeModel::ResetTree()
416 if (
nullptr != m_Root)
422 rootDataNode->SetName(
"Data Storage");
427 void QmitkRenderWindowDataStorageTreeModel::UpdateModelData()
434 auto baseRenderer = m_BaseRenderer.
Lock();
437 auto filteredDataNodes = dataStorage->GetSubset(combinedNodePredicate);
438 for (
const auto& dataNode : *filteredDataNodes)
440 AddNodeInternal(dataNode, baseRenderer);
446 void QmitkRenderWindowDataStorageTreeModel::AdjustLayerProperty()
453 auto baseRenderer = m_BaseRenderer.
Lock();
455 std::vector<QmitkDataStorageTreeModelInternalItem*> treeAsVector;
456 TreeToVector(m_Root, treeAsVector);
458 int i = treeAsVector.size() - 1;
459 for (
auto it = treeAsVector.begin(); it != treeAsVector.end(); ++it)
461 auto dataNode = (*it)->GetDataNode();
462 dataNode->SetIntProperty(
"layer", i, baseRenderer);
473 TreeToVector(item, treeAsVector);
474 treeAsVector.push_back(item);
480 if (
nullptr == dataNode
482 ||
nullptr != m_Root->
Find(dataNode))
488 auto parentItem = m_Root;
490 auto parentDataNode = GetParentNode(dataNode);
492 if (
nullptr != parentDataNode)
494 parentItem = m_Root->
Find(parentDataNode);
495 if (
nullptr == parentItem)
499 parentItem = m_Root->
Find(parentDataNode);
500 if (
nullptr == parentItem)
508 index = createIndex(parentItem->GetIndex(), 0, parentItem);
511 int firstRowWithASiblingBelow = 0;
514 for (
const auto& siblingItem : parentItem->GetChildren())
516 int siblingLayer = -1;
517 auto siblingNode = siblingItem->GetDataNode();
518 if (
nullptr != siblingNode)
520 siblingNode->GetIntProperty(
"layer", siblingLayer, renderer);
522 if (nodeLayer > siblingLayer)
526 ++firstRowWithASiblingBelow;
529 beginInsertRows(index, firstRowWithASiblingBelow, firstRowWithASiblingBelow);
531 parentItem->InsertChild(newNode, firstRowWithASiblingBelow);
535 void QmitkRenderWindowDataStorageTreeModel::RemoveNodeInternal(
const mitk::DataNode* dataNode)
537 if (
nullptr == dataNode
538 ||
nullptr == m_Root)
543 auto item = m_Root->
Find(dataNode);
550 auto parentIndex = GetIndexByItem(parentItem);
552 auto children = item->GetChildren();
553 beginRemoveRows(parentIndex, item->GetIndex(), item->GetIndex());
554 parentItem->RemoveChild(item);
558 if (!children.empty())
575 if (sources->empty())
580 return sources->front();
597 return QModelIndex();
600 return createIndex(item->
GetIndex(), 0, item);
itk::SmartPointer< T > Lock() const
QStringList mimeTypes() const override
MITKRENDERWINDOWMANAGER_EXPORT void SetRenderWindowProperties(mitk::DataNode *dataNode, const BaseRenderer *renderer)
Set renderer-specific properties to mark a data node as 'managed by the specific renderer'. In order for a renderer to manage a data node, the 'fixedLayer' property has to be set for the given renderer. Additionally, the 'visible' and the 'layer' property are set and allow to individually render a set of nodes with a specific renderer. The last two mentioned properties are set so that they initially have the same value as the corresponding global property.
Decorator class for mitk::DataNode.
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
Qt::ItemFlags flags(const QModelIndex &index) const override
Organizes the rendering process.
Qt::DropActions supportedDragActions() const override
static QList< mitk::DataNode * > ToDataNodePtrList(const QByteArray &ba)
MITKRENDERWINDOWMANAGER_EXPORT NodePredicateAnd::Pointer GetRenderWindowPredicate(const BaseRenderer *renderer)
Helper function to get a node predicate that can be used to filter render window specific data nodes...
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
static const QString DataNodePtrs
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
bool GetIntProperty(const char *propertyKey, int &intValue, const mitk::BaseRenderer *renderer=nullptr) const
Convenience access method for int properties (instances of IntProperty)
std::vector< BaseRenderer * > RendererVector
itk::SmartPointer< Self > Pointer
QmitkNodeDescriptor * GetDescriptor(const mitk::DataNode *node) const
QModelIndex parent(const QModelIndex &parent) const override
Qt::DropActions supportedDropActions() const override
void NodeAdded(const mitk::DataNode *node) override
See 'QmitkAbstractDataStorageModel'.
mitk::NodePredicateBase::ConstPointer m_NodePredicate
void SetCurrentRenderer(mitk::BaseRenderer *baseRenderer)
QmitkDataStorageTreeModelInternalItem * GetChild(int index) const
mitk::BaseRenderer * GetCurrentRenderer() const
static RenderingManager * GetInstance()
QVariant data(const QModelIndex &index, int role) const override
bool IsExpired() const noexcept
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void NodeRemoved(const mitk::DataNode *node) override
See 'QmitkAbstractDataStorageModel'.
void NodePredicateChanged() override
See 'QmitkAbstractDataStorageModel'.
QmitkRenderWindowDataStorageTreeModel(QObject *parent=nullptr)
void DataStorageChanged() override
See 'QmitkAbstractDataStorageModel'.
QmitkDataStorageTreeModelInternalItem * GetParent() const
void NodeChanged(const mitk::DataNode *node) override
See 'QmitkAbstractDataStorageModel'.
int GetChildCount() const
QMimeData * mimeData(const QModelIndexList &indexes) const override
void RequestUpdate(vtkRenderWindow *renderWindow)
void SetControlledRenderer(mitk::RenderWindowLayerUtilities::RendererVector controlledRenderer)
QmitkDataStorageTreeModelInternalItem * Find(const mitk::DataNode *_DataNode) const
virtual QIcon GetIcon(const mitk::DataNode *node) const
static QmitkNodeDescriptorManager * GetInstance()
Class for nodes of the DataTree.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
mitk::WeakPointer< mitk::DataStorage > m_DataStorage