/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Gwen.h" #include "Gwen/Controls/MenuItem.h" #include "Gwen/Skin.h" using namespace Gwen; using namespace Gwen::Controls; GWEN_CONTROL_CONSTRUCTOR( MenuItem ) { m_Menu = NULL; m_bOnStrip = false; m_SubmenuArrow = NULL; SetTabable( false ); SetCheckable( false ); SetCheck( false ); } MenuItem::~MenuItem() { } void MenuItem::Render( Skin::Base* skin ) { skin->DrawMenuItem( this, IsMenuOpen(), m_bCheckable ? m_bChecked : false ); } void MenuItem::Layout( Skin::Base* skin ) { BaseClass::Layout( skin ); } Menu* MenuItem::GetMenu() { if ( !m_Menu ) { m_Menu = new Menu( GetCanvas() ); m_Menu->SetHidden( true ); if ( !m_bOnStrip ) { m_SubmenuArrow = new Symbol::Arrow( this ); m_SubmenuArrow->Dock( Pos::Right ); m_SubmenuArrow->SetSize( 20, 20 ); } Invalidate(); } return m_Menu; } void MenuItem::SetCheck( bool bCheck ) { if ( bCheck == m_bChecked) return; m_bChecked = bCheck; onCheckChange.Call( this ); if ( bCheck ) onChecked.Call( this ); else onUnChecked.Call( this ); } void MenuItem::OnPress() { if ( m_Menu ) { ToggleMenu(); } else if ( !m_bOnStrip ) { SetCheck( !GetChecked() ); onMenuItemSelected.Call( this ); GetCanvas()->CloseMenus(); } BaseClass::OnPress(); } void MenuItem::ToggleMenu() { if ( IsMenuOpen() ) CloseMenu(); else OpenMenu(); } bool MenuItem::IsMenuOpen() { if ( !m_Menu ) return false; return !m_Menu->Hidden(); } void MenuItem::OpenMenu() { if ( !m_Menu ) return; m_Menu->SetHidden( false ); m_Menu->BringToFront(); Gwen::Point p = LocalPosToCanvas( Gwen::Point( 0, 0 ) ); // Strip menus open downwards if ( m_bOnStrip ) { m_Menu->SetPos( p.x, p.y + Height() + 1 ); } // Submenus open sidewards else { m_Menu->SetPos( p.x + Width(), p.y); } // TODO: Option this. // TODO: Make sure on screen, open the other side of the // parent if it's better... } void MenuItem::CloseMenu() { if ( !m_Menu ) return; m_Menu->Close(); m_Menu->CloseAll(); }