BsGUIButtonBase.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include "BsPrerequisites.h"
  3. #include "BsGUIElement.h"
  4. #include "BsImageSprite.h"
  5. #include "BsTextSprite.h"
  6. #include "BsGUIContent.h"
  7. #include "BsEvent.h"
  8. namespace BansheeEngine
  9. {
  10. /**
  11. * @brief Base class for a clickable GUI button element.
  12. */
  13. class BS_EXPORT GUIButtonBase : public GUIElement
  14. {
  15. public:
  16. /**
  17. * @brief Change content displayed by the button.
  18. */
  19. void setContent(const GUIContent& content);
  20. /**
  21. * @brief Change the button "on" state. This state determines
  22. * whether the button uses normal or "on" fields specified
  23. * in the GUI style.
  24. */
  25. void _setOn(bool on);
  26. /**
  27. * @brief Retrieves the button "on" state. This state determines
  28. * whether the button uses normal or "on" fields specified
  29. * in the GUI style.
  30. */
  31. bool _isOn() const;
  32. /**
  33. * @brief Change the internal button state, changing the button look depending on set style.
  34. */
  35. void _setState(GUIElementState state);
  36. /**
  37. * @copydoc GUIElement::_getOptimalSize
  38. */
  39. virtual Vector2I _getOptimalSize() const override;
  40. /**
  41. * @copydoc GUIElement::_getRenderElementDepthRange
  42. */
  43. virtual UINT32 _getRenderElementDepthRange() const override;
  44. /**
  45. * @brief Triggered when button is clicked.
  46. */
  47. Event<void()> onClick;
  48. /**
  49. * @brief Triggered when pointer hovers over the button.
  50. */
  51. Event<void()> onHover;
  52. /**
  53. * @brief Triggered when pointer that was previously hovering leaves the button.
  54. */
  55. Event<void()> onOut;
  56. /**
  57. * @brief Triggered when button is clicked twice in rapid succession.
  58. */
  59. Event<void()> onDoubleClick;
  60. protected:
  61. GUIButtonBase(const String& styleName, const GUIContent& content, const GUIDimensions& dimensions);
  62. virtual ~GUIButtonBase();
  63. /**
  64. * @copydoc GUIElement::getNumRenderElements
  65. */
  66. virtual UINT32 _getNumRenderElements() const override;
  67. /**
  68. * @copydoc GUIElement::getMaterial
  69. */
  70. virtual const GUIMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
  71. /**
  72. * @copydoc GUIElement::getNumQuads
  73. */
  74. virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
  75. /**
  76. * @copydoc GUIElement::fillBuffer
  77. */
  78. virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad,
  79. UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
  80. /**
  81. * @copydoc GUIElement::updateRenderElementsInternal
  82. */
  83. virtual void updateRenderElementsInternal() override;
  84. /**
  85. * @copydoc GUIElement::mouseEvent
  86. */
  87. virtual bool _mouseEvent(const GUIMouseEvent& ev) override;
  88. /**
  89. * @copydoc GUIElement::_getRenderElementDepth
  90. */
  91. virtual UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
  92. /**
  93. * @brief Creates or destroys the content image sprite depending if there is a content image for the
  94. * active state.
  95. */
  96. void refreshContentSprite();
  97. /**
  98. * @brief Gets the text sprite descriptor used for creating/updating the internal text sprite.
  99. */
  100. TEXT_SPRITE_DESC getTextDesc() const;
  101. /**
  102. * @brief Retrieves internal button state.
  103. */
  104. GUIElementState getState() const { return mActiveState; }
  105. /**
  106. * @brief Returns the active sprite texture, depending on the current state.
  107. */
  108. const HSpriteTexture& getActiveTexture() const;
  109. /**
  110. * @brief Returns the active text color, depending on the current state.
  111. */
  112. Color getActiveTextColor() const;
  113. private:
  114. ImageSprite* mImageSprite;
  115. ImageSprite* mContentImageSprite;
  116. TextSprite* mTextSprite;
  117. GUIElementState mActiveState;
  118. IMAGE_SPRITE_DESC mImageDesc;
  119. GUIContent mContent;
  120. };
  121. }