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
135 lines
2.0 KiB
C++
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();
|
|
}
|