Merge pull request #8888 from OPM/8887-fix-reorder-capability

Fix reorder capability
This commit is contained in:
Magne Sjaastad 2022-05-06 10:52:08 +02:00 committed by GitHub
parent 64c4adf5f0
commit 74075cc9ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 92 additions and 69 deletions

View File

@ -59,7 +59,7 @@ void RicEclipsePropertyFilterInsertExec::redo()
RimEclipsePropertyFilterCollection* propertyFilterCollection = nullptr;
m_propertyFilter->firstAncestorOrThisOfTypeAsserted( propertyFilterCollection );
size_t index = propertyFilterCollection->propertyFilters.index( m_propertyFilter );
size_t index = propertyFilterCollection->propertyFilters.indexOf( m_propertyFilter );
CVF_ASSERT( index < propertyFilterCollection->propertyFilters.size() );
RicEclipsePropertyFilterFeatureImpl::insertPropertyFilter( propertyFilterCollection, index );

View File

@ -144,7 +144,7 @@ std::vector<RicCreateMultipleFracturesOptionItemUi*> RiuCreateMultipleFractionsU
void RiuCreateMultipleFractionsUi::insertOptionItem( RicCreateMultipleFracturesOptionItemUi* insertAfterThisObject,
RicCreateMultipleFracturesOptionItemUi* objectToInsert )
{
size_t index = m_options.index( insertAfterThisObject );
size_t index = m_options.indexOf( insertAfterThisObject );
if ( index < m_options.size() - 1 )
{
m_options.insert( index + 1, objectToInsert );

View File

@ -59,7 +59,7 @@ void RicGeoMechPropertyFilterInsertExec::redo()
RimGeoMechPropertyFilterCollection* propertyFilterCollection = m_propertyFilter->parentContainer();
CVF_ASSERT( propertyFilterCollection );
size_t index = propertyFilterCollection->propertyFilters.index( m_propertyFilter );
size_t index = propertyFilterCollection->propertyFilters.indexOf( m_propertyFilter );
CVF_ASSERT( index < propertyFilterCollection->propertyFilters.size() );
RicGeoMechPropertyFilterFeatureImpl::insertPropertyFilter( propertyFilterCollection, index );

View File

@ -137,7 +137,7 @@ void RimUserDefinedPolylinesAnnotation::appendTarget( const cvf::Vec3d& defaultP
void RimUserDefinedPolylinesAnnotation::insertTarget( const RimPolylineTarget* targetToInsertBefore,
RimPolylineTarget* targetToInsert )
{
size_t index = m_targets.index( targetToInsertBefore );
size_t index = m_targets.indexOf( targetToInsertBefore );
if ( index < m_targets.size() )
m_targets.insert( index, targetToInsert );
else

View File

@ -263,7 +263,7 @@ std::vector<RimPolylineTarget*> RimPolygonFilter::activeTargets() const
//--------------------------------------------------------------------------------------------------
void RimPolygonFilter::insertTarget( const RimPolylineTarget* targetToInsertBefore, RimPolylineTarget* targetToInsert )
{
size_t index = m_targets.index( targetToInsertBefore );
size_t index = m_targets.indexOf( targetToInsertBefore );
if ( index < m_targets.size() )
m_targets.insert( index, targetToInsert );
else

View File

@ -160,7 +160,7 @@ QString RimFishbones::generatedName() const
dynamic_cast<caf::PdmChildArrayField<RimFishbones*>*>( this->parentField() );
CVF_ASSERT( container );
size_t index = container->index( this ) + 1;
size_t index = container->indexOf( this ) + 1;
return QString( "Fishbone %1" ).arg( index );
}

View File

@ -247,7 +247,7 @@ size_t RimDepthTrackPlot::plotCount() const
//--------------------------------------------------------------------------------------------------
size_t RimDepthTrackPlot::plotIndex( const RimWellLogTrack* plot ) const
{
return m_plots.index( plot );
return m_plots.indexOf( plot );
}
//--------------------------------------------------------------------------------------------------

View File

@ -308,7 +308,7 @@ size_t RimMultiPlot::plotCount() const
//--------------------------------------------------------------------------------------------------
size_t RimMultiPlot::plotIndex( const RimPlot* plot ) const
{
return m_plots.index( plot );
return m_plots.indexOf( plot );
}
//--------------------------------------------------------------------------------------------------

View File

@ -71,7 +71,7 @@ std::vector<RimPressureTableItem*> RimPressureTable::items() const
//--------------------------------------------------------------------------------------------------
void RimPressureTable::insertItem( RimPressureTableItem* insertBefore, RimPressureTableItem* item )
{
size_t index = m_pressureTableItems.index( insertBefore );
size_t index = m_pressureTableItems.indexOf( insertBefore );
item->changed.connect( this, &RimPressureTable::onTableChanged );
if ( index < m_pressureTableItems.size() )
m_pressureTableItems.insert( index, item );

View File

@ -513,7 +513,7 @@ void RimSurfaceCollection::deleteSubCollection( const QString& name )
auto coll = getSubCollection( name );
if ( coll )
{
auto index = m_subCollections.index( coll );
auto index = m_subCollections.indexOf( coll );
m_subCollections.erase( index );
}
}

View File

@ -1176,7 +1176,7 @@ void RimWellLogTrack::insertCurve( RimWellLogCurve* curve, size_t index )
//--------------------------------------------------------------------------------------------------
void RimWellLogTrack::removeCurve( RimWellLogCurve* curve )
{
size_t index = m_curves.index( curve );
size_t index = m_curves.indexOf( curve );
if ( index < m_curves.size() )
{
m_curves[index]->detach();
@ -2014,7 +2014,7 @@ caf::PdmFieldHandle* RimWellLogTrack::userDescriptionField()
//--------------------------------------------------------------------------------------------------
size_t RimWellLogTrack::curveIndex( RimWellLogCurve* curve )
{
return m_curves.index( curve );
return m_curves.indexOf( curve );
}
//--------------------------------------------------------------------------------------------------

View File

@ -129,7 +129,7 @@ bool RimWellMeasurementCollection::isEmpty() const
//--------------------------------------------------------------------------------------------------
void RimWellMeasurementCollection::insertMeasurement( RimWellMeasurement* insertBefore, RimWellMeasurement* measurement )
{
size_t index = m_measurements.index( insertBefore );
size_t index = m_measurements.indexOf( insertBefore );
if ( index < m_measurements.size() )
m_measurements.insert( index, measurement );
else

View File

@ -82,7 +82,7 @@ std::vector<RimWellPathAttribute*> RimWellPathAttributeCollection::attributes()
//--------------------------------------------------------------------------------------------------
void RimWellPathAttributeCollection::insertAttribute( RimWellPathAttribute* insertBefore, RimWellPathAttribute* attribute )
{
size_t index = m_attributes.index( insertBefore );
size_t index = m_attributes.indexOf( insertBefore );
if ( index < m_attributes.size() )
m_attributes.insert( index, attribute );
else

View File

@ -375,7 +375,7 @@ std::pair<RimWellPathTarget*, RimWellPathTarget*>
//--------------------------------------------------------------------------------------------------
void RimWellPathGeometryDef::insertTarget( const RimWellPathTarget* targetToInsertBefore, RimWellPathTarget* targetToInsert )
{
size_t index = m_wellTargets.index( targetToInsertBefore );
size_t index = m_wellTargets.indexOf( targetToInsertBefore );
if ( index < m_wellTargets.size() )
m_wellTargets.insert( index, targetToInsert );
else

View File

@ -69,6 +69,7 @@ public:
void insertAt( int indexAfter, std::unique_ptr<PdmObjectHandle> obj );
PdmObjectHandle* at( size_t index ) override;
void setValue( const std::vector<DataType*>& objects );
size_t indexOf( const PdmObjectHandle* obj ) const override;
virtual void deleteAllChildObjectsAsync();
@ -85,8 +86,7 @@ public:
void insert( size_t indexAfter, const std::vector<PdmPointer<DataType>>& objects );
size_t count( const DataType* pointer ) const;
void erase( size_t index ) override;
size_t index( const DataType* pointer ) const;
void erase( size_t index ) override;
typename std::vector<PdmPointer<DataType>>::iterator begin() { return m_pointers.begin(); };
typename std::vector<PdmPointer<DataType>>::iterator end() { return m_pointers.end(); };

View File

@ -138,6 +138,23 @@ size_t PdmChildArrayField<DataType*>::count( const DataType* pointer ) const
return itemCount;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
size_t PdmChildArrayField<DataType*>::indexOf( const PdmObjectHandle* obj ) const
{
for ( size_t i = 0; i < m_pointers.size(); ++i )
{
if ( obj == m_pointers[i].rawPtr() )
{
return i;
}
}
return ( size_t )( -1 ); // Undefined size_t > m_pointers.size();
}
//--------------------------------------------------------------------------------------------------
/// Empty the container without deleting the objects pointed to.
//--------------------------------------------------------------------------------------------------
@ -196,23 +213,6 @@ void PdmChildArrayField<DataType*>::erase( size_t index )
m_pointers.erase( m_pointers.begin() + index );
}
//--------------------------------------------------------------------------------------------------
/// Get the index of the given object pointer
//--------------------------------------------------------------------------------------------------
template <typename DataType>
size_t PdmChildArrayField<DataType*>::index( const DataType* pointer ) const
{
for ( size_t i = 0; i < m_pointers.size(); ++i )
{
if ( pointer == m_pointers[i].p() )
{
return i;
}
}
return ( size_t )( -1 ); // Undefined size_t > m_pointers.size();
}
//--------------------------------------------------------------------------------------------------
/// Assign objects to the field, replacing the current child objects
//--------------------------------------------------------------------------------------------------

View File

@ -189,3 +189,11 @@ PdmFieldReorderCapability* PdmFieldReorderCapability::reorderCapabilityOfParentC
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t PdmFieldReorderCapability::indexOf( PdmObjectHandle* pdmObject )
{
return m_field->indexOf( pdmObject );
}

View File

@ -51,6 +51,8 @@ public:
public:
PdmFieldReorderCapability( PdmPtrArrayFieldHandle* field, bool giveOwnership );
size_t indexOf( PdmObjectHandle* pdmObject );
bool canItemBeMovedUp( size_t index ) const;
bool canItemBeMovedDown( size_t index ) const;

View File

@ -50,11 +50,12 @@ public:
// Reimplementation of PdmPointersFieldHandle methods
virtual size_t size() const { return m_pointers.size(); }
virtual bool empty() const { return m_pointers.empty(); }
virtual void clear();
virtual void insertAt( int indexAfter, PdmObjectHandle* obj );
virtual PdmObjectHandle* at( size_t index );
size_t size() const override { return m_pointers.size(); }
bool empty() const override { return m_pointers.empty(); }
void clear() override;
void insertAt( int indexAfter, PdmObjectHandle* obj ) override;
PdmObjectHandle* at( size_t index ) override;
size_t indexOf( const PdmObjectHandle* obj ) const override;
// std::vector-like access
@ -66,9 +67,8 @@ public:
void insert( size_t indexAfter, const std::vector<PdmPointer<DataType>>& objects );
size_t count( const DataType* pointer ) const;
void erase( size_t index );
size_t index( DataType* pointer );
void removePtr( PdmObjectHandle* object );
void erase( size_t index ) override;
void removePtr( PdmObjectHandle* object );
typename std::vector<PdmPointer<DataType>>::iterator begin() { return m_pointers.begin(); };
typename std::vector<PdmPointer<DataType>>::iterator end() { return m_pointers.end(); };
@ -79,7 +79,7 @@ public:
std::vector<DataType*> ptrReferencedObjects() const;
// Child objects
virtual void ptrReferencedObjects( std::vector<PdmObjectHandle*>* );
void ptrReferencedObjects( std::vector<PdmObjectHandle*>* ) override;
private: // To be disabled
PDM_DISABLE_COPY_AND_ASSIGN( PdmPtrArrayField );

View File

@ -140,6 +140,23 @@ size_t PdmPtrArrayField<DataType*>::count( const DataType* pointer ) const
return itemCount;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename DataType>
size_t PdmPtrArrayField<DataType*>::indexOf( const PdmObjectHandle* obj ) const
{
for ( size_t i = 0; i < m_pointers.size(); ++i )
{
if ( obj == m_pointers[i].rawPtr() )
{
return i;
}
}
return ( size_t )( -1 ); // Undefined size_t > m_pointers.size();
}
//--------------------------------------------------------------------------------------------------
/// Empty the container without deleting the objects pointed to.
//--------------------------------------------------------------------------------------------------
@ -170,23 +187,6 @@ void PdmPtrArrayField<DataType*>::erase( size_t index )
m_pointers.erase( m_pointers.begin() + index );
}
//--------------------------------------------------------------------------------------------------
/// Get the index of the given object pointer
//--------------------------------------------------------------------------------------------------
template <typename DataType>
size_t PdmPtrArrayField<DataType*>::index( DataType* pointer )
{
for ( size_t i = 0; i < m_pointers.size(); ++i )
{
if ( pointer == m_pointers[i].p() )
{
return i;
}
}
return ( size_t )( -1 ); // Undefined size_t > m_pointers.size();
}
//--------------------------------------------------------------------------------------------------
/// Removes all instances of object pointer from the container without deleting the object.
//--------------------------------------------------------------------------------------------------

View File

@ -20,6 +20,7 @@ public:
virtual void clear() = 0;
virtual void insertAt( int indexAfter, PdmObjectHandle* obj ) = 0;
virtual void erase( size_t index ) = 0;
virtual size_t indexOf( const PdmObjectHandle* obj ) const = 0;
virtual PdmObjectHandle* at( size_t index ) = 0;
};

View File

@ -605,12 +605,12 @@ void PdmUiTreeViewEditor::updateItemDelegateForSubTree( const QModelIndex& subRo
if ( reorderability && filterIndex.row() >= 0 && selection.size() == 1u && selection.front() == uiItem )
{
size_t indexInParent = static_cast<size_t>( filterIndex.row() );
size_t indexInParentField = reorderability->indexOf( pdmObject );
{
auto tag = PdmUiTreeViewItemAttribute::Tag::create();
tag->icon = caf::IconProvider( ":/caf/Up16x16.png" );
tag->selectedOnly = true;
if ( reorderability->canItemBeMovedUp( indexInParent ) )
if ( reorderability->canItemBeMovedUp( indexInParentField ) )
{
tag->clicked.connect( reorderability, &PdmFieldReorderCapability::onMoveItemUp );
}
@ -625,7 +625,7 @@ void PdmUiTreeViewEditor::updateItemDelegateForSubTree( const QModelIndex& subRo
auto tag = PdmUiTreeViewItemAttribute::Tag::create();
tag->icon = IconProvider( ":/caf/Down16x16.png" );
tag->selectedOnly = true;
if ( reorderability->canItemBeMovedDown( indexInParent ) )
if ( reorderability->canItemBeMovedDown( indexInParentField ) )
{
tag->clicked.connect( reorderability, &PdmFieldReorderCapability::onMoveItemDown );
}

View File

@ -268,22 +268,34 @@ bool PdmUiTreeViewItemDelegate::editorEvent( QEvent* event,
{
if ( event->type() == QEvent::MouseButtonPress )
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>( event );
auto* mouseEvent = static_cast<QMouseEvent*>( event );
if ( mouseEvent->button() == Qt::LeftButton && mouseEvent->modifiers() == Qt::NoModifier )
{
const PdmUiTreeViewItemAttribute::Tag* tag;
if ( tagClicked( mouseEvent->pos(), option.rect, itemIndex, &tag ) )
{
QModelIndex parentIndex = itemIndex.parent();
auto uiItem = m_treeView->uiItemFromModelIndex( itemIndex );
auto uiItem = m_treeView->uiItemFromModelIndex( itemIndex );
auto* uiObjectHandle = dynamic_cast<PdmUiObjectHandle*>( uiItem );
if ( uiObjectHandle )
{
PdmObjectHandle* pdmObject = uiObjectHandle->objectHandle();
if ( pdmObject )
{
PdmFieldReorderCapability* reorderability =
PdmFieldReorderCapability::reorderCapabilityOfParentContainer( pdmObject );
size_t indexInParent = reorderability->indexOf( pdmObject );
tag->clicked.send( indexInParent );
}
}
auto parentIndex = itemIndex.parent();
auto parentUiItem = m_treeView->uiItemFromModelIndex( parentIndex );
tag->clicked.send( (size_t)itemIndex.row() );
m_treeView->updateSubTree( parentUiItem );
m_treeView->selectAsCurrentItem( uiItem );
return true;
}
}