From 8d1e27a5d977209917fbf07859c261e0c7355874 Mon Sep 17 00:00:00 2001 From: Charles PIGNEROL <> Date: Fri, 10 Apr 2026 09:16:27 +0200 Subject: [PATCH] Reentrance of the DisplayLocker class. --- src/QtComponents/RenderingManager.cpp | 26 +++++++++++-------- .../protected/QtComponents/RenderingManager.h | 20 +++++++++++--- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/QtComponents/RenderingManager.cpp b/src/QtComponents/RenderingManager.cpp index cacedbfa..261f9dec 100644 --- a/src/QtComponents/RenderingManager.cpp +++ b/src/QtComponents/RenderingManager.cpp @@ -286,7 +286,7 @@ RenderingManager& RenderingManager::ColorTable::getRenderingManager ( ) RenderingManager::DisplayLocker::DisplayLocker (RenderingManager& w, bool forceRenderAtEnd) : _3dwidget (&w), _forceRenderAtEnd (forceRenderAtEnd) { - w.lockDisplay (true); + w.lockDisplay ( ); } // RenderingManager::DisplayLocker @@ -306,7 +306,7 @@ RenderingManager::DisplayLocker::~DisplayLocker ( ) { if (0 != _3dwidget) { - _3dwidget->lockDisplay (false); + _3dwidget->unlockDisplay ( ); if (true == _forceRenderAtEnd) _3dwidget->forceRender ( ); } // if (0 != _3dwidget) @@ -692,7 +692,7 @@ vector RenderingManager::RenderingManager ( ) : SelectionManagerObserver (0), - _context (0), _displayLocked (false), _useGlobalDisplayProperties (true), _displayedTypes (FilterEntity::NoneEntity), _topoUseGeomColor (false), + _context (0), _displayLocksCount (0), _useGlobalDisplayProperties (true), _displayedTypes (FilterEntity::NoneEntity), _topoUseGeomColor (false), _structuredDataThreshold (-NumericServices::doubleMachInfinity ( )) { } // RenderingManager::RenderingManager @@ -700,7 +700,7 @@ RenderingManager::RenderingManager ( ) RenderingManager::RenderingManager (const RenderingManager&) : SelectionManagerObserver (0), - _context (0), _displayLocked (false), _useGlobalDisplayProperties (true), _displayedTypes (FilterEntity::NoneEntity), _topoUseGeomColor (false), + _context (0), _displayLocksCount (0), _useGlobalDisplayProperties (true), _displayedTypes (FilterEntity::NoneEntity), _topoUseGeomColor (false), _structuredDataThreshold (-NumericServices::doubleMachInfinity ( )) { MGX_FORBIDDEN ("RenderingManager copy constructor is not allowed."); @@ -1218,16 +1218,14 @@ void RenderingManager::selectionCleared ( ) return; const bool locked = displayLocked ( ); - lockDisplay (true); + lockDisplay ( ); const vector entities = getSelectionManager ( )->getEntities ( ); entitiesRemovedFromSelection (entities, true); + unlockDisplay ( ); if (false == locked) - { - lockDisplay (false); forceRender ( ); - } // if (false == locked) } // RenderingManager::selectionCleared @@ -1561,16 +1559,22 @@ const unsigned long typesMask = GraphicalEntityRepresentation::getDefaultReprese bool RenderingManager::displayLocked ( ) const { - return _displayLocked; + return 0 != _displayLocksCount ? true : false; } // RenderingManager::displayLocked -void RenderingManager::lockDisplay (bool lock) +void RenderingManager::lockDisplay ( ) { - _displayLocked = lock; + ++_displayLocksCount; } // RenderingManager::lockDisplay +void RenderingManager::unlockDisplay ( ) +{ + --_displayLocksCount; +} // RenderingManager::unlockDisplay + + // ============================================================================ // FONCTIONS STATIQUES // ============================================================================ diff --git a/src/QtComponents/protected/QtComponents/RenderingManager.h b/src/QtComponents/protected/QtComponents/RenderingManager.h index 1e5fb104..5f759569 100644 --- a/src/QtComponents/protected/QtComponents/RenderingManager.h +++ b/src/QtComponents/protected/QtComponents/RenderingManager.h @@ -16,6 +16,9 @@ #include + +#include + /** * Macro-commandes pour faire du profiling sur le rendu graphique. */ @@ -1253,10 +1256,18 @@ class RenderingManager : public Internal::SelectionManagerObserver ); /** - * \param true si les opérations d'affichage sont à inhiber, false dans le cas contraire. + * \param Incrémente le compteur d'inhibitions des opérations d'affichage. + * \see displayLocked + * \see unlockDisplay + */ + virtual void lockDisplay ( ); + + /** + * \param Décrémente le compteur d'inhibitions des opérations d'affichage. * \see displayLocked + * \see unlockDisplay */ - virtual void lockDisplay (bool lock); + virtual void unlockDisplay ( ); @@ -1265,6 +1276,7 @@ class RenderingManager : public Internal::SelectionManagerObserver /** * \return true si les opérations d'affichage sont inhibées (optimisation). * \see lockDisplay + * \see unlockDisplay */ virtual bool displayLocked ( ) const; @@ -1278,9 +1290,9 @@ class RenderingManager : public Internal::SelectionManagerObserver /** Le contexte de session associé. */ Mgx3D::Internal::Context* _context; - /** Si true ne pas effectuer d'opération d'affichage (optimisation). + /** Si non nul ne pas effectuer d'opération d'affichage (optimisation). */ - bool _displayLocked; + std::atomic _displayLocksCount; /** Si true l'affichage des entités utilise des propriétés d'affichage communes. Si false se sont des propriétés * individuelles qui sont utilisées.