Files
bullet3/examples/ThirdPartyLibs/Gwen/Controls/MenuItem.cpp
erwincoumans ab8f16961e Code-style consistency improvement:
Apply clang-format-all.sh using the _clang-format file through all the cpp/.h files.
make sure not to apply it to certain serialization structures, since some parser expects the * as part of the name, instead of type.
This commit contains no other changes aside from adding and applying clang-format-all.sh
2018-09-23 14:17:31 -07:00

135 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();
}