Skip to content

Commit 19122e2

Browse files
ENH: Add SetBlocked method to ObjectEventObserver
1 parent 5bbb4ae commit 19122e2

3 files changed

Lines changed: 31 additions & 0 deletions

File tree

LayerDM/MRMLDM/vtkMRMLLayerDMObjectEventObserver.cxx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@ Overloaded(Ts...) -> Overloaded<Ts...>;
1717

1818
vtkMRMLLayerDMObjectEventObserver::vtkMRMLLayerDMObjectEventObserver()
1919
: m_updateCommand(vtkSmartPointer<vtkCallbackCommand>::New())
20+
, m_isBlocked(false)
2021
{
2122
this->m_updateCommand->SetClientData(this);
2223
this->m_updateCommand->SetCallback(
2324
[](vtkObject* caller, unsigned long eid, void* clientData, void* callData)
2425
{
2526
auto client = static_cast<vtkMRMLLayerDMObjectEventObserver*>(clientData);
27+
if (client->m_isBlocked)
28+
{
29+
return;
30+
}
31+
2632
try
2733
{
2834
// Dispatch to callback depending on current std variant content
@@ -77,6 +83,13 @@ void vtkMRMLLayerDMObjectEventObserver::SetUpdateCallback(const std::function<vo
7783
this->m_callback = callback;
7884
}
7985

86+
bool vtkMRMLLayerDMObjectEventObserver::SetBlocked(bool isBlocked)
87+
{
88+
bool wasBlocked = this->m_isBlocked;
89+
this->m_isBlocked = isBlocked;
90+
return wasBlocked;
91+
}
92+
8093
void vtkMRMLLayerDMObjectEventObserver::SetUpdateCallback(const std::function<void(vtkObject* node, unsigned long eventId)>& callback)
8194
{
8295
this->m_callback = callback;

LayerDM/MRMLDM/vtkMRMLLayerDMObjectEventObserver.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMObje
4848
void SetUpdateCallback(const std::function<void(vtkObject* node, unsigned long eventId, void* callData)>& callback);
4949
/// @}
5050

51+
/// Set update callback blocked.
52+
/// @return previous blocked state.
53+
bool SetBlocked(bool isBlocked);
54+
5155
protected:
5256
vtkMRMLLayerDMObjectEventObserver();
5357
~vtkMRMLLayerDMObjectEventObserver() override;
@@ -62,4 +66,5 @@ class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMObje
6266
std::function<void(vtkObject* node, unsigned long eventId)>,
6367
std::function<void(vtkObject* node, unsigned long eventId, void* callData)>>
6468
m_callback;
69+
bool m_isBlocked;
6570
};

LayerDM/Testing/Python/ObjectEventObserverScriptedTest.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,16 @@ def test_can_cast_observed_call_data(self):
6464
assert args[0] == slicer.mrmlScene
6565
assert args[1] == vtkMRMLScene.NodeAddedEvent
6666
assert self.observer.CastCallData(args[2], VTK_OBJECT) == modelNode
67+
68+
def test_update_can_be_blocked(self):
69+
modelNode = vtkMRMLModelNode()
70+
self.observer.UpdateObserver(None, modelNode, vtkCommand.ModifiedEvent)
71+
wasBlocked = self.observer.SetBlocked(True)
72+
assert not wasBlocked
73+
74+
modelNode.Modified()
75+
self.mock.assert_not_called()
76+
77+
self.observer.SetBlocked(wasBlocked)
78+
modelNode.Modified()
79+
self.mock.assert_called_once_with(modelNode, vtkCommand.ModifiedEvent, None)

0 commit comments

Comments
 (0)