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