BaseGUI.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "client/gui/BaseGUI.h"
  2. static const Color4 INPUT_BACKGROUND(0x00, 0x00, 0x00, 0xA0);
  3. static const Color4 INPUT_BACKGROUND_2(0x00, 0x00, 0x00, 0x80);
  4. const Vector2 BaseGUI::FIXED_SIZE(400.0f, 300.0f);
  5. BaseGUI::Base::Base() : hovered(false), pressed(false) {
  6. }
  7. BaseGUI::BaseGUI(const Size& size, TextInput*& textInput,
  8. const Controller& controller)
  9. : size(size), textInput(textInput), controller(controller) {
  10. }
  11. void BaseGUI::tickBase(Base& b) {
  12. b.hovered = isIn(b.pos, b.size, controller.getMouse() / scale);
  13. b.pressed = b.hovered && controller.leftClick.wasReleased();
  14. }
  15. void BaseGUI::tick() {
  16. for(Label& label : labels) {
  17. tickBase(label.base);
  18. }
  19. for(Input& input : inputs) {
  20. tickBase(input.base);
  21. if(input.base.pressed) {
  22. textInput = &input.text;
  23. textInput->setActive(true);
  24. }
  25. }
  26. for(Button& button : buttons) {
  27. tickBase(button.base);
  28. }
  29. }
  30. void BaseGUI::updateScale(ShaderMatrix& sm) {
  31. scale = static_cast<int>(
  32. std::min(size.width / FIXED_SIZE[0], size.height / FIXED_SIZE[1]));
  33. scale = scale < 1.0f ? 1.0f : scale;
  34. scaledSize = Vector2(size.width / scale, size.height / scale);
  35. sm.scale(scale).update();
  36. }
  37. void BaseGUI::renderBase(Renderer& r, const Base& base) {
  38. r.renderRectangle(base.pos, base.size,
  39. base.hovered ? INPUT_BACKGROUND_2 : INPUT_BACKGROUND);
  40. }
  41. void BaseGUI::renderLabels(Renderer& r) {
  42. for(const Label& label : labels) {
  43. renderCenteredString(r, label.base, label.text);
  44. }
  45. }
  46. void BaseGUI::renderInputs(Renderer& r) {
  47. for(Input& input : inputs) {
  48. input.text.setLimit(r.charsInSpace(input.base.size[0] - 20.0f));
  49. renderBase(r, input.base);
  50. StringBuffer<256> text(input.text);
  51. Vector2 pos = renderCenteredString(r, input.base, text);
  52. if(textInput == &input.text) {
  53. Vector2 cursor = r.getStringSize(text, input.text.getCursor());
  54. renderString(r, Vector2(pos[0] + cursor[0], pos[1] + 2.0f),
  55. "&292_");
  56. renderString(r, Vector2(pos[0] + cursor[0], pos[1] + 3.0f),
  57. "&292_");
  58. }
  59. }
  60. }
  61. void BaseGUI::renderButtons(Renderer& r) {
  62. for(const Button& button : buttons) {
  63. renderBase(r, button.base);
  64. renderCenteredString(r, button.base, button.text);
  65. }
  66. }
  67. void BaseGUI::render(float, ShaderMatrix&, Renderer& r) {
  68. renderLabels(r);
  69. renderInputs(r);
  70. renderButtons(r);
  71. }
  72. Vector2 BaseGUI::round(const Vector2& v) const {
  73. return Vector2(static_cast<int>(v[0] * scale) / scale,
  74. static_cast<int>(v[1] * scale) / scale);
  75. }
  76. void BaseGUI::renderString(Renderer& r, const Vector2& pos, const char* s) {
  77. r.renderString(round(pos), s);
  78. }
  79. BaseGUI::Label& BaseGUI::addLabel(const char* text) {
  80. labels.add({Base(), text});
  81. return labels[labels.getLength() - 1];
  82. }
  83. BaseGUI::Input& BaseGUI::addInput() {
  84. inputs.add();
  85. return inputs[inputs.getLength() - 1];
  86. }
  87. BaseGUI::Button& BaseGUI::addButton(const char* text) {
  88. buttons.add({Base(), text});
  89. return buttons[buttons.getLength() - 1];
  90. }
  91. Vector2 BaseGUI::renderCenteredString(Renderer& r, const Base& b,
  92. const char* text) {
  93. Vector2 pos = b.pos + (b.size - r.getStringSize(text)) * 0.5f;
  94. renderString(r, pos, text);
  95. return pos;
  96. }
  97. bool BaseGUI::isIn(const Vector2& pos, const Vector2& size,
  98. const Vector2& point) const {
  99. Vector2 end = pos + size;
  100. return pos[0] <= point[0] && point[0] <= end[0] && pos[1] <= point[1] &&
  101. point[1] <= end[1];
  102. }