From 6791beeb6207ec87a76bc387288c7d7df3a44598 Mon Sep 17 00:00:00 2001 From: Murray Stevenson <50844517+murraystevenson@users.noreply.github.com> Date: Fri, 8 Dec 2023 12:12:11 -0800 Subject: [PATCH] SetEditor : Add custom columns to display Members and Selection This is in order to define header and cell tooltips, maybe in the future we'll be able to do this directly for header tooltips via StandardPathColumn. --- python/GafferSceneUI/SetEditor.py | 4 +- src/GafferSceneUIModule/SetEditorBinding.cpp | 96 ++++++++++++++++++++ 2 files changed, 98 insertions(+), 2 deletions(-) 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 >() ) ;