You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
1.9KB

  1. #include "widgets.hpp"
  2. // for gVg
  3. #include "gui.hpp"
  4. // for key codes
  5. #include <GLFW/glfw3.h>
  6. namespace rack {
  7. void TextField::draw(NVGcontext *vg) {
  8. BNDwidgetState state;
  9. if (this == gSelectedWidget)
  10. state = BND_ACTIVE;
  11. else if (this == gHoveredWidget)
  12. state = BND_HOVER;
  13. else
  14. state = BND_DEFAULT;
  15. bndTextField(vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_NONE, state, -1, text.c_str(), begin, end);
  16. if (text.empty() && state != BND_ACTIVE) {
  17. bndIconLabelCaret(vg, 0.0, 0.0, box.size.x, box.size.y, -1, bndGetTheme()->textFieldTheme.itemColor, 13, placeholder.c_str(), bndGetTheme()->textFieldTheme.itemColor, 0, -1);
  18. }
  19. }
  20. Widget *TextField::onMouseDown(Vec pos, int button) {
  21. end = begin = bndTextFieldTextPosition(gVg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), pos.x, pos.y);
  22. return OpaqueWidget::onMouseDown(pos, button);
  23. }
  24. void TextField::onText(int codepoint) {
  25. if (begin < end)
  26. text.erase(begin, end - begin);
  27. char c = codepoint;
  28. text.insert(begin, &c, 1);
  29. begin++;
  30. end = begin;
  31. }
  32. void TextField::onKey(int key) {
  33. switch (key) {
  34. case GLFW_KEY_BACKSPACE:
  35. if (begin < end) {
  36. text.erase(begin, end - begin);
  37. }
  38. else {
  39. begin--;
  40. if (begin >= 0)
  41. text.erase(begin, 1);
  42. }
  43. end = begin;
  44. break;
  45. case GLFW_KEY_DELETE:
  46. if (begin < end) {
  47. text.erase(begin, end - begin);
  48. }
  49. else {
  50. text.erase(begin, 1);
  51. }
  52. end = begin;
  53. break;
  54. case GLFW_KEY_LEFT:
  55. if (begin < end) {
  56. }
  57. else {
  58. begin--;
  59. }
  60. end = begin;
  61. break;
  62. case GLFW_KEY_RIGHT:
  63. if (begin < end) {
  64. begin = end;
  65. }
  66. else {
  67. begin++;
  68. }
  69. end = begin;
  70. break;
  71. case GLFW_KEY_HOME:
  72. end = begin = 0;
  73. break;
  74. case GLFW_KEY_END:
  75. end = begin = text.size();
  76. break;
  77. }
  78. begin = mini(maxi(begin, 0), text.size());
  79. end = mini(maxi(end, 0), text.size());
  80. }
  81. void TextField::onSelect() {
  82. begin = 0;
  83. end = text.size();
  84. }
  85. } // namespace rack