mirror of
https://github.com/bulletphysics/bullet3
synced 2024-12-16 06:30:05 +00:00
138 lines
2.0 KiB
C++
138 lines
2.0 KiB
C++
/*
|
|
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();
|
|
}
|