/////////////////////////////////////////////////////////////////////////////// // Callback for when the user selects an item in the tree. The selection might // be vetoed if the item is not selectable. // void SceneOutliner::OnSelectionChanging( wxTreeEvent& args ) { EDITOR_SCOPE_TIMER( ("") ); if ( !m_IgnoreSelectionChange ) { const wxTreeItemId& item = args.GetItem(); // Any item can be deselected, so only check the case where an item is // about to be selected. if ( !m_TreeCtrl->IsSelected( item ) ) { SceneOutlinerItemData* data = GetTreeItemData( item ); SceneNode* node = Reflect::SafeCast<SceneNode>( data->GetObject() ); if ( node ) { if ( !node->IsSelectable() ) { args.Veto(); } } } } }
UndoCommandPtr Selection::SetItems(const OS_ObjectDumbPtr& items, const SelectionChangingSignature::Delegate& emitterChanging, const SelectionChangedSignature::Delegate& emitterChanged) { if (items.Empty()) { return Clear(emitterChanging, emitterChanged); } EDITOR_SCENE_SCOPE_TIMER( ("") ); SimpleTimer timer; OS_ObjectDumbPtr selectableItems; { OS_ObjectDumbPtr::Iterator itr = items.Begin(); OS_ObjectDumbPtr::Iterator end = items.End(); for ( ; itr != end; ++itr ) { SceneNode *pSceneNode = Reflect::SafeCast<SceneNode>(*itr); if (!pSceneNode || pSceneNode->IsSelectable()) { selectableItems.Append(*itr); } } } UndoCommandPtr command; SelectionChangingArgs args ( items ); m_SelectionChanging.RaiseWithEmitter( args , emitterChanging); if ( !args.m_Veto ) { command = new SelectionChangeCommand( this ); { OS_ObjectDumbPtr::Iterator itr = m_Items.Begin(); OS_ObjectDumbPtr::Iterator end = m_Items.End(); for ( ; itr != end; ++itr ) { SceneNode *pSceneNode = Reflect::SafeCast<SceneNode>(*itr); if (pSceneNode) { pSceneNode->SetSelected(false); } } } m_Items = selectableItems; { OS_ObjectDumbPtr::Iterator itr = m_Items.Begin(); OS_ObjectDumbPtr::Iterator end = m_Items.End(); for ( ; itr != end; ++itr ) { SceneNode *pSceneNode = Reflect::SafeCast<SceneNode>(*itr); if (pSceneNode) { pSceneNode->SetSelected(true); } } } m_SelectionChanged.RaiseWithEmitter(m_Items, emitterChanged); } Log::Profile( TXT( "Selection SetItems took %fms\n" ), timer.Elapsed()); return command; }