From 3727a126344ae1d0a5ca9727df0e67884800970f Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 23 Jul 2025 10:05:34 +0200 Subject: [PATCH] Add reordering and drag/drop for summary ensembles --- .../Summary/RimSummaryCaseMainCollection.cpp | 29 +++++++++++++++---- .../Summary/RimSummaryCaseMainCollection.h | 1 + .../UserInterface/RiuDragDrop.cpp | 14 +++++++-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index e4f888240b..c1b433b55c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -109,6 +109,7 @@ RimSummaryCaseMainCollection::RimSummaryCaseMainCollection() caf::PdmFieldReorderCapability::addToField( &m_cases ); CAF_PDM_InitFieldNoDefault( &m_ensembles, "SummaryCaseCollections", "" ); + caf::PdmFieldReorderCapability::addToField( &m_ensembles ); } //-------------------------------------------------------------------------------------------------- @@ -214,17 +215,25 @@ void RimSummaryCaseMainCollection::removeCases( std::vector& ca dataSourceHasChanged.send(); } +//-------------------------------------------------------------------------------------------------- +/// Lambda function to move an object in a child array field +//-------------------------------------------------------------------------------------------------- +auto moveObjectInChildArrayField = []( auto& childArrayField, auto* object, int destinationIndex ) +{ + auto currentIndex = childArrayField.indexOf( object ); + if ( currentIndex < childArrayField.size() ) + { + childArrayField.erase( currentIndex ); + childArrayField.insertAt( std::min( destinationIndex, static_cast( childArrayField.size() ) ), object ); + } +}; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCaseMainCollection::moveCase( RimSummaryCase* summaryCase, int destinationIndex ) { - auto currentIndex = m_cases.indexOf( summaryCase ); - if ( currentIndex < m_cases.size() ) - { - m_cases.erase( currentIndex ); - m_cases.insertAt( std::min( destinationIndex, (int)m_cases.size() ), summaryCase ); - } + moveObjectInChildArrayField( m_cases, summaryCase, destinationIndex ); } //-------------------------------------------------------------------------------------------------- @@ -264,6 +273,14 @@ RimSummaryEnsemble* RimSummaryCaseMainCollection::addEnsemble( const std::vector return ensemble; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseMainCollection::moveEnsemble( RimSummaryEnsemble* ensemble, int destinationIndex ) +{ + moveObjectInChildArrayField( m_ensembles, ensemble, destinationIndex ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h index e22c48c815..83c54645c0 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h @@ -68,6 +68,7 @@ public: std::function allocator = defaultAllocator ); void removeEnsemble( RimSummaryEnsemble* ensemble ); void addEnsemble( RimSummaryEnsemble* ensemble ); + void moveEnsemble( RimSummaryEnsemble* ensemble, int destinationIndex ); void loadAllSummaryCaseData(); diff --git a/ApplicationLibCode/UserInterface/RiuDragDrop.cpp b/ApplicationLibCode/UserInterface/RiuDragDrop.cpp index ccb41a7883..b6139b9c33 100644 --- a/ApplicationLibCode/UserInterface/RiuDragDrop.cpp +++ b/ApplicationLibCode/UserInterface/RiuDragDrop.cpp @@ -325,7 +325,8 @@ Qt::ItemFlags RiuDragDrop::flags( const QModelIndex& index ) const } else if ( dynamic_cast( uiItem ) ) { - if ( RiuTypedPdmObjects::containsTypedObjects( m_dragItems ) ) + if ( RiuTypedPdmObjects::containsTypedObjects( m_dragItems ) || + RiuTypedPdmObjects::containsTypedObjects( m_dragItems ) ) { itemflags |= Qt::ItemIsDropEnabled; } @@ -610,9 +611,9 @@ bool RiuDragDrop::handleSummaryCaseMainCollectionDrop( Qt::DropAction RimSummaryCaseMainCollection* summaryCaseDropTarget, int insertAtPosition ) { - std::vector summaryCases = RiuTypedPdmObjects::typedObjectsFromGroup( draggedObjects ); + if ( action != Qt::MoveAction ) return false; - if ( action != Qt::MoveAction || summaryCases.empty() ) return false; + std::vector summaryCases = RiuTypedPdmObjects::typedObjectsFromGroup( draggedObjects ); for ( RimSummaryCase* summaryCase : summaryCases ) { @@ -639,6 +640,13 @@ bool RiuDragDrop::handleSummaryCaseMainCollectionDrop( Qt::DropAction } } + auto ensembles = RiuTypedPdmObjects::typedObjectsFromGroup( draggedObjects ); + if ( ensembles.size() == 1 ) + { + auto ensemble = ensembles.front(); + summaryCaseDropTarget->moveEnsemble( ensemble, insertAtPosition ); + } + return true; }