Program Listing for File vtkMRMLLayerDMObjectEventObserver.h

Return to documentation for file (MRML/vtkMRMLLayerDMObjectEventObserver.h)

#pragma once

// LayerDM includes
#include "vtkSlicerLayerDMModuleMRMLExport.h"

// VTK includes
#include <vtkCommand.h>
#include <vtkObject.h>
#include <vtkSmartPointer.h>
#include <vtkWeakPointer.h>

// STL includes
#include <functional>
#include <map>
#include <set>
#include <variant>
#include <vector>

class vtkCallbackCommand;

class VTK_SLICER_LAYERDM_MODULE_MRML_EXPORT vtkMRMLLayerDMObjectEventObserver : public vtkObject
{
public:
  struct UpdateGuard;
  static vtkMRMLLayerDMObjectEventObserver* New();
  vtkTypeMacro(vtkMRMLLayerDMObjectEventObserver, vtkObject);

  bool UpdateObserver(vtkObject* prevObj, vtkObject* obj, unsigned long event = vtkCommand::ModifiedEvent);
  bool UpdateObserver(vtkObject* prevObj, vtkObject* obj, const std::vector<unsigned long>& events);

  void RemoveObserver(vtkObject* obj);

  void SetUpdateCallback(const std::function<void(vtkObject* node)>& callback);
  void SetUpdateCallback(const std::function<void(vtkObject* node, unsigned long eventId)>& callback);
  void SetUpdateCallback(const std::function<void(vtkObject* node, unsigned long eventId, void* callData)>& callback);

  bool SetBlocked(bool isBlocked);

  struct UpdateGuard
  {
    UpdateGuard(vtkMRMLLayerDMObjectEventObserver* obs);
    ~UpdateGuard();

  private:
    vtkMRMLLayerDMObjectEventObserver* m_obs;
    bool m_wasBlocked{};
  };

protected:
  vtkMRMLLayerDMObjectEventObserver();
  ~vtkMRMLLayerDMObjectEventObserver() override;

private:
  void AddObserver(vtkObject* obj, unsigned long event);

  vtkSmartPointer<vtkCallbackCommand> m_updateCommand{};
  std::map<vtkWeakPointer<vtkObject>, std::set<unsigned long>> m_obsMap{};

  std::variant<std::function<void(vtkObject* node)>,
               std::function<void(vtkObject* node, unsigned long eventId)>,
               std::function<void(vtkObject* node, unsigned long eventId, void* callData)>>
    m_callback;
  bool m_isBlocked;
};