From 76ee0c396d79a7462e2935b3449170a69b787cc7 Mon Sep 17 00:00:00 2001 From: Murray Stevenson <50844517+murraystevenson@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:31:28 -0700 Subject: [PATCH] UIEditor : Add support for editing `iconScale` node metadata --- Changes.md | 8 ++++++ python/GafferUI/MetadataWidget.py | 44 +++++++++++++++++++++++++++++-- python/GafferUI/UIEditor.py | 6 +++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Changes.md b/Changes.md index 489da23c28b..2a0c99a8ca2 100644 --- a/Changes.md +++ b/Changes.md @@ -1,7 +1,15 @@ 1.4.x.x (relative to 1.4.11.0) ======= +Improvements +------------ + +- UI Editor : Added the ability to edit the scale of node icons. + +API +--- +- MetadataWidget : Added `NumericMetadataWidget` class. 1.4.11.0 (relative to 1.4.10.0) ======== diff --git a/python/GafferUI/MetadataWidget.py b/python/GafferUI/MetadataWidget.py index 8f7ce719f14..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 @@ -347,3 +347,43 @@ def __buttonClicked( self, widget ) : if chosenPath is not None : self.__path.setFromString( str( chosenPath ) ) self.__editingFinished() + +class NumericMetadataWidget( MetadataWidget ) : + + 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.valueChangedSignal().connect( + Gaffer.WeakMethod( self.__valueChanged ), scoped = False + ) + + def numericWidget( self ) : + + return self.__numericWidget + + def _updateFromValue( self, value ) : + + self.__numericWidget.setValue( type( self.__defaultValue )( value ) ) + + def __valueChanged( self, widget, reason ) : + + 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 ) + ) diff --git a/python/GafferUI/UIEditor.py b/python/GafferUI/UIEditor.py index d794cce4e25..19aa629ce4d 100644 --- a/python/GafferUI/UIEditor.py +++ b/python/GafferUI/UIEditor.py @@ -111,6 +111,12 @@ def __init__( self, scriptNode, **kw ) : MetadataWidget.FileSystemPathMetadataWidget( key = "icon" ) ) + GafferUI.Label( "Scale" ) + + scaleWidget = MetadataWidget.NumericMetadataWidget( key = "iconScale", defaultValue = 1.5 ) + scaleWidget.numericWidget()._qtWidget().setMaximumWidth( 60 ) + self.__nodeMetadataWidgets.append( scaleWidget ) + with _Row() as self.__plugAddButtons : _Label( "Plug Creators" )