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
|
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() )
|
if ( uiObjectHandle && uiObjectHandle->objectToggleField() )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@ -100,55 +99,26 @@ bool RicToggleItemsFeatureImpl::isToggleCommandsForSubItems()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection( SelectionToggleType state )
|
void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection( SelectionToggleType state )
|
||||||
{
|
{
|
||||||
std::vector<caf::PdmUiItem*> selectedItems;
|
auto fields = findToggleFieldsFromSelection( state );
|
||||||
caf::SelectionManager::instance()->selectedItems( selectedItems );
|
if ( fields.empty() ) return;
|
||||||
if ( state != TOGGLE && selectedItems.size() == 1 )
|
|
||||||
|
auto lastField = fields.back();
|
||||||
|
for ( auto field : fields )
|
||||||
{
|
{
|
||||||
// If only one item is selected, loop over its children, and toggle them instead of the
|
bool value = !( field->v() );
|
||||||
// selected item directly
|
|
||||||
|
|
||||||
// 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 ( field == lastField )
|
||||||
|
|
||||||
if ( !treeItem ) return;
|
|
||||||
|
|
||||||
for ( int cIdx = 0; cIdx < treeItem->childCount(); ++cIdx )
|
|
||||||
{
|
{
|
||||||
caf::PdmUiTreeOrdering* child = treeItem->child( cIdx );
|
field->setValueWithFieldChanged( value );
|
||||||
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() ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
|
||||||
{
|
|
||||||
for ( size_t i = 0; i < selectedItems.size(); ++i )
|
|
||||||
{
|
{
|
||||||
caf::PdmUiObjectHandle* uiObjectHandle = dynamic_cast<caf::PdmUiObjectHandle*>( selectedItems[i] );
|
field->setValue( value );
|
||||||
|
|
||||||
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() ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,7 +130,7 @@ caf::PdmUiTreeView* RicToggleItemsFeatureImpl::findTreeView( const caf::PdmUiIte
|
|||||||
{
|
{
|
||||||
RiaFeatureCommandContext* context = RiaFeatureCommandContext::instance();
|
RiaFeatureCommandContext* context = RiaFeatureCommandContext::instance();
|
||||||
|
|
||||||
caf::PdmUiTreeView* customActiveTreeView = dynamic_cast<caf::PdmUiTreeView*>( context->object() );
|
auto* customActiveTreeView = dynamic_cast<caf::PdmUiTreeView*>( context->object() );
|
||||||
if ( customActiveTreeView )
|
if ( customActiveTreeView )
|
||||||
{
|
{
|
||||||
return customActiveTreeView;
|
return customActiveTreeView;
|
||||||
@ -197,3 +167,57 @@ caf::PdmUiTreeOrdering* RicToggleItemsFeatureImpl::findTreeItemFromSelectedUiIte
|
|||||||
|
|
||||||
return nullptr;
|
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
|
#pragma once
|
||||||
|
|
||||||
|
#include "cafPdmField.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace caf
|
namespace caf
|
||||||
{
|
{
|
||||||
class PdmUiItem;
|
class PdmUiItem;
|
||||||
@ -46,6 +50,7 @@ public:
|
|||||||
static void setObjectToggleStateForSelection( SelectionToggleType state );
|
static void setObjectToggleStateForSelection( SelectionToggleType state );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static caf::PdmUiTreeView* findTreeView( const caf::PdmUiItem* uiItem );
|
static caf::PdmUiTreeView* findTreeView( const caf::PdmUiItem* uiItem );
|
||||||
static caf::PdmUiTreeOrdering* findTreeItemFromSelectedUiItem( 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 )
|
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