Program Listing for File vtkMRMLLayerDMNodeReferenceObserver.h
↰ Return to documentation for file (MRML/vtkMRMLLayerDMNodeReferenceObserver.h)
#pragma once
// LayerDM includes
#include "vtkSlicerLayerDMModuleMRMLExport.h"
// VTK includes
#include <vtkObject.h>
#include <vtkSmartPointer.h>
#include <vtkWeakPointer.h>
// STL includes
#include <functional>
#include <map>
#include <set>
class vtkMRMLNode;
class vtkMRMLLayerDMObjectEventObserver;
class vtkMRMLScene;
class VTK_SLICER_LAYERDM_MODULE_MRML_EXPORT vtkMRMLLayerDMNodeReferenceObserver : public vtkObject
{
public:
using RefT = std::tuple<vtkWeakPointer<vtkMRMLNode>, std::string>;
enum Event
{
ReferenceAddedEvent = 0,
ReferenceRemovedEvent
};
static vtkMRMLLayerDMNodeReferenceObserver* New();
std::set<RefT> GetNodeToReferences(vtkMRMLNode* node) const;
std::set<RefT> GetNodeFromReferences(vtkMRMLNode* node) const;
int GetReferenceToSize() const;
int GetReferenceFromSize() const;
int GetNumberOfNodes() const;
using CallBackT = std::function<void(vtkMRMLNode*, vtkMRMLNode*, const std::string&, int eventType)>;
void SetReferenceModifiedCallBack(const CallBackT& modifiedCallback);
void SetScene(vtkMRMLScene* scene);
protected:
vtkMRMLLayerDMNodeReferenceObserver();
~vtkMRMLLayerDMNodeReferenceObserver() override = default;
private:
vtkMRMLLayerDMNodeReferenceObserver(const vtkMRMLLayerDMNodeReferenceObserver&);
void operator=(const vtkMRMLLayerDMNodeReferenceObserver&);
void UpdateFromScene();
void OnNodeRemoved(vtkMRMLNode* node);
void OnNodeAdded(vtkMRMLNode* node);
void OnReferenceAdded(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
void OnReferenceRemoved(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
void RemoveOutdatedReferences(vtkMRMLNode* fromNode);
void OnReferenceModified(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
static std::set<RefT> GetNodeReferencesFromScene(vtkMRMLNode* node);
void TriggerReferenceAdded(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role) const;
void TriggerReferenceRemoved(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role) const;
static void TriggerCallback(const CallBackT& callback, vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role, int eventType);
vtkWeakPointer<vtkMRMLScene> m_scene{};
vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver> m_obs{};
std::map<vtkSmartPointer<vtkMRMLNode>, std::set<RefT>> m_refTo{};
std::map<vtkSmartPointer<vtkMRMLNode>, std::set<RefT>> m_refFrom{};
std::set<vtkSmartPointer<vtkMRMLNode>> m_nodes{};
CallBackT m_onRefModified{};
};