diff --git a/python/GafferUI/MetadataWidget.py b/python/GafferUI/MetadataWidget.py index 1f3a669cf5d..447a8926489 100644 --- a/python/GafferUI/MetadataWidget.py +++ b/python/GafferUI/MetadataWidget.py @@ -109,12 +109,12 @@ def _updateFromValue( self, value ) : ## Must be called by derived classes to update # the Metadata value when the widget value changes. - def _updateFromWidget( self, value ) : + def _updateFromWidget( self, value, mergeGroup = "" ) : if self.__target is None : return - with Gaffer.UndoScope( self.__target.ancestor( Gaffer.ScriptNode ) ) : + with Gaffer.UndoScope( self.__target.ancestor( Gaffer.ScriptNode ), mergeGroup = mergeGroup ) : Gaffer.Metadata.registerValue( self.__target, self.__key, value ) ## May be called by derived classes to deregister the @@ -355,14 +355,14 @@ def __init__( self, key, target = None, defaultValue = 0, **kw ) : self.__numericWidget = GafferUI.NumericWidget( value = defaultValue ) self.__defaultValue = defaultValue + # we use these to decide which actions to merge into a single undo + self.__lastChangedReason = None + self.__mergeGroupId = 0 MetadataWidget.__init__( self, self.__numericWidget, key, target, defaultValue = defaultValue, **kw ) - self.__numericWidget.editingFinishedSignal().connect( - Gaffer.WeakMethod( self.__editingFinished ), scoped = False - ) self.__numericWidget.valueChangedSignal().connect( - Gaffer.WeakMethod( self.__editingFinished ), scoped = False + Gaffer.WeakMethod( self.__valueChanged ), scoped = False ) def numericWidget( self ) : @@ -373,6 +373,17 @@ def _updateFromValue( self, value ) : self.__numericWidget.setValue( type( self.__defaultValue )( value ) ) - def __editingFinished( self, *unused ) : + def __valueChanged( self, widget, reason ) : - self._updateFromWidget( self.__numericWidget.getValue() ) + if reason == GafferUI.NumericWidget.ValueChangedReason.InvalidEdit : + self._updateFromValue( self.defaultValue() ) + return + + if not widget.changesShouldBeMerged( self.__lastChangedReason, reason ) : + self.__mergeGroupId += 1 + self.__lastChangedReason = reason + + self._updateFromWidget( + self.__numericWidget.getValue(), + mergeGroup = "NumericMetadataWidget{}{}".format( id( self, ), self.__mergeGroupId ) + )