diff --git a/python/GafferUI/ColorChooser.py b/python/GafferUI/ColorChooser.py index d15ea70779..5f8d72dc0b 100644 --- a/python/GafferUI/ColorChooser.py +++ b/python/GafferUI/ColorChooser.py @@ -573,6 +573,7 @@ def __init__( self, color=imath.Color3f( 1 ), **kw ) : self.__visibleComponentsChangedSignal = Gaffer.Signals.Signal1() self.__staticComponentChangedSignal = Gaffer.Signals.Signal1() self.__colorFieldVisibleChangedSignal = Gaffer.Signals.Signal1() + self.__optionsMenuSignal = Gaffer.Signals.Signal2() self.__updateUIFromColor() self.__activateComponentIcons() @@ -686,6 +687,13 @@ def colorFieldVisibleChangedSignal( self ) : return self.__colorFieldVisibleChangedSignal + ## A signal emitted whenever the options menu is opened. + # Slots should have the signature slot( ColorChooser, menuDefinition ) + # and add menu items to `menuDefinition`. + def optionsMenuSignal( self ) : + + return self.__optionsMenuSignal + ## Returns True if a user would expect the specified sequence # of changes to be merged into a single undoable event. @classmethod @@ -744,6 +752,7 @@ def __optionsMenuDefinition( self ) : } ) + self.__optionsMenuSignal( self, result ) return result diff --git a/python/GafferUI/ColorChooserPlugValueWidget.py b/python/GafferUI/ColorChooserPlugValueWidget.py index 10d120f6d8..41cd4ce0b4 100644 --- a/python/GafferUI/ColorChooserPlugValueWidget.py +++ b/python/GafferUI/ColorChooserPlugValueWidget.py @@ -81,6 +81,10 @@ def __init__( self, plugs, **kw ) : functools.partial( Gaffer.WeakMethod( self.__colorChooserColorFieldVisibleChanged ) ), scoped = False ) + self.__colorChooser.optionsMenuSignal().connect( + functools.partial( Gaffer.WeakMethod( self.__colorChooserOptionsMenu ) ), + scoped = False + ) self.__lastChangedReason = None self.__mergeGroupId = 0 @@ -120,23 +124,13 @@ def __colorChanged( self, colorChooser, reason ) : def __colorChooserOptionChanged( self, keySuffix, value ) : - if Gaffer.Metadata.value( "colorChooser:inline:" + keySuffix, "userDefault" ) is None : - Gaffer.Metadata.deregisterValue( "colorChooser:inline:" + keySuffix, "sessionDefault" ) - Gaffer.Metadata.registerValue( "colorChooser:inline:" + keySuffix, "sessionDefault", value ) - for p in self.getPlugs() : Gaffer.Metadata.deregisterValue( p, "colorChooser:inline:" + keySuffix ) Gaffer.Metadata.registerValue( p, "colorChooser:inline:" + keySuffix, value, persistent = False ) def __colorChooserOption( self, keySuffix ) : - v = sole( Gaffer.Metadata.value( p, "colorChooser:inline:" + keySuffix ) for p in self.getPlugs() ) - if v is None : - v = Gaffer.Metadata.value( "colorChooser:inline:" + keySuffix, "userDefault" ) - if v is None : - v = Gaffer.Metadata.value( "colorChooser:inline:" + keySuffix, "sessionDefault" ) - - return v + return sole( Gaffer.Metadata.value( p, "colorChooser:inline:" + keySuffix ) for p in self.getPlugs() ) def __colorChooserVisibleComponentsChanged( self, colorChooser ) : @@ -150,6 +144,22 @@ def __colorChooserColorFieldVisibleChanged( self, colorChooser ) : self.__colorChooserOptionChanged( "colorFieldVisible", colorChooser.getColorFieldVisible() ) + def __colorChooserOptionsMenu( self, colorChooser, menuDefinition ) : + + menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": "Defaults" } ) + + menuDefinition.append( + "/Save Inline Defaults", + { + "command": functools.partial( + saveDefaultOptions, + colorChooser, + "colorChooser:inline:", + self.ancestor( GafferUI.ScriptWindow ).scriptNode().applicationRoot().preferencesLocation() / "__colorChooser.py" + ), + } + ) + def __allComponentsEditable( self ) : if not self._editable() : @@ -164,3 +174,49 @@ def __allComponentsEditable( self ) : return False return True + +def saveDefaultOptions( colorChooser, keyPrefix, scriptPath = None ) : + + for k in [ "visibleComponents", "staticComponent", "colorFieldVisible" ] : + Gaffer.Metadata.deregisterValue( Gaffer.Color3fPlug, keyPrefix + k ) + Gaffer.Metadata.deregisterValue( Gaffer.Color4fPlug, keyPrefix + k ) + + visibleComponents = colorChooser.getVisibleComponents() + Gaffer.Metadata.registerValue( Gaffer.Color3fPlug, keyPrefix + "visibleComponents", visibleComponents ) + Gaffer.Metadata.registerValue( Gaffer.Color4fPlug, keyPrefix + "visibleComponents", visibleComponents ) + + staticComponent = colorChooser.getColorFieldStaticComponent() + Gaffer.Metadata.registerValue( Gaffer.Color3fPlug, keyPrefix + "staticComponent", staticComponent ) + Gaffer.Metadata.registerValue( Gaffer.Color4fPlug, keyPrefix + "staticComponent", staticComponent ) + + colorFieldVisible = colorChooser.getColorFieldVisible() + Gaffer.Metadata.registerValue( Gaffer.Color3fPlug, keyPrefix + "colorFieldVisible", colorFieldVisible ) + Gaffer.Metadata.registerValue( Gaffer.Color4fPlug, keyPrefix + "colorFieldVisible", colorFieldVisible ) + + if scriptPath is None : + return + + if scriptPath.is_dir() : + raise RuntimeError( f"Cannot write Color Chooser default options script \"{scriptPath}\", a directory at that path exists.") + + if scriptPath.exists() : + with open( scriptPath, "r" ) as inFile : + script = inFile.readlines() + else : + script = [ + "# This file was automatically generated by Gaffer.\n", + "# Do not edit this file - it will be overwritten.\n", + "\n", + "import Gaffer\n", + "\n" + ] + + newScript = [l for l in script if keyPrefix not in l] + + for c in [ "3", "4" ] : + newScript.append( f"Gaffer.Metadata.registerValue( Gaffer.Color{c}fPlug, \"{keyPrefix}visibleComponents\", \"{visibleComponents}\" )\n" ) + newScript.append( f"Gaffer.Metadata.registerValue( Gaffer.Color{c}fPlug, \"{keyPrefix}staticComponent\", \"{staticComponent}\" )\n" ) + newScript.append( f"Gaffer.Metadata.registerValue( Gaffer.Color{c}fPlug, \"{keyPrefix}colorFieldVisible\", {colorFieldVisible} )\n" ) + + with open( scriptPath, "w" ) as outFile : + outFile.writelines( newScript ) \ No newline at end of file diff --git a/python/GafferUI/ColorSwatchPlugValueWidget.py b/python/GafferUI/ColorSwatchPlugValueWidget.py index fafa870a38..d7221eebb1 100644 --- a/python/GafferUI/ColorSwatchPlugValueWidget.py +++ b/python/GafferUI/ColorSwatchPlugValueWidget.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI from GafferUI.PlugValueWidget import sole +from GafferUI.ColorChooserPlugValueWidget import saveDefaultOptions class ColorSwatchPlugValueWidget( GafferUI.PlugValueWidget ) : @@ -149,6 +150,10 @@ def __init__( self, plugs, parentWindow ) : functools.partial( Gaffer.WeakMethod( self.__colorChooserColorFieldVisibleChanged ) ), scoped = False ) + self.colorChooser().optionsMenuSignal().connect( + functools.partial( Gaffer.WeakMethod( self.__colorChooserOptionsMenu ) ), + scoped = False + ) self.confirmButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ), scoped = False ) self.cancelButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ), scoped = False ) @@ -171,15 +176,15 @@ def __init__( self, plugs, parentWindow ) : visibleComponents = self.__colorChooserOption( "visibleComponents" ) if visibleComponents is not None : - self.__colorChooser.setVisibleComponents( visibleComponents ) + self.colorChooser().setVisibleComponents( visibleComponents ) staticComponent = self.__colorChooserOption( "staticComponent" ) if staticComponent is not None : - self.__colorChooser.setColorFieldStaticComponent( staticComponent ) + self.colorChooser().setColorFieldStaticComponent( staticComponent ) colorFieldVisible = self.__colorChooserOption( "colorFieldVisible" ) if colorFieldVisible is not None : - self.__colorChooser.setColorFieldVisible( colorFieldVisible ) + self.colorChooser().setColorFieldVisible( colorFieldVisible ) parentWindow.addChildWindow( self, removeOnClose = True ) @@ -241,6 +246,22 @@ def __buttonClicked( self, button ) : assert( not self.visible() ) GafferUI.WidgetAlgo.keepUntilIdle( self ) + def __colorChooserOptionsMenu( self, colorChooser, menuDefinition ) : + + menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": "Defaults" } ) + + menuDefinition.append( + "/Save Dialogue Defaults", + { + "command": functools.partial( + saveDefaultOptions, + colorChooser, + "colorChooser:dialogue:", + self.ancestor( GafferUI.ScriptWindow ).scriptNode().applicationRoot().preferencesLocation() / "__colorChooser.py" + ) + } + ) + def __destroy( self, *unused ) : self.parent().removeChild( self ) @@ -250,23 +271,13 @@ def __destroy( self, *unused ) : def __colorChooserOptionChanged( self, keySuffix, value ) : - if Gaffer.Metadata.value( "colorChooser:dialogue:" + keySuffix, "userDefault" ) is None : - Gaffer.Metadata.deregisterValue( "colorChooser:dialogue:" + keySuffix, "sessionDefault" ) - Gaffer.Metadata.registerValue( "colorChooser:dialogue:" + keySuffix, "sessionDefault", value ) - for p in self.__plugs : Gaffer.Metadata.deregisterValue( p, "colorChooser:dialogue:" + keySuffix ) Gaffer.Metadata.registerValue( p, "colorChooser:dialogue:" + keySuffix, value, persistent = False ) def __colorChooserOption( self, keySuffix ) : - v = sole( Gaffer.Metadata.value( p, "colorChooser:dialogue:" + keySuffix ) for p in self.getPlugs() ) - if v is None : - v = Gaffer.Metadata.value( "colorChooser:dialogue:" + keySuffix, "userDefault" ) - if v is None : - v = Gaffer.Metadata.value( "colorChooser:dialogue:" + keySuffix, "sessionDefault" ) - - return v + return sole( Gaffer.Metadata.value( p, "colorChooser:dialogue:" + keySuffix ) for p in self.__plugs ) def __colorChooserVisibleComponentsChanged( self, colorChooser ) : diff --git a/python/GafferUITest/ColorChooserTest.py b/python/GafferUITest/ColorChooserTest.py index d4b1478731..d00150dbed 100644 --- a/python/GafferUITest/ColorChooserTest.py +++ b/python/GafferUITest/ColorChooserTest.py @@ -46,6 +46,7 @@ import GafferUI from GafferUI.ColorChooser import _tmiToRGB from GafferUI.ColorChooser import _rgbToTMI +from GafferUI.ColorChooserPlugValueWidget import saveDefaultOptions import GafferUITest class ColorChooserTest( GafferUITest.TestCase ) : @@ -130,182 +131,144 @@ def testMetadata( self ) : script["node"]["rgbPlug1"] = Gaffer.Color3fPlug( flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) script["node"]["rgbPlug2"] = Gaffer.Color3fPlug( flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) - widget1 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) + widget = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) # Default state for c in "rgbhsvtmi" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) + self.assertTrue( self.__sliderFromWidget( widget, c ).getVisible() ) + self.assertEqual( self.__getStaticComponent( widget ), "s" ) + self.assertTrue( self.__getColorFieldVisibility( widget ) ) + for p in [ "rgbPlug1", "rgbPlug2" ] : self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:visibleComponents" ) ) self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:staticComponent" ) ) self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:colorFieldVisible" ) ) - self.assertEqual( self.__getStaticComponent( widget1 ), "s" ) - self.assertTrue( self.__getColorFieldVisibility( widget1 ) ) - # Modify widget1 + # Modify widget - self.__setVisibleComponents( widget1, "rgbtmi" ) - self.__setStaticComponent( widget1, "t" ) - self.__setColorFieldVisibility( widget1, False ) + self.__setVisibleComponents( widget, "rgbtmi" ) + self.__setStaticComponent( widget, "t" ) + self.__setColorFieldVisibility( widget, False ) for c in "rgbtmi" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( widget, c ).getVisible() ) for c in "hsv" : - self.assertFalse( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "t" ) - self.assertFalse( self.__getColorFieldVisibility( widget1 ) ) + self.assertFalse( self.__sliderFromWidget( widget, c ).getVisible() ) + self.assertEqual( self.__getStaticComponent( widget ), "t" ) + self.assertFalse( self.__getColorFieldVisibility( widget ) ) + + for p in [ "rgbPlug2" ] : + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:visibleComponents" ) ) + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:staticComponent" ) ) + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:colorFieldVisible" ) ) - self.assertEqual( set( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ), set( "rgbtmi" ) ) self.assertEqual( set( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:visibleComponents" ) ), set( "rgbtmi" ) ) - self.assertEqual( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ), "t" ) self.assertEqual( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:staticComponent" ), "t" ) - self.assertFalse( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) self.assertFalse( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:colorFieldVisible" ) ) - # Recreate widget1 and should have the same state - del widget1 - widget1 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) + # Recreate widget and should have the same state - for c in "rgbtmi" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - for c in "hsv" : - self.assertFalse( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "t" ) - self.assertFalse( self.__getColorFieldVisibility( widget1 ) ) - - # A widget for a second plug should adopt the same state as widget1 - - widget2 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug2"] ) + del widget + widget = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) for c in "rgbtmi" : - self.assertTrue( self.__sliderFromWidget( widget2, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( widget, c ).getVisible() ) for c in "hsv" : - self.assertFalse( self.__sliderFromWidget( widget2, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget2 ), "t" ) - self.assertFalse( self.__getColorFieldVisibility( widget2 ) ) + self.assertFalse( self.__sliderFromWidget( widget, c ).getVisible() ) + self.assertEqual( self.__getStaticComponent( widget ), "t" ) + self.assertFalse( self.__getColorFieldVisibility( widget ) ) - # Changing widget2 should not affect widget1, but should change `sessionDefault` - self.__setVisibleComponents( widget2, "rgb" ) - self.__setStaticComponent( widget2, "r" ) - self.__setColorFieldVisibility( widget2, True ) + # We haven't saved the defaults, so a widget for a second plug + # gets the original defaults. - for c in "rgbtmi" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - for c in "hsv" : - self.assertFalse( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "t" ) - self.assertFalse( self.__getColorFieldVisibility( widget1 ) ) + widget2 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug2"] ) - for c in "rgb" : + for c in "rgbhsvtmi" : self.assertTrue( self.__sliderFromWidget( widget2, c ).getVisible() ) - for c in "hsvtmi" : - self.assertFalse( self.__sliderFromWidget( widget2, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget2 ), "r" ) + self.assertEqual( self.__getStaticComponent( widget2 ), "s" ) self.assertTrue( self.__getColorFieldVisibility( widget2 ) ) - self.assertEqual( set( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ), set( "rgb" ) ) - self.assertEqual( set( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:visibleComponents" ) ), set( "rgbtmi" ) ) - self.assertEqual( set( Gaffer.Metadata.value( script["node"]["rgbPlug2"], "colorChooser:inline:visibleComponents" ) ), set( "rgb" ) ) - self.assertEqual( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ), "r" ) - self.assertEqual( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:staticComponent" ), "t" ) - self.assertEqual( Gaffer.Metadata.value( script["node"]["rgbPlug2"], "colorChooser:inline:staticComponent" ), "r" ) - self.assertTrue( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) - self.assertFalse( Gaffer.Metadata.value( script["node"]["rgbPlug1"], "colorChooser:inline:colorFieldVisible" ) ) - self.assertTrue( Gaffer.Metadata.value( script["node"]["rgbPlug2"], "colorChooser:inline:colorFieldVisible" ) ) + for p in [ "rgbPlug2" ] : + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:visibleComponents" ) ) + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:staticComponent" ) ) + self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:colorFieldVisible" ) ) # Don't serialize state - del widget1 - del widget2 - Gaffer.Metadata.deregisterValue( "colorChooser:inline:visibleComponents", "sessionDefault" ) - Gaffer.Metadata.deregisterValue( "colorChooser:inline:staticComponent", "sessionDefault" ) - Gaffer.Metadata.deregisterValue( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) + + del widget script2 = Gaffer.ScriptNode() script2.execute( script.serialise() ) - widget1 = GafferUI.ColorPlugValueWidget( script2["node"]["rgbPlug1"] ) - widget2 = GafferUI.ColorPlugValueWidget( script2["node"]["rgbPlug2"] ) + widget = GafferUI.ColorPlugValueWidget( script2["node"]["rgbPlug1"] ) for c in "rgbhsvtmi" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertTrue( self.__sliderFromWidget( widget2, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "s" ) - self.assertEqual( self.__getStaticComponent( widget2 ), "s" ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) + self.assertTrue( self.__sliderFromWidget( widget, c ).getVisible() ) + self.assertEqual( self.__getStaticComponent( widget ), "s" ) + self.assertTrue( self.__getColorFieldVisibility( widget ) ) + for p in [ "rgbPlug1", "rgbPlug2" ] : self.assertIsNone( Gaffer.Metadata.value( script2["node"][p], "colorChooser:inline:visibleComponents" ) ) self.assertIsNone( Gaffer.Metadata.value( script2["node"][p], "colorChooser:inline:staticComponent" ) ) self.assertIsNone( Gaffer.Metadata.value( script2["node"][p], "colorChooser:inline:colorFieldVisible" ) ) - def testUserDefaultMetadata( self ) : - - # Set `userDefault` - Gaffer.Metadata.registerValue( "colorChooser:inline:visibleComponents", "userDefault", "rgb" ) - Gaffer.Metadata.registerValue( "colorChooser:inline:staticComponent", "userDefault", "r" ) - Gaffer.Metadata.registerValue( "colorChooser:inline:colorFieldVisible", "userDefault", False ) + def testSaveDefaultOptions( self ) : script = Gaffer.ScriptNode() script["node"] = Gaffer.Node() - script["node"]["rgbPlug1"] = Gaffer.Color3fPlug( flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) - script["node"]["rgbPlug2"] = Gaffer.Color3fPlug( flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) + script["node"]["rgbPlug"] = Gaffer.Color3fPlug() + script["node"]["rgbaPlug"] = Gaffer.Color4fPlug() + script["node"]["rgbaPlug"].setValue( imath.Color4f( 0.1 ) ) - widget1 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) + rgbWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug"] ) + rgbaWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbaPlug"] ) - # Should get `userDefault` values - for c in "rgb" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - for c in "hsvtmi" : - self.assertFalse( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "r" ) - self.assertFalse( self.__getColorFieldVisibility( widget1 ) ) + GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbWidget._ColorPlugValueWidget__colorChooser ) + GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) - for p in [ "rgbPlug1", "rgbPlug2" ] : - self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:visibleComponents" ) ) - self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:staticComponent" ) ) - self.assertIsNone( Gaffer.Metadata.value( script["node"][p], "colorChooser:inline:colorFieldVisible" ) ) - - # Change widget1 and recreate it - self.__setVisibleComponents( widget1, "rgbhsv" ) - self.__setStaticComponent( widget1, "g" ) - self.__setColorFieldVisibility( widget1, True ) - - del widget1 + # Default state + for c in "rgbhsvtmi" : + self.assertTrue( self.__sliderFromWidget( rgbWidget, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( rgbaWidget, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( rgbaWidget, "a" ).getVisible() ) + self.assertEqual( self.__getStaticComponent( rgbWidget ), "s" ) + self.assertEqual( self.__getStaticComponent( rgbaWidget ), "s" ) + self.assertTrue( self.__getColorFieldVisibility( rgbWidget ) ) + self.assertTrue( self.__getColorFieldVisibility( rgbaWidget ) ) - widget1 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug1"] ) + # Modify `rgbWidget` - # Should have HSV, static component G, visible color field - for c in "rgbhsv" : - self.assertTrue( self.__sliderFromWidget( widget1, c ).getVisible() ) - for c in "tmi" : - self.assertFalse( self.__sliderFromWidget( widget1, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget1 ), "g" ) - self.assertTrue( self.__getColorFieldVisibility( widget1 ) ) + self.__setVisibleComponents( rgbWidget, "rgbhsv" ) + self.__setStaticComponent( rgbWidget, "g" ) + self.__setColorFieldVisibility( rgbWidget, False ) - # A new widget, without any per-plug metadata should get `userDefault` + # Save defaults + colorChooser = self.__colorChooserFromWidget( rgbWidget ) + saveDefaultOptions( colorChooser, "colorChooser:inline:" ) - widget2 = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug2"] ) + del rgbWidget + del rgbaWidget - for c in "rgb" : - self.assertTrue( self.__sliderFromWidget( widget2, c ).getVisible() ) - for c in "hsvtmi" : - self.assertFalse( self.__sliderFromWidget( widget2, c ).getVisible() ) - self.assertEqual( self.__getStaticComponent( widget2 ), "r" ) - self.assertFalse( self.__getColorFieldVisibility( widget2 ) ) + # Both color types get the same value + rgbWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbPlug"] ) + rgbaWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbaPlug"] ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:visibleComponents", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:staticComponent", "sessionDefault" ) ) - self.assertIsNone( Gaffer.Metadata.value( "colorChooser:inline:colorFieldVisible", "sessionDefault" ) ) + GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbWidget._ColorPlugValueWidget__colorChooser ) + GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser ) + for c in "rgbhsv" : + self.assertTrue( self.__sliderFromWidget( rgbWidget, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( rgbaWidget, c ).getVisible() ) + for c in "tmi" : + self.assertFalse( self.__sliderFromWidget( rgbWidget, c ).getVisible() ) + self.assertFalse( self.__sliderFromWidget( rgbaWidget, c ).getVisible() ) + self.assertTrue( self.__sliderFromWidget( rgbaWidget, "a" ).getVisible() ) + self.assertEqual( self.__getStaticComponent( rgbWidget ), "g" ) + self.assertEqual( self.__getStaticComponent( rgbaWidget ), "g" ) + self.assertFalse( self.__getColorFieldVisibility( rgbWidget ) ) + self.assertFalse( self.__getColorFieldVisibility( rgbaWidget ) ) if __name__ == "__main__" : unittest.main() \ No newline at end of file