123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /*
- GWEN
- Copyright (c) 2010 Facepunch Studios
- See license in Gwen.h
- */
- #include "Gwen/Controls/ComboBox.h"
- #include "Gwen/Controls/Menu.h"
- using namespace Gwen;
- using namespace Gwen::Controls;
- using namespace Gwen::ControlsInternal;
- class GWEN_EXPORT DownArrow : public Controls::Base
- {
- public:
- GWEN_CONTROL_INLINE( DownArrow, Controls::Base )
- {
- SetMouseInputEnabled( true );
- SetSize( 15, 15 );
- }
- void Render( Skin::Base* skin )
- {
- skin->DrawArrowDown(this->m_Bounds);
- }
-
- void SetComboBox( ComboBox* p ){ m_ComboBox = p; }
- protected:
- ComboBox* m_ComboBox;
- };
- GWEN_CONTROL_CONSTRUCTOR( ComboBox )
- {
- SetSize( 100, 20 );
- SetMouseInputEnabled( true );
- m_Menu = new Menu( this );
- m_Menu->SetHidden( true );
- m_Menu->SetDisableIconMargin( true );
- m_Menu->SetTabable( false );
- ComboBoxButton* m_OpenButton = new ComboBoxButton( this );
- m_OpenButton->onDown.Add( this, &ComboBox::OpenButtonPressed );
- m_OpenButton->Dock( Pos::Right );
- m_OpenButton->SetMargin( Margin( 2, 2, 2, 2 ) );
- m_OpenButton->SetWidth( 16 );
- m_OpenButton->SetTabable( false );
- m_SelectedItem = NULL;
- SetAlignment( Gwen::Pos::Left | Gwen::Pos::CenterV );
- SetText( L"" );
- SetMargin( Margin( 3, 0, 0, 0 ) );
- SetTabable( true );
- }
- MenuItem* ComboBox::AddItem( const UnicodeString& strLabel, const String& strName, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::Function fn )
- {
- MenuItem* pItem = m_Menu->AddItem( strLabel, L"", pHandler, fn );
- pItem->SetName( strName );
- pItem->onMenuItemSelected.Add( this, &ComboBox::OnItemSelected );
- //Default
- if ( m_SelectedItem == NULL )
- OnItemSelected( pItem );
- return pItem;
- }
- void ComboBox::Render( Skin::Base* skin )
- {
- skin->DrawComboBox( this );
- }
- void ComboBox::OpenButtonPressed( Controls::Base* /*pControl*/ )
- {
- OnPress();
- }
- void ComboBox::OnPress()
- {
- bool bWasMenuHidden = m_Menu->Hidden();
- GetCanvas()->CloseMenus();
- if ( bWasMenuHidden )
- {
- OpenList();
- }
- else
- {
- m_Menu->SetHidden( true );
- }
- }
- void ComboBox::ClearItems()
- {
- if ( m_Menu )
- {
- m_Menu->ClearItems();
- }
- }
- void ComboBox::OnItemSelected( Controls::Base* pControl )
- {
- //Convert selected to a menu item
- MenuItem* pItem = pControl->DynamicCastMenuItem();
- if ( !pItem ) return;
- m_SelectedItem = pItem;
- SetText( m_SelectedItem->GetText() );
- m_Menu->SetHidden( true );
- onSelection.Call( this );
- Focus();
- Invalidate();
- }
- void ComboBox::OnLostKeyboardFocus()
- {
- SetTextColor( Color( 0, 0, 0, 255 ) );
- }
- void ComboBox::OnKeyboardFocus()
- {
- //Until we add the blue highlighting again
- SetTextColor( Color( 0, 0, 0, 255 ) );
- //m_SelectedText->SetTextColor( Color( 255, 255, 255, 255 ) );
- }
- Gwen::Controls::Label* ComboBox::GetSelectedItem()
- {
- return m_SelectedItem;
- }
- bool ComboBox::IsMenuOpen()
- {
- return m_Menu && !m_Menu->Hidden();
- }
- void ComboBox::OpenList()
- {
- if ( !m_Menu ) return;
- m_Menu->SetParent( GetCanvas() );
- m_Menu->SetHidden( false );
- m_Menu->BringToFront();
- Gwen::Point p = LocalPosToCanvas( Gwen::Point( 0, 0 ) );
- m_Menu->SetBounds( Gwen::Rect ( p.x, p.y + Height(), Width(), m_Menu->Height()) );
- }
- void ComboBox::CloseList()
- {
- }
- bool ComboBox::OnKeyUp( bool bDown )
- {
- if ( bDown )
- {
- Base::List & children = m_Menu->GetChildren();
- Base::List::reverse_iterator it = std::find( children.rbegin(), children.rend(), m_SelectedItem );
- if ( it != children.rend() && ( ++it != children.rend() ) )
- {
- Base* pUpElement = *it;
- OnItemSelected( pUpElement );
- }
- }
- return true;
- }
- bool ComboBox::OnKeyDown( bool bDown )
- {
- if ( bDown )
- {
- Base::List & children = m_Menu->GetChildren();
- Base::List::iterator it = std::find( children.begin(), children.end(), m_SelectedItem );
- if ( it != children.end() && ( ++it != children.end() ) )
- {
- Base* pDownElement = *it;
- OnItemSelected( pDownElement );
- }
- }
- return true;
- }
- void ComboBox::RenderFocus( Gwen::Skin::Base* /*skin*/ )
- {
- }
|