diff --git a/Changes.md b/Changes.md index fa7bd848110..268354a18e6 100644 --- a/Changes.md +++ b/Changes.md @@ -5,6 +5,7 @@ Improvements ------------ - UIEditor : Added code examples to button code placeholder text. +- LightEditor : Added `deregisterParameter()`, `deregisterAttribute()` and `deregisterColumn()` methods for removing columns. API --- diff --git a/python/GafferSceneUI/LightEditor.py b/python/GafferSceneUI/LightEditor.py index e777cde1ba8..42958036c9e 100644 --- a/python/GafferSceneUI/LightEditor.py +++ b/python/GafferSceneUI/LightEditor.py @@ -137,11 +137,8 @@ def scene( self ) : return self.__plug - # Registers a parameter to be available for editing. `rendererKey` is a pattern - # that will be matched against `self.__settingsNode["attribute"]` to determine if - # the column should be shown. @classmethod - def registerParameter( cls, rendererKey, parameter, section = None, columnName = None ) : + def __parseParameter( cls, parameter ) : # We use `tuple` to store `ShaderNetwork.Parameter`, because # the latter isn't hashable and we need to use it as a dict key. @@ -155,6 +152,16 @@ def registerParameter( cls, rendererKey, parameter, section = None, columnName = assert( isinstance( parameter, IECoreScene.ShaderNetwork.Parameter ) ) parameter = ( parameter.shader, parameter.name ) + return parameter + + # Registers a parameter to be available for editing. `rendererKey` is a pattern + # that will be matched against `self.__settingsNode["attribute"]` to determine if + # the column should be shown. + @classmethod + def registerParameter( cls, rendererKey, parameter, section = None, columnName = None ) : + + parameter = cls.__parseParameter( parameter ) + GafferSceneUI.LightEditor.registerColumn( rendererKey, parameter, @@ -165,6 +172,13 @@ def registerParameter( cls, rendererKey, parameter, section = None, columnName = section ) + @classmethod + def deregisterParameter( cls, rendererKey, parameter, section = None ) : + + parameter = cls.__parseParameter( parameter ) + GafferSceneUI.LightEditor.deregisterColumn( rendererKey, parameter, section ) + + @classmethod def registerAttribute( cls, rendererKey, attributeName, section = None ) : @@ -179,6 +193,11 @@ def registerAttribute( cls, rendererKey, attributeName, section = None ) : section ) + @classmethod + def deregisterAttribute( cls, rendererKey, attributeName, section = None ) : + + GafferSceneUI.LightEditor.deregisterColumn( rendererKey, attributeName, section ) + # Registers a column in the Light Editor. # `inspectorFunction` is a callable object of the form # `inspectorFunction( scene, editScope )` returning a @@ -191,6 +210,16 @@ def registerColumn( cls, rendererKey, columnKey, inspectorFunction, section = No section[columnKey] = inspectorFunction + @classmethod + def deregisterColumn( cls, rendererKey, columnKey, section = None ) : + + 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..4107aced332 100644 --- a/python/GafferSceneUITest/LightEditorTest.py +++ b/python/GafferSceneUITest/LightEditorTest.py @@ -778,6 +778,96 @@ 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 testDeregisterParameter( self ) : + + GafferSceneUI.LightEditor.registerParameter( "light", "A" ) + GafferSceneUI.LightEditor.registerParameter( "light", "B", "section2" ) + + script = Gaffer.ScriptNode() + + with GafferUI.Window() as window : + editor = GafferSceneUI.LightEditor( script ) + + window.setVisible( True ) + + self.waitForIdle( 1000 ) + + widget = editor._LightEditor__pathListing + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertIn( "A", columnNames ) + + GafferSceneUI.LightEditor.deregisterParameter( "light", "A" ) + + # Switch away from and back to the default section to trigger column update + editor._LightEditor__settingsNode["section"].setValue( "section2" ) + self.waitForIdle( 1000 ) + editor._LightEditor__settingsNode["section"].setValue( "" ) + self.waitForIdle( 1000 ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "A", columnNames ) + + def testDeregisterAttribute( self ) : + + GafferSceneUI.LightEditor.registerAttribute( "light", "A" ) + GafferSceneUI.LightEditor.registerAttribute( "light", "B", "section2" ) + + script = Gaffer.ScriptNode() + + with GafferUI.Window() as window : + editor = GafferSceneUI.LightEditor( script ) + + window.setVisible( True ) + + self.waitForIdle( 1000 ) + + widget = editor._LightEditor__pathListing + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertIn( "A", columnNames ) + + GafferSceneUI.LightEditor.deregisterAttribute( "light", "A" ) + + # Switch away from and back to the default section to trigger column update + editor._LightEditor__settingsNode["section"].setValue( "section2" ) + self.waitForIdle( 1000 ) + editor._LightEditor__settingsNode["section"].setValue( "" ) + self.waitForIdle( 1000 ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "A", columnNames ) + + def testDeregisterColumn( self ) : + + GafferSceneUI.LightEditor.registerParameter( "light", "A" ) + GafferSceneUI.LightEditor.registerParameter( "light", "B", "section2" ) + + script = Gaffer.ScriptNode() + + with GafferUI.Window() as window : + editor = GafferSceneUI.LightEditor( script ) + + window.setVisible( True ) + + self.waitForIdle( 1000 ) + + widget = editor._LightEditor__pathListing + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertIn( "A", columnNames ) + + GafferSceneUI.LightEditor.deregisterColumn( "light", ( "", "A" ) ) + + # Switch away from and back to the default section to trigger column update + editor._LightEditor__settingsNode["section"].setValue( "section2" ) + self.waitForIdle( 1000 ) + editor._LightEditor__settingsNode["section"].setValue( "" ) + self.waitForIdle( 1000 ) + + columnNames = [ c.headerData().value for c in widget.getColumns() ] + self.assertNotIn( "A", columnNames ) + if __name__ == "__main__" : unittest.main()