From e440413db5fae23b8551f1af14f8aa0e527ab080 Mon Sep 17 00:00:00 2001 From: Eric Mehl Date: Thu, 20 Jun 2024 14:46:33 +0100 Subject: [PATCH] LightEditor : Add `deregisterColumn()` method --- Changes.md | 1 + python/GafferSceneUI/LightEditor.py | 24 ++++-- python/GafferSceneUITest/LightEditorTest.py | 84 +++++++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) diff --git a/Changes.md b/Changes.md index 863edc089a1..617ad4e70b7 100644 --- a/Changes.md +++ b/Changes.md @@ -22,6 +22,7 @@ Fixes API --- +- LightEditor : Added `deregisterColumn()` method for removing columns. - Loop : Added `nextIterationContext()` method. - AnnotationsGadget : Added `annotationText()` method. - ParallelAlgoTest : Added `UIThreadCallHandler.receive()` method. diff --git a/python/GafferSceneUI/LightEditor.py b/python/GafferSceneUI/LightEditor.py index e777cde1ba8..b9d65cc46c6 100644 --- a/python/GafferSceneUI/LightEditor.py +++ b/python/GafferSceneUI/LightEditor.py @@ -143,21 +143,18 @@ def scene( self ) : @classmethod def registerParameter( cls, rendererKey, parameter, section = None, columnName = None ) : - # We use `tuple` to store `ShaderNetwork.Parameter`, because - # the latter isn't hashable and we need to use it as a dict key. if isinstance( parameter, str ) : shader = "" param = parameter if "." in parameter : shader, dot, param = parameter.partition( "." ) - parameter = ( shader, param ) + parameter = IECoreScene.ShaderNetwork.Parameter( shader, param ) else : assert( isinstance( parameter, IECoreScene.ShaderNetwork.Parameter ) ) - parameter = ( parameter.shader, parameter.name ) GafferSceneUI.LightEditor.registerColumn( rendererKey, - parameter, + ".".join( x for x in [ parameter.shader, parameter.name ] if x ), lambda scene, editScope : _GafferSceneUI._LightEditorInspectorColumn( GafferSceneUI.Private.ParameterInspector( scene, editScope, rendererKey, parameter ), columnName if columnName is not None else "" @@ -186,11 +183,28 @@ def registerAttribute( cls, rendererKey, attributeName, section = None ) : @classmethod def registerColumn( cls, rendererKey, columnKey, inspectorFunction, section = None ) : + assert( isinstance( columnKey, str ) ) + sections = cls.__columnRegistry.setdefault( rendererKey, collections.OrderedDict() ) section = sections.setdefault( section, collections.OrderedDict() ) section[columnKey] = inspectorFunction + # Removes a column from the Light Editor. + # `rendererKey` should match the value the parameter or attribute was registered with. + # `columnKey` is the string value of the parameter or attribute name. + @classmethod + def deregisterColumn( cls, rendererKey, columnKey, section = None ) : + + assert( isinstance( columnKey, str ) ) + + sections = cls.__columnRegistry.get( rendererKey, None ) + if sections is not None and section in sections.keys() and columnKey in sections[section].keys() : + del sections[section][columnKey] + + if len( sections[section] ) == 0 : + del sections[section] + def __repr__( self ) : return "GafferSceneUI.LightEditor( scriptNode )" diff --git a/python/GafferSceneUITest/LightEditorTest.py b/python/GafferSceneUITest/LightEditorTest.py index 7e3f9506569..a9a4bbb4927 100644 --- a/python/GafferSceneUITest/LightEditorTest.py +++ b/python/GafferSceneUITest/LightEditorTest.py @@ -38,6 +38,7 @@ import imath import IECore +import IECoreScene import Gaffer import GafferUI @@ -778,6 +779,89 @@ def testShaderParameterEditScope( self ) : self.assertEqual( attributes["light"].shaders()["add"].parameters["a"].value, imath.Color3f( 1.0, 0.5, 0.0 ) ) self.assertEqual( attributes["light"].shaders()["__shader"].parameters["exposure"].value, 2.0 ) + def testDeregisterColumn( self ) : + + GafferSceneUI.LightEditor.registerParameter( "light", "P" ) + GafferSceneUI.LightEditor.registerParameter( "light", "P.X" ) + GafferSceneUI.LightEditor.registerAttribute( "light", "A" ) + GafferSceneUI.LightEditor.registerParameter( "light", IECoreScene.ShaderNetwork.Parameter( "P", "Y" ) ) + GafferSceneUI.LightEditor.registerParameter( "light", IECoreScene.ShaderNetwork.Parameter( "", "Z" ) ) + for columnName in [ "P", "P.X", "A", "P.Y" "Z" ] : + self.addCleanup( GafferSceneUI.LightEditor.deregisterColumn, "light", columnName ) + + script = Gaffer.ScriptNode() + + editor = GafferSceneUI.LightEditor( script ) + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + widget = editor._LightEditor__pathListing + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertIn( "P", columnNames ) + self.assertIn( "X", columnNames ) + self.assertIn( "A", columnNames ) + self.assertIn( "Y", columnNames ) + self.assertIn( "Z", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", "P" ) + + editor._LightEditor__updateColumns() + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "P", columnNames ) + self.assertIn( "X", columnNames ) + self.assertIn( "A", columnNames ) + self.assertIn( "Y", columnNames ) + self.assertIn( "Z", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", "P.X" ) + + editor._LightEditor__updateColumns() + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "P", columnNames ) + self.assertNotIn( "X", columnNames ) + self.assertIn( "A", columnNames ) + self.assertIn( "Y", columnNames ) + self.assertIn( "Z", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", "A" ) + + editor._LightEditor__updateColumns() + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "P", columnNames ) + self.assertNotIn( "P.X", columnNames ) + self.assertNotIn( "A", columnNames ) + self.assertIn( "Y", columnNames ) + self.assertIn( "Z", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", "P.Y" ) + + editor._LightEditor__updateColumns() + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "P", columnNames ) + self.assertNotIn( "P.X", columnNames ) + self.assertNotIn( "A", columnNames ) + self.assertNotIn( "Y", columnNames ) + self.assertIn( "Z", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", "Z" ) + + editor._LightEditor__updateColumns() + GafferSceneUI.LightEditor._LightEditor__updateColumns.flush( editor ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "P", columnNames ) + self.assertNotIn( "P.X", columnNames ) + self.assertNotIn( "A", columnNames ) + self.assertNotIn( "Y", columnNames ) + self.assertNotIn( "Z", columnNames ) if __name__ == "__main__" : unittest.main()