Пример #1
0
///////////////////////////////////////////////////////////////////////////////
// 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();
                }
            }
        }
    }
}
Пример #2
0
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;
}