diff --git a/Changes.md b/Changes.md index fd4f9fd6245..063873a4767 100644 --- a/Changes.md +++ b/Changes.md @@ -11,6 +11,7 @@ Improvements - Grouped display can be enabled by default in a startup file by using `Gaffer.Metadata.registerValue( GafferSceneUI.RenderPassEditor.Settings, "displayGrouped", "userDefault", IECore.BoolData( True ) )`. - Dragging cells selected from the "Name" column now provides a list of the selected render pass names, rather than their paths. - Disabled render pass names are now dimmed to more clearly indicate their state. +- RenderPassEditor, LightEditor, PathListingWidget : Boolean values are now displayed as checkboxes rather than `0` or `1`. API --- diff --git a/src/GafferUIModule/PathListingWidgetBinding.cpp b/src/GafferUIModule/PathListingWidgetBinding.cpp index 63b1b730f05..3959cc6f681 100644 --- a/src/GafferUIModule/PathListingWidgetBinding.cpp +++ b/src/GafferUIModule/PathListingWidgetBinding.cpp @@ -294,10 +294,27 @@ QVariant dataToVariant( const IECore::Data *value, int role ) } } + if( role == Qt::CheckStateRole ) + { + if( auto d = IECore::runTimeCast( value ) ) + { + return d->readable() ? Qt::Checked : Qt::Unchecked; + } + return QVariant(); + } + switch( value->typeId() ) { case IECore::StringDataTypeId : return static_cast( value )->readable().c_str(); + case IECore::BoolDataTypeId : + if( role == Qt::DisplayRole ) + { + // We'll be displaying this as a checkbox via CheckStateRole - no + // need to display the value as text as well. + return QVariant(); + } + return static_cast( value )->readable(); case IECore::IntDataTypeId : return static_cast( value )->readable(); case IECore::UIntDataTypeId : @@ -339,11 +356,15 @@ QVariant dataToVariant( const IECore::Data *value, int role ) struct CellVariants { + static constexpr Qt::ItemDataRole SortRole = Qt::UserRole; + CellVariants( const GafferUI::PathColumn::CellData &cellData ) : m_display( dataToVariant( cellData.value.get(), Qt::DisplayRole ) ), + m_checkState( dataToVariant( cellData.value.get(), Qt::CheckStateRole ) ), m_decoration( dataToVariant( cellData.icon.get(), Qt::DecorationRole ) ), m_background( dataToVariant( cellData.background.get(), Qt::BackgroundRole ) ), m_toolTip( dataToVariant( cellData.toolTip.get(), Qt::ToolTipRole ) ), + m_sort( m_display.isValid() ? m_display : m_checkState ), m_foreground( dataToVariant( cellData.foreground.get(), Qt::ForegroundRole ) ) { } @@ -358,12 +379,16 @@ struct CellVariants { case Qt::DisplayRole : return m_display; + case Qt::CheckStateRole : + return m_checkState; case Qt::DecorationRole : return m_decoration; case Qt::BackgroundRole : return m_background; case Qt::ToolTipRole : return m_toolTip; + case SortRole : + return m_sort; case Qt::ForegroundRole : return m_foreground; default : @@ -375,6 +400,7 @@ struct CellVariants { return m_display == rhs.m_display && + m_checkState == rhs.m_checkState && m_decoration == rhs.m_decoration && m_background == rhs.m_background && m_toolTip == rhs.m_toolTip && @@ -385,9 +411,11 @@ struct CellVariants private : QVariant m_display; + QVariant m_checkState; QVariant m_decoration; QVariant m_background; QVariant m_toolTip; + QVariant m_sort; QVariant m_foreground; }; @@ -1280,7 +1308,7 @@ class PathModel : public QAbstractItemModel { return QVariant(); } - return data[model->m_sortColumn].variant( Qt::DisplayRole ); + return data[model->m_sortColumn].variant( CellVariants::SortRole ); } // Updates data and returns the value that should be used for sorting.