fork download
  1. #ifndef DUI_FRAME_HPP
  2. #define DUI_FRAME_HPP
  3.  
  4. //Includes
  5. #include "CloseButton.hpp"
  6. #include <type_traits>
  7.  
  8. namespace dui {
  9. class Frame : public Stencil {
  10. private:
  11. sf::Vector2i prevMS;
  12. bool draggable, dragged, screenlocked, showclose, prevState;
  13. CloseButton cb;
  14. sf::Text text;
  15. sf::Color bodyColor, frameBorder, topColor, nameColor;
  16. sf::RectangleShape body, top;
  17.  
  18. public:
  19. Frame(): prevMS(0,0), draggable(true), dragged(false), screenlocked(false), showclose(true), prevState(false),
  20. bodyColor(232,232,232), topColor(102,194,255), nameColor(255,255,255) {
  21. text.setFont(defaultFont);
  22. text.setString("Frame");
  23. text.setCharacterSize(10);
  24. cb.setPosition(100,100);
  25. cb.setSize(190,100);
  26. cb.onClick([&]{
  27. this->clearChildren();
  28. this->hide();
  29. });
  30. rect.width = 300;
  31. rect.height = 150;
  32. frameBorder = borderColor;
  33. parent = this;
  34. }
  35.  
  36. void draw() {
  37. if(window == nullptr || !visible)
  38. return;
  39.  
  40. updateHover();
  41.  
  42. bool validClick = visible && enabled && draggable && hover;
  43. bool buttonPressed = sf::Mouse::isButtonPressed(sf::Mouse::Left);
  44.  
  45. //Key is pressed
  46. if(buttonPressed && !prevState && validClick) {
  47. dragged = true;
  48. prevMS = sf::Mouse::getPosition(*window) - sf::Vector2i(rect.left,rect.top);
  49. }
  50. //Key is held down
  51. if(buttonPressed && prevState && validClick) {
  52. dragged = true;
  53. }
  54. //Key is released
  55. if(!buttonPressed && prevState && validClick) {
  56. dragged = false;
  57. }
  58.  
  59. prevState = buttonPressed;
  60.  
  61. if(dragged) {
  62. sf::Vector2i ms = sf::Mouse::getPosition(*window);
  63. rect.left = ms.x - prevMS.x;
  64. rect.top = ms.y - prevMS.y;
  65. }
  66.  
  67. //Draw the body
  68. body.setPosition(rect.left,rect.top);
  69. body.setSize(sf::Vector2f(rect.width,rect.height));
  70. body.setFillColor(bodyColor);
  71. window->draw(body);
  72.  
  73. gradientColor.r = topColor.r - 20;
  74. gradientColor.g = topColor.g - 20;
  75. gradientColor.b = topColor.b - 20;
  76.  
  77. //Draw the top.
  78. top.setPosition(rect.left,rect.top);
  79. top.setSize(sf::Vector2f(rect.width,25));
  80. top.setFillColor(topColor);
  81. window->draw(top);
  82. drawGradient(rect.left,rect.top,rect.width,25,gradientColor);
  83. drawOutlineRect(rect.left, rect.top + 25, rect.width, 1, frameBorder);
  84.  
  85. //Draw the text.
  86. text.setPosition(rect.left + 5, rect.top + 5);
  87. text.setColor(nameColor);
  88. window->draw(text);
  89.  
  90. //draw the border
  91. drawOutlineRect(rect.left,rect.top,rect.width,rect.height,frameBorder);
  92.  
  93. //Children
  94. cb.setPosition(rect.width + rect.left - 10, rect.height - rect.top + 10); //This is buggy.
  95. cb.setWindow(*window);
  96. cb.draw();
  97.  
  98. renderChildren();
  99. }
  100.  
  101. template<typename Control>
  102. void addControl(Control& control) {
  103. static_assert(!std::is_base_of<Control,Stencil>::value, "Controls must inherit from Stencil.");
  104. this->children.push_back(&control);
  105. }
  106. };
  107. } //namespace dui
  108.  
  109.  
  110. #endif //DUI_FRAME_HPP
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty