123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- /*
- GWEN
- Copyright (c) 2010 Facepunch Studios
- See license in Gwen.h
- */
- #include "Gwen/Controls/TreeControl.h"
- #include "Gwen/Controls/ScrollControl.h"
- #include "Gwen/Utility.h"
- using namespace Gwen;
- using namespace Gwen::Controls;
- GWEN_CONTROL_CONSTRUCTOR( TreeControl )
- {
- m_TreeControl = this;
- m_bUpdateScrollBar = 2;
- m_ToggleButton->DelayedDelete();
- m_ToggleButton = NULL;
- m_Title->DelayedDelete();
- m_Title = NULL;
- m_InnerPanel->DelayedDelete();
- m_InnerPanel = NULL;
- m_bAllowMultipleSelection = false;
- m_ScrollControl = new ScrollControl( this );
- m_ScrollControl->Dock( Pos::Fill );
- m_ScrollControl->SetScroll( false, true );
- m_ScrollControl->SetAutoHideBars( true );
- m_ScrollControl->SetMargin( Margin( 1, 1, 1, 1 ) );
- m_InnerPanel = m_ScrollControl;
- m_ScrollControl->SetInnerSize( 1000, 1000 );
- }
- void TreeControl::Render( Skin::Base* skin )
- {
- if ( ShouldDrawBackground() )
- skin->DrawTreeControl( this );
- }
- void TreeControl::ForceUpdateScrollBars()
- {
- m_ScrollControl->UpdateScrollBars();
- }
- void TreeControl::OnChildBoundsChanged( Gwen::Rect /*oldChildBounds*/, Base* /*pChild*/ )
- {
-
- }
- void TreeControl::Clear()
- {
- m_ScrollControl->Clear();
- }
- void TreeControl::Layout( Skin::Base* skin )
- {
- BaseClass::BaseClass::Layout( skin );
- }
- void TreeControl::PostLayout( Skin::Base* skin )
- {
- BaseClass::BaseClass::PostLayout( skin );
- }
- void TreeControl::OnNodeAdded( TreeNode* pNode )
- {
- pNode->onNamePress.Add( this, &TreeControl::OnNodeSelection );
- }
- void TreeControl::OnNodeSelection( Controls::Base* /*control*/ )
- {
- //printf("TreeControl::OnNodeSelection\n");
- if ( !m_bAllowMultipleSelection || !Gwen::Input::IsKeyDown( Key::Control ) )
- DeselectAll();
- }
-
- void TreeControl::iterate(int action, int* maxItem, int* curItem)
- {
- Base::List& children = m_InnerPanel->GetChildren();
- for ( Base::List::iterator iter = children.begin(); iter != children.end(); ++iter )
- {
- TreeNode* pChild = (*iter)->DynamicCastTreeNode();
- if ( !pChild )
- continue;
- pChild->iterate(action ,maxItem, curItem);
- }
-
- }
- bool TreeControl::OnKeyUp( bool bDown )
- {
- if (bDown)
- {
-
- // int maxIndex = 0;
- int newIndex = 0;
- int maxItem=0;
- int curItem=-1;
- iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem);
- // maxIndex = maxItem;
- int targetItem = curItem;
- if (curItem>0)
- {
- maxItem=0;
- int deselectIndex = targetItem;
- targetItem--;
- newIndex = targetItem;
- iterate(ITERATE_ACTION_SELECT,&maxItem,&targetItem);
- if (targetItem<0)
- {
- maxItem=0;
- iterate(ITERATE_ACTION_DESELECT_INDEX,&maxItem,&deselectIndex);
- }
- curItem = newIndex;
- // float amount = float(newIndex)/float(maxIndex);
- float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize();
- float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize();
-
- float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount();
- // float minCoordViewableWindow = curAmount*contSize;
- //float maxCoordViewableWindow = minCoordViewableWindow+viewSize;
- float minCoordSelectedItem = curItem*16.f;
- // float maxCoordSelectedItem = (curItem+1)*16.f;
- if (contSize!=viewSize)
- {
- {
- float newAmount = float(minCoordSelectedItem)/(contSize-viewSize);
- if (newAmount<curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- {
- int numItems = (viewSize)/16-1;
- float newAmount = float((curItem-numItems)*16)/(contSize-viewSize);
- if (newAmount>curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- }
- }
- }
- ForceUpdateScrollBars();
- return true;
- }
- bool TreeControl::OnKeyDown( bool bDown )
- {
- if (bDown)
- {
-
- // int maxIndex = 0;
- int newIndex = 0;
- int maxItem=0;
- int curItem=-1;
- iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem);
- // maxIndex = maxItem;
- int targetItem = curItem;
- if (curItem>=0)
- {
- maxItem=0;
- int deselectIndex = targetItem;
- targetItem++;
- newIndex = targetItem;
- iterate(ITERATE_ACTION_SELECT,&maxItem,&targetItem);
- if (targetItem<0)
- {
- maxItem=0;
- iterate(ITERATE_ACTION_DESELECT_INDEX,&maxItem,&deselectIndex);
- }
- curItem= newIndex;
- // float amount = (int)float(newIndex)/float(maxIndex);
- float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize();
- float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize();
-
- float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount();
- // float minCoordViewableWindow = curAmount*contSize;
- //float maxCoordViewableWindow = minCoordViewableWindow+viewSize;
- float minCoordSelectedItem = curItem*16.f;
- //float maxCoordSelectedItem = (curItem+1)*16.f;
- if (contSize!=viewSize)
- {
- {
- float newAmount = float(minCoordSelectedItem)/(contSize-viewSize);
- if (newAmount<curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- {
- int numItems = (viewSize)/16-1;
- float newAmount = float((curItem-numItems)*16)/(contSize-viewSize);
- if (newAmount>curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- }
- }
- }
- ForceUpdateScrollBars();
- return true;
- }
- extern int avoidUpdate;
- bool TreeControl::OnKeyRight( bool bDown )
- {
- if (bDown)
- {
-
- avoidUpdate = -3;
-
- iterate(ITERATE_ACTION_OPEN,0,0);
- int maxItem=0;
- int curItem=0;
- iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItem,&curItem);
- // float amount = float(curItem)/float(maxItem);
- float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize();
- float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize();
-
- float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount();
- // float minCoordViewableWindow = curAmount*contSize;
- // float maxCoordViewableWindow = minCoordViewableWindow+viewSize;
- float minCoordSelectedItem = curItem*16.f;
- // float maxCoordSelectedItem = (curItem+1)*16.f;
- if (contSize!=viewSize)
- {
- {
- float newAmount = float(minCoordSelectedItem)/(contSize-viewSize);
- if (newAmount<curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- {
- int numItems = (viewSize)/16-1;
- float newAmount = float((curItem-numItems)*16)/(contSize-viewSize);
- if (newAmount>curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- }
- Invalidate();
- }
- ForceUpdateScrollBars();
- return true;
- }
- bool TreeControl::OnKeyLeft( bool bDown )
- {
- if (bDown)
- {
-
- avoidUpdate = -3;
-
- iterate(ITERATE_ACTION_CLOSE,0,0);
- int maxItems=0;
- int curItem=0;
- iterate(ITERATE_ACTION_FIND_SELECTED_INDEX,&maxItems,&curItem);
- // float amount = float(curItem)/float(maxItems);
-
- // m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(amount,true);
- float viewSize = m_ScrollControl->m_VerticalScrollBar->getViewableContentSize();
- float contSize = m_ScrollControl->m_VerticalScrollBar->getContentSize();
-
- float curAmount = m_ScrollControl->m_VerticalScrollBar->GetScrolledAmount();
- // float minCoordViewableWindow = curAmount*contSize;
- // float maxCoordViewableWindow = minCoordViewableWindow+viewSize;
- float minCoordSelectedItem = curItem*16.f;
- // float maxCoordSelectedItem = (curItem+1)*16.f;
- if (contSize!=viewSize)
- {
- {
- float newAmount = float(minCoordSelectedItem)/(contSize-viewSize);
- if (newAmount<curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- }
- {
- int numItems = (viewSize)/16-1;
- float newAmount = float((curItem-numItems)*16)/(contSize-viewSize);
- if (newAmount>curAmount)
- {
- m_ScrollControl->m_VerticalScrollBar->SetScrolledAmount(newAmount,true);
- }
- Invalidate();
- }
- }
- //viewSize/contSize
- //printf("!\n");
- //this->Layout(0);
-
- }
- ForceUpdateScrollBars();
- return true;
- }
|