diff --git a/python/GafferSceneUI/SetEditor.py b/python/GafferSceneUI/SetEditor.py index 472603f6f0b..6dc344ecaa3 100644 --- a/python/GafferSceneUI/SetEditor.py +++ b/python/GafferSceneUI/SetEditor.py @@ -75,8 +75,8 @@ def __init__( self, scriptNode, **kw ) : GafferUI.BasicPathFilterWidget( emptySetFilter ) GafferUI.BasicPathFilterWidget( emptySelectionFilter ) - self.__setMembersColumn = GafferUI.StandardPathColumn( "Members", "setPath:memberCount" ) - self.__selectedSetMembersColumn = GafferUI.StandardPathColumn( "Selection", "setPath:selectedMemberCount" ) + self.__setMembersColumn = _GafferSceneUI._SetEditor.SetMembersColumn() + self.__selectedSetMembersColumn = _GafferSceneUI._SetEditor.SetSelectionColumn() self.__includedSetMembersColumn = _GafferSceneUI._SetEditor.VisibleSetInclusionsColumn( scriptNode.context() ) self.__excludedSetMembersColumn = _GafferSceneUI._SetEditor.VisibleSetExclusionsColumn( scriptNode.context() ) self.__pathListing = GafferUI.PathListingWidget( diff --git a/src/GafferSceneUIModule/SetEditorBinding.cpp b/src/GafferSceneUIModule/SetEditorBinding.cpp index fc93f2f295a..39c2411d7da 100644 --- a/src/GafferSceneUIModule/SetEditorBinding.cpp +++ b/src/GafferSceneUIModule/SetEditorBinding.cpp @@ -62,6 +62,8 @@ #include "boost/bind/bind.hpp" #include "boost/container/flat_set.hpp" +#include "fmt/format.h" + using namespace std; using namespace boost::placeholders; using namespace boost::python; @@ -432,6 +434,92 @@ class SetNameColumn : public StandardPathColumn }; +////////////////////////////////////////////////////////////////////////// +// SetMembersColumn +////////////////////////////////////////////////////////////////////////// + +class SetMembersColumn : public StandardPathColumn +{ + + public : + + IE_CORE_DECLAREMEMBERPTR( SetMembersColumn ) + + SetMembersColumn() + : StandardPathColumn( "Members", g_memberCountPropertyName ) + { + } + + CellData cellData( const Gaffer::Path &path, const IECore::Canceller *canceller ) const override + { + CellData result = StandardPathColumn::cellData( path, canceller ); + if( const auto setName = runTimeCast( path.property( g_setNamePropertyName, canceller ) ) ) + { + const auto memberCount = runTimeCast( path.property( g_memberCountPropertyName, canceller ) ); + const auto count = memberCount ? memberCount->readable() : 0; + result.toolTip = new IECore::StringData( + fmt::format( "{} scene location{} of {}", + count, count == 1 ? " is a member" : "s are members", setName->readable() + ) + ); + } + + return result; + } + + CellData headerData( const IECore::Canceller *canceller ) const override + { + CellData result = StandardPathColumn::headerData( canceller ); + result.toolTip = new IECore::StringData( "The number of scene locations that are set members" ); + + return result; + } + +}; + +////////////////////////////////////////////////////////////////////////// +// SetSelectionColumn +////////////////////////////////////////////////////////////////////////// + +class SetSelectionColumn : public StandardPathColumn +{ + + public : + + IE_CORE_DECLAREMEMBERPTR( SetSelectionColumn ) + + SetSelectionColumn() + : StandardPathColumn( "Selection", g_selectedMemberCountPropertyName ) + { + } + + CellData cellData( const Gaffer::Path &path, const IECore::Canceller *canceller ) const override + { + CellData result = StandardPathColumn::cellData( path, canceller ); + if( const auto setName = runTimeCast( path.property( g_setNamePropertyName, canceller ) ) ) + { + const auto selectedMemberCount = runTimeCast( path.property( g_selectedMemberCountPropertyName, canceller ) ); + const auto count = selectedMemberCount ? selectedMemberCount->readable() : 0; + result.toolTip = new IECore::StringData( + fmt::format( "{} selected scene location{} of {}", + count, count == 1 ? " is a member or descendant" : "s are members and/or descendants", setName->readable() + ) + ); + } + + return result; + } + + CellData headerData( const IECore::Canceller *canceller ) const override + { + CellData result = StandardPathColumn::headerData( canceller ); + result.toolTip = new IECore::StringData( "The number of selected scene locations that are set members, or their descendants" ); + + return result; + } + +}; + ////////////////////////////////////////////////////////////////////////// // VisibleSetInclusionsColumn - displays and modifies inclusions membership // of the VisibleSet in the provided context. @@ -1060,6 +1148,14 @@ void GafferSceneUIModule::bindSetEditor() .def( init<>() ) ; + RefCountedClass( "SetMembersColumn" ) + .def( init<>() ) + ; + + RefCountedClass( "SetSelectionColumn" ) + .def( init<>() ) + ; + RefCountedClass( "VisibleSetInclusionsColumn" ) .def( init< ContextPtr >() ) ;