Program Listing for File vtkMRMLLayerDMPipelineFactory.h

Return to documentation for file (MRMLDM/vtkMRMLLayerDMPipelineFactory.h)

#pragma once

#include "vtkSlicerLayerDMModuleMRMLDisplayableManagerExport.h"

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

// STL includes
#include <functional>
#include <vector>

class vtkMRMLAbstractViewNode;
class vtkMRMLLayerDMObjectEventObserver;
class vtkMRMLLayerDMPipelineCreatorI;
class vtkMRMLLayerDMPipelineI;
class vtkMRMLNode;

class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMPipelineFactory : public vtkObject
{
public:
  enum Events
  {
    // Triggered when the factory creates a non-empty pipeline
    PipelineAboutToBeCreatedEvent = vtkCommand::UserEvent + 1
  };

  static vtkMRMLLayerDMPipelineFactory* New();
  vtkTypeMacro(vtkMRMLLayerDMPipelineFactory, vtkObject);

  static vtkSmartPointer<vtkMRMLLayerDMPipelineFactory> GetInstance();

  void AddPipelineCreator(const vtkSmartPointer<vtkMRMLLayerDMPipelineCreatorI>& creator);

  vtkSmartPointer<vtkMRMLLayerDMPipelineCreatorI> AddPipelineCreator(
    const std::function<vtkSmartPointer<vtkMRMLLayerDMPipelineI>(vtkMRMLAbstractViewNode*, vtkMRMLNode*)>& creatorCallBack,
    int priority = 0);

  void RemovePipelineCreator(const vtkSmartPointer<vtkMRMLLayerDMPipelineCreatorI>& creator);

  bool ContainsPipelineCreator(const vtkSmartPointer<vtkMRMLLayerDMPipelineCreatorI>& creator) const;

  vtkSmartPointer<vtkMRMLLayerDMPipelineI> CreatePipeline(vtkMRMLAbstractViewNode* viewNode, vtkMRMLNode* node);

  vtkMRMLAbstractViewNode* GetLastViewNode() const;
  vtkMRMLNode* GetLastNode() const;
  vtkMRMLLayerDMPipelineI* GetLastPipeline() const;

protected:
  vtkMRMLLayerDMPipelineFactory();
  ~vtkMRMLLayerDMPipelineFactory() override = default;

private:
  void SortPipelineCreators();

  std::vector<vtkSmartPointer<vtkMRMLLayerDMPipelineCreatorI>> m_pipelineCreators;
  vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver> m_obs;
  vtkWeakPointer<vtkMRMLAbstractViewNode> m_lastView;
  vtkWeakPointer<vtkMRMLNode> m_lastNode;
  vtkWeakPointer<vtkMRMLLayerDMPipelineI> m_lastPipeline;
};