Make it possible to remove fields

This commit is contained in:
Magne Sjaastad
2024-10-11 11:58:25 +02:00
parent d40b240830
commit 706eb31003
4 changed files with 75 additions and 32 deletions

View File

@@ -37,6 +37,12 @@ RimFieldQuickAccess::RimFieldQuickAccess()
CAF_PDM_InitField( &m_selectObjectButton, "SelectObject", false, "...", ":/Bullet.png", "Select Object in Property Editor" ); CAF_PDM_InitField( &m_selectObjectButton, "SelectObject", false, "...", ":/Bullet.png", "Select Object in Property Editor" );
m_selectObjectButton.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() ); m_selectObjectButton.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() );
m_selectObjectButton.xmlCapability()->disableIO(); m_selectObjectButton.xmlCapability()->disableIO();
CAF_PDM_InitField( &m_removeObjectButton, "RemoveObject", false, "...", ":/Erase.svg", "Remove Item" );
m_removeObjectButton.uiCapability()->setUiEditorTypeName( caf::PdmUiToolButtonEditor::uiEditorTypeName() );
m_removeObjectButton.xmlCapability()->disableIO();
m_toBeDeleted = false;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -59,7 +65,8 @@ void RimFieldQuickAccess::defineUiOrdering( QString uiConfigName, caf::PdmUiOrde
uiOrdering.add( m_fieldReference()->field() ); uiOrdering.add( m_fieldReference()->field() );
} }
uiOrdering.add( &m_selectObjectButton ); uiOrdering.add( &m_selectObjectButton, { .newRow = false } );
uiOrdering.add( &m_removeObjectButton, { .newRow = false } );
uiOrdering.skipRemainingFields(); uiOrdering.skipRemainingFields();
} }
@@ -77,9 +84,9 @@ caf::PdmFieldHandle* RimFieldQuickAccess::field() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
caf::PdmFieldHandle* RimFieldQuickAccess::selectObjectButton() bool RimFieldQuickAccess::toBeDeleted() const
{ {
return &m_selectObjectButton; return m_toBeDeleted;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -99,4 +106,11 @@ void RimFieldQuickAccess::fieldChangedByUi( const caf::PdmFieldHandle* changedFi
} }
} }
} }
if ( changedField == &m_removeObjectButton )
{
m_removeObjectButton = false;
m_toBeDeleted = true;
}
} }

View File

@@ -42,7 +42,7 @@ public:
void setField( caf::PdmFieldHandle* field ); void setField( caf::PdmFieldHandle* field );
caf::PdmFieldHandle* field() const; caf::PdmFieldHandle* field() const;
caf::PdmFieldHandle* selectObjectButton(); bool toBeDeleted() const;
private: private:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
@@ -51,4 +51,6 @@ private:
caf::PdmChildField<RimFieldReference*> m_fieldReference; caf::PdmChildField<RimFieldReference*> m_fieldReference;
caf::PdmField<bool> m_selectObjectButton; caf::PdmField<bool> m_selectObjectButton;
caf::PdmField<bool> m_removeObjectButton;
bool m_toBeDeleted;
}; };

View File

@@ -18,6 +18,8 @@
#include "RimPinnedFieldCollection.h" #include "RimPinnedFieldCollection.h"
#include "RiaApplication.h"
#include "RimFieldQuickAccess.h" #include "RimFieldQuickAccess.h"
#include "RimProject.h" #include "RimProject.h"
@@ -78,8 +80,7 @@ void RimPinnedFieldCollection::removeField( caf::PdmFieldHandle* field )
{ {
if ( field == fieldRef->field() ) if ( field == fieldRef->field() )
{ {
m_fieldReferences.removeChild( fieldRef ); m_toBeDeleted.insert( fieldRef );
delete fieldRef;
return; return;
} }
} }
@@ -90,9 +91,13 @@ void RimPinnedFieldCollection::removeField( caf::PdmFieldHandle* field )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimPinnedFieldCollection::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimPinnedFieldCollection::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
std::map<caf::PdmObjectHandle*, std::vector<RimFieldQuickAccess*>> fieldMap; auto activeView = RiaApplication::instance()->activeGridView();
if ( !activeView ) return;
deleteMarkedObjects();
std::vector<RimFieldQuickAccess*> fieldsForView;
// Group fields by object
for ( auto fieldRef : m_fieldReferences ) for ( auto fieldRef : m_fieldReferences )
{ {
if ( !fieldRef ) continue; if ( !fieldRef ) continue;
@@ -101,37 +106,55 @@ void RimPinnedFieldCollection::defineUiOrdering( QString uiConfigName, caf::PdmU
{ {
if ( auto ownerObject = field->ownerObject() ) if ( auto ownerObject = field->ownerObject() )
{ {
fieldMap[ownerObject].push_back( fieldRef ); auto view = ownerObject->firstAncestorOrThisOfType<RimGridView>();
} if ( view != activeView )
}
}
int groupId = 1;
// Create ui ordering with a group containing fields for each object
for ( auto& pair : fieldMap )
{ {
auto object = pair.first; continue;
auto fieldRefs = pair.second; }
fieldsForView.push_back( fieldRef );
}
}
}
if ( fieldsForView.empty() ) return;
QString groupName; QString groupName;
auto uiCapability = object->uiCapability(); auto uiCapability = activeView->uiCapability();
if ( uiCapability->userDescriptionField() && uiCapability->userDescriptionField()->uiCapability() ) if ( uiCapability->userDescriptionField() && uiCapability->userDescriptionField()->uiCapability() )
{ {
groupName = uiCapability->userDescriptionField()->uiCapability()->uiValue().toString(); groupName = uiCapability->userDescriptionField()->uiCapability()->uiValue().toString();
} }
else else
{ {
groupName = "Group " + QString::number( groupId ); groupName = "Group ";
} }
auto group = uiOrdering.addNewGroup( groupName ); auto group = uiOrdering.addNewGroup( groupName );
groupId++;
for ( auto fieldRef : fieldRefs ) for ( auto fieldRef : fieldsForView )
{ {
group->add( fieldRef->field() ); fieldRef->uiOrdering( uiConfigName, *group );
group->add( fieldRef->selectObjectButton(), { .newRow = false } );
}
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPinnedFieldCollection::deleteMarkedObjects()
{
for ( auto fieldRef : m_fieldReferences )
{
if ( fieldRef->toBeDeleted() )
{
m_toBeDeleted.insert( fieldRef );
}
}
for ( auto fieldRef : m_toBeDeleted )
{
m_fieldReferences.removeChild( fieldRef );
delete fieldRef;
}
m_toBeDeleted.clear();
}

View File

@@ -43,6 +43,10 @@ public:
private: private:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void deleteMarkedObjects();
private: private:
caf::PdmChildArrayField<RimFieldQuickAccess*> m_fieldReferences; caf::PdmChildArrayField<RimFieldQuickAccess*> m_fieldReferences;
std::set<RimFieldQuickAccess*> m_toBeDeleted;
}; };