fork download
  1. #ifndef DUI_BUTTON_HPP
  2. #define DUI_BUTTON_HPP
  3.  
  4. //Includes
  5. #include "Template.hpp"
  6. #include <SFML/Graphics/Text.hpp>
  7.  
  8. namespace dui {
  9. class Button : public Stencil {
  10. private:
  11. sf::Text text;
  12. bool clicked, clickable;
  13. sf::Color bodyClicked, bodyNoHover, bodyHover;
  14. sf::Color textClicked, textNoHover, textHover;
  15. sf::Color bodyNonclickable, textNonclickable;
  16. sf::Color borderClicked, borderNoHover, borderHover;
  17. std::function<void(void)> onClickf;
  18. sf::RectangleShape body, border;
  19.  
  20. void drawHelper(sf::FloatRect& textbounds, sf::Color& bodyC, sf::Color& textC, sf::Color& borderC, sf::Color& gradientC) {
  21. //draw body
  22. body.setPosition(rect.left + 1, rect.top + 1);
  23. body.setSize(sf::Vector2f(rect.width - 2,rect.height - 2));
  24. body.setFillColor(bodyC);
  25. window->draw(body);
  26.  
  27. gradientC.r = bodyC.r - 20;
  28. gradientC.g = bodyC.g - 20;
  29. gradientC.b = bodyC.b - 20;
  30. drawGradient(rect.left, rect.top - 1, rect.width, rect.height, gradientC);
  31.  
  32. //draw text
  33. text.setColor(textC);
  34. text.setPosition(static_cast<int>(rect.left + rect.width/2 - textbounds.width/2), static_cast<int>(rect.top + rect.height/2 - textbounds.height/2));
  35. window->draw(text);
  36.  
  37. //draw border
  38. drawOutlineRect(rect.left, rect.top, rect.width, rect.height, borderC);
  39. }
  40. public:
  41. Button(): clicked(false), clickable(true),
  42. bodyClicked(128,204,255), bodyNoHover(255,255,255), bodyHover(153,214,255),
  43. textClicked(255,255,255), textNoHover(0,0,0,200), textHover(255,255,255),
  44. bodyNonclickable(220,220,220), textNonclickable(0,0,0,100) {
  45. text.setFont(defaultFont);
  46. text.setString("Button");
  47. text.setCharacterSize(10);
  48. borderClicked = borderColor;
  49. borderHover = borderColor;
  50. borderNoHover = borderColor;
  51. }
  52.  
  53. void draw() {
  54. sf::FloatRect textbounds = text.getLocalBounds();
  55. updateHover();
  56.  
  57. if(hover && sf::Mouse::isButtonPressed(sf::Mouse::Left))
  58. clicked = true;
  59. else
  60. clicked = false;
  61.  
  62. if(window == nullptr)
  63. return; //Can't draw on a null window.
  64. if(!enabled || !clickable) {
  65. drawHelper(textbounds, bodyNonclickable,textNonclickable,borderNoHover,gradientColor);
  66. return;
  67. }
  68. if(clicked) {
  69. drawHelper(textbounds,bodyClicked,textClicked,borderClicked,gradientColor);
  70. //Call the callback
  71. if(onClickf && clicked) {
  72. onClickf();
  73. }
  74. return;
  75. }
  76. else if(hover) {
  77. drawHelper(textbounds, bodyHover,textHover,borderHover, gradientColor);
  78. }
  79. else {
  80. drawHelper(textbounds,bodyNoHover,textNoHover,borderNoHover,gradientColor);
  81. }
  82. }
  83.  
  84. void draw(sf::RenderWindow& renderWindow) {
  85. if(window == nullptr)
  86. window = &renderWindow;
  87. draw();
  88. }
  89.  
  90. void onClick(std::function<void(void)> func) {
  91. onClickf = func;
  92. }
  93.  
  94. bool isClicked() const {
  95. return clicked;
  96. }
  97.  
  98. void setText(const sf::String& str) {
  99. text.setString(str);
  100. }
  101. };
  102. } //namespace dui
  103.  
  104. #endif //DUI_BUTTON_HPP
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty