Skip to content

Commit

Permalink
LightEditor : Add deregister* methods
Browse files Browse the repository at this point in the history
  • Loading branch information
ericmehl committed Jun 6, 2024
1 parent 2f9736c commit ae0def4
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 4 deletions.
1 change: 1 addition & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
---
Expand Down
37 changes: 33 additions & 4 deletions python/GafferSceneUI/LightEditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand All @@ -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 ) :

Expand All @@ -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
Expand All @@ -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 )"
Expand Down
90 changes: 90 additions & 0 deletions python/GafferSceneUITest/LightEditorTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit ae0def4

Please sign in to comment.