mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Toggle Action Performance : Send fieldChanged() only once
fieldChanged() can potentially do much work. When toggling objects in the project tree, make sure that fieldChanged is called only once for a toggle operation. This will make sure that we have the best possible performance in all use cases.
This commit is contained in:
parent
296ddbde42
commit
e426364fd5
@ -67,10 +67,9 @@ bool RicToggleItemsFeatureImpl::isToggleCommandsAvailable()
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( size_t i = 0; i < selectedItems.size(); ++i )
|
||||
for ( auto& selectedItem : selectedItems )
|
||||
{
|
||||
caf::PdmUiObjectHandle* uiObjectHandle = dynamic_cast<caf::PdmUiObjectHandle*>( selectedItems[i] );
|
||||
|
||||
auto* uiObjectHandle = dynamic_cast<caf::PdmUiObjectHandle*>( selectedItem );
|
||||
if ( uiObjectHandle && uiObjectHandle->objectToggleField() )
|
||||
{
|
||||
return true;
|
||||
@ -100,55 +99,26 @@ bool RicToggleItemsFeatureImpl::isToggleCommandsForSubItems()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection( SelectionToggleType state )
|
||||
{
|
||||
std::vector<caf::PdmUiItem*> selectedItems;
|
||||
caf::SelectionManager::instance()->selectedItems( selectedItems );
|
||||
if ( state != TOGGLE && selectedItems.size() == 1 )
|
||||
auto fields = findToggleFieldsFromSelection( state );
|
||||
if ( fields.empty() ) return;
|
||||
|
||||
auto lastField = fields.back();
|
||||
for ( auto field : fields )
|
||||
{
|
||||
// If only one item is selected, loop over its children, and toggle them instead of the
|
||||
// selected item directly
|
||||
bool value = !( field->v() );
|
||||
|
||||
// We need to get the children through the tree view, because that is where the actually shown children is
|
||||
if ( state == TOGGLE_ON )
|
||||
value = true;
|
||||
else if ( state == TOGGLE_OFF )
|
||||
value = false;
|
||||
|
||||
caf::PdmUiTreeOrdering* treeItem = findTreeItemFromSelectedUiItem( selectedItems[0] );
|
||||
|
||||
if ( !treeItem ) return;
|
||||
|
||||
for ( int cIdx = 0; cIdx < treeItem->childCount(); ++cIdx )
|
||||
if ( field == lastField )
|
||||
{
|
||||
caf::PdmUiTreeOrdering* child = treeItem->child( cIdx );
|
||||
if ( !child ) continue;
|
||||
if ( !child->isRepresentingObject() ) continue;
|
||||
|
||||
caf::PdmObjectHandle* childObj = child->object();
|
||||
caf::PdmUiObjectHandle* uiObjectHandleChild = uiObj( childObj );
|
||||
|
||||
if ( uiObjectHandleChild && uiObjectHandleChild->objectToggleField() )
|
||||
{
|
||||
caf::PdmField<bool>* field = dynamic_cast<caf::PdmField<bool>*>( uiObjectHandleChild->objectToggleField() );
|
||||
|
||||
if ( state == TOGGLE_ON ) field->setValueWithFieldChanged( true );
|
||||
if ( state == TOGGLE_OFF ) field->setValueWithFieldChanged( false );
|
||||
if ( state == TOGGLE_SUBITEMS ) field->setValueWithFieldChanged( !( field->v() ) );
|
||||
}
|
||||
field->setValueWithFieldChanged( value );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( size_t i = 0; i < selectedItems.size(); ++i )
|
||||
else
|
||||
{
|
||||
caf::PdmUiObjectHandle* uiObjectHandle = dynamic_cast<caf::PdmUiObjectHandle*>( selectedItems[i] );
|
||||
|
||||
if ( uiObjectHandle && uiObjectHandle->objectToggleField() )
|
||||
{
|
||||
caf::PdmField<bool>* field = dynamic_cast<caf::PdmField<bool>*>( uiObjectHandle->objectToggleField() );
|
||||
|
||||
if ( state == TOGGLE_ON ) field->setValueWithFieldChanged( true );
|
||||
if ( state == TOGGLE_OFF ) field->setValueWithFieldChanged( false );
|
||||
if ( state == TOGGLE_SUBITEMS || state == TOGGLE )
|
||||
{
|
||||
field->setValueWithFieldChanged( !( field->v() ) );
|
||||
}
|
||||
}
|
||||
field->setValue( value );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -160,7 +130,7 @@ caf::PdmUiTreeView* RicToggleItemsFeatureImpl::findTreeView( const caf::PdmUiIte
|
||||
{
|
||||
RiaFeatureCommandContext* context = RiaFeatureCommandContext::instance();
|
||||
|
||||
caf::PdmUiTreeView* customActiveTreeView = dynamic_cast<caf::PdmUiTreeView*>( context->object() );
|
||||
auto* customActiveTreeView = dynamic_cast<caf::PdmUiTreeView*>( context->object() );
|
||||
if ( customActiveTreeView )
|
||||
{
|
||||
return customActiveTreeView;
|
||||
@ -197,3 +167,57 @@ caf::PdmUiTreeOrdering* RicToggleItemsFeatureImpl::findTreeItemFromSelectedUiIte
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<caf::PdmField<bool>*> RicToggleItemsFeatureImpl::findToggleFieldsFromSelection( SelectionToggleType state )
|
||||
{
|
||||
std::vector<caf::PdmField<bool>*> fields;
|
||||
|
||||
std::vector<caf::PdmUiItem*> selectedItems;
|
||||
caf::SelectionManager::instance()->selectedItems( selectedItems );
|
||||
if ( state != TOGGLE && selectedItems.size() == 1 )
|
||||
{
|
||||
// If only one item is selected, loop over its children, and toggle them instead of the
|
||||
// selected item directly
|
||||
|
||||
// We need to get the children through the tree view, because that is where the actually shown children is
|
||||
|
||||
caf::PdmUiTreeOrdering* treeItem = findTreeItemFromSelectedUiItem( selectedItems[0] );
|
||||
|
||||
if ( !treeItem ) return {};
|
||||
|
||||
for ( int cIdx = 0; cIdx < treeItem->childCount(); ++cIdx )
|
||||
{
|
||||
caf::PdmUiTreeOrdering* child = treeItem->child( cIdx );
|
||||
if ( !child ) continue;
|
||||
if ( !child->isRepresentingObject() ) continue;
|
||||
|
||||
caf::PdmObjectHandle* childObj = child->object();
|
||||
caf::PdmUiObjectHandle* uiObjectHandleChild = uiObj( childObj );
|
||||
|
||||
if ( uiObjectHandleChild && uiObjectHandleChild->objectToggleField() )
|
||||
{
|
||||
auto* field = dynamic_cast<caf::PdmField<bool>*>( uiObjectHandleChild->objectToggleField() );
|
||||
|
||||
fields.emplace_back( field );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( auto& selectedItem : selectedItems )
|
||||
{
|
||||
auto* uiObjectHandle = dynamic_cast<caf::PdmUiObjectHandle*>( selectedItem );
|
||||
if ( uiObjectHandle && uiObjectHandle->objectToggleField() )
|
||||
{
|
||||
auto* field = dynamic_cast<caf::PdmField<bool>*>( uiObjectHandle->objectToggleField() );
|
||||
|
||||
fields.emplace_back( field );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fields;
|
||||
}
|
||||
|
@ -19,6 +19,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cafPdmField.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace caf
|
||||
{
|
||||
class PdmUiItem;
|
||||
@ -46,6 +50,7 @@ public:
|
||||
static void setObjectToggleStateForSelection( SelectionToggleType state );
|
||||
|
||||
private:
|
||||
static caf::PdmUiTreeView* findTreeView( const caf::PdmUiItem* uiItem );
|
||||
static caf::PdmUiTreeOrdering* findTreeItemFromSelectedUiItem( const caf::PdmUiItem* uiItem );
|
||||
static caf::PdmUiTreeView* findTreeView( const caf::PdmUiItem* uiItem );
|
||||
static caf::PdmUiTreeOrdering* findTreeItemFromSelectedUiItem( const caf::PdmUiItem* uiItem );
|
||||
static std::vector<caf::PdmField<bool>*> findToggleFieldsFromSelection( SelectionToggleType state );
|
||||
};
|
||||
|
@ -62,7 +62,9 @@ void RicToggleItemsOnOthersOffFeature::onActionTriggered( bool isChecked )
|
||||
|
||||
if ( field )
|
||||
{
|
||||
field->setValueWithFieldChanged( false );
|
||||
// Avoid calling setValueWithFieldChanged() here, as this potentially can trigger heavy computations. Assume
|
||||
// that the update logic is sufficient when setting the selected objects.
|
||||
field->setValue( false );
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user