MenuItem.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. GWEN
  3. Copyright (c) 2010 Facepunch Studios
  4. See license in Gwen.h
  5. */
  6. #include "Gwen/Gwen.h"
  7. #include "Gwen/Controls/MenuItem.h"
  8. #include "Gwen/Skin.h"
  9. using namespace Gwen;
  10. using namespace Gwen::Controls;
  11. GWEN_CONTROL_CONSTRUCTOR( MenuItem )
  12. {
  13. m_Menu = NULL;
  14. m_bOnStrip = false;
  15. m_SubmenuArrow = NULL;
  16. SetTabable( false );
  17. SetCheckable( false );
  18. SetCheck( false );
  19. }
  20. MenuItem::~MenuItem()
  21. {
  22. }
  23. void MenuItem::Render( Skin::Base* skin )
  24. {
  25. skin->DrawMenuItem( this, IsMenuOpen(), m_bCheckable ? m_bChecked : false );
  26. }
  27. void MenuItem::Layout( Skin::Base* skin )
  28. {
  29. BaseClass::Layout( skin );
  30. }
  31. Menu* MenuItem::GetMenu()
  32. {
  33. if ( !m_Menu )
  34. {
  35. m_Menu = new Menu( GetCanvas() );
  36. m_Menu->SetHidden( true );
  37. if ( !m_bOnStrip )
  38. {
  39. m_SubmenuArrow = new Symbol::Arrow( this );
  40. m_SubmenuArrow->Dock( Pos::Right );
  41. m_SubmenuArrow->SetSize( 20, 20 );
  42. }
  43. Invalidate();
  44. }
  45. return m_Menu;
  46. }
  47. void MenuItem::SetCheck( bool bCheck )
  48. {
  49. if ( bCheck == m_bChecked)
  50. return;
  51. m_bChecked = bCheck;
  52. onCheckChange.Call( this );
  53. if ( bCheck )
  54. onChecked.Call( this );
  55. else
  56. onUnChecked.Call( this );
  57. }
  58. void MenuItem::OnPress()
  59. {
  60. if ( m_Menu )
  61. {
  62. ToggleMenu();
  63. }
  64. else if ( !m_bOnStrip )
  65. {
  66. SetCheck( !GetChecked() );
  67. onMenuItemSelected.Call( this );
  68. GetCanvas()->CloseMenus();
  69. }
  70. BaseClass::OnPress();
  71. }
  72. void MenuItem::ToggleMenu()
  73. {
  74. if ( IsMenuOpen() ) CloseMenu();
  75. else OpenMenu();
  76. }
  77. bool MenuItem::IsMenuOpen()
  78. {
  79. if ( !m_Menu ) return false;
  80. return !m_Menu->Hidden();
  81. }
  82. void MenuItem::OpenMenu()
  83. {
  84. if ( !m_Menu ) return;
  85. m_Menu->SetHidden( false );
  86. m_Menu->BringToFront();
  87. Gwen::Point p = LocalPosToCanvas( Gwen::Point( 0, 0 ) );
  88. // Strip menus open downwards
  89. if ( m_bOnStrip )
  90. {
  91. m_Menu->SetPos( p.x, p.y + Height() + 1 );
  92. }
  93. // Submenus open sidewards
  94. else
  95. {
  96. m_Menu->SetPos( p.x + Width(), p.y);
  97. }
  98. // TODO: Option this.
  99. // TODO: Make sure on screen, open the other side of the
  100. // parent if it's better...
  101. }
  102. void MenuItem::CloseMenu()
  103. {
  104. if ( !m_Menu ) return;
  105. m_Menu->Close();
  106. m_Menu->CloseAll();
  107. }