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.

221 lines
4.8KB

  1. #pragma once
  2. #include "widgets.hpp"
  3. #include "blendish.h"
  4. namespace rack {
  5. struct Label : Widget {
  6. std::string text;
  7. Label() {
  8. box.size.y = BND_WIDGET_HEIGHT;
  9. }
  10. void draw(NVGcontext *vg) override;
  11. };
  12. struct List : OpaqueWidget {
  13. void step() override;
  14. void draw(NVGcontext *vg) override;
  15. };
  16. /** Deletes itself from parent when clicked */
  17. struct MenuOverlay : OpaqueWidget {
  18. void step() override;
  19. void onMouseDown(EventMouseDown &e) override;
  20. void onHoverKey(EventHoverKey &e) override;
  21. };
  22. struct MenuEntry;
  23. struct Menu : OpaqueWidget {
  24. Menu *parentMenu = NULL;
  25. Menu *childMenu = NULL;
  26. /** The entry which created the child menu */
  27. MenuEntry *activeEntry = NULL;
  28. Menu() {
  29. box.size = Vec(0, 0);
  30. }
  31. ~Menu();
  32. /** Deprecated. Just use addChild(child) instead */
  33. void pushChild(Widget *child) DEPRECATED {
  34. addChild(child);
  35. }
  36. void setChildMenu(Menu *menu);
  37. void step() override;
  38. void draw(NVGcontext *vg) override;
  39. void onScroll(EventScroll &e) override;
  40. };
  41. struct MenuEntry : OpaqueWidget {
  42. template <typename T = MenuEntry>
  43. static T *create() {
  44. T *o = Widget::create<T>(Vec());
  45. return o;
  46. }
  47. };
  48. struct MenuLabel : MenuEntry {
  49. std::string text;
  50. MenuLabel() {
  51. box.size = Vec(0, BND_WIDGET_HEIGHT);
  52. }
  53. void draw(NVGcontext *vg) override;
  54. void step() override;
  55. template <typename T = MenuLabel>
  56. static T *create(std::string text) {
  57. T *o = MenuEntry::create<T>();
  58. o->text = text;
  59. return o;
  60. }
  61. };
  62. struct MenuItem : MenuEntry {
  63. std::string text;
  64. std::string rightText;
  65. MenuItem() {
  66. box.size = Vec(0, BND_WIDGET_HEIGHT);
  67. }
  68. void draw(NVGcontext *vg) override;
  69. void step() override;
  70. virtual Menu *createChildMenu() {return NULL;}
  71. void onMouseEnter(EventMouseEnter &e) override;
  72. void onDragDrop(EventDragDrop &e) override;
  73. template <typename T = MenuItem>
  74. static T *create(std::string text, std::string rightText = "") {
  75. T *o = MenuEntry::create<T>();
  76. o->text = text;
  77. o->rightText = rightText;
  78. return o;
  79. }
  80. };
  81. struct WindowOverlay : OpaqueWidget {
  82. };
  83. struct WindowWidget : OpaqueWidget {
  84. std::string title;
  85. void draw(NVGcontext *vg) override;
  86. void onDragMove(EventDragMove &e) override;
  87. };
  88. struct Button : OpaqueWidget {
  89. std::string text;
  90. BNDwidgetState state = BND_DEFAULT;
  91. Button() {
  92. box.size.y = BND_WIDGET_HEIGHT;
  93. }
  94. void draw(NVGcontext *vg) override;
  95. void onMouseEnter(EventMouseEnter &e) override;
  96. void onMouseLeave(EventMouseLeave &e) override;
  97. void onDragStart(EventDragStart &e) override;
  98. void onDragEnd(EventDragEnd &e) override;
  99. void onDragDrop(EventDragDrop &e) override;
  100. };
  101. struct ChoiceButton : Button {
  102. void draw(NVGcontext *vg) override;
  103. };
  104. struct RadioButton : OpaqueWidget, QuantityWidget {
  105. BNDwidgetState state = BND_DEFAULT;
  106. RadioButton() {
  107. box.size.y = BND_WIDGET_HEIGHT;
  108. }
  109. void draw(NVGcontext *vg) override;
  110. void onMouseEnter(EventMouseEnter &e) override;
  111. void onMouseLeave(EventMouseLeave &e) override;
  112. void onDragDrop(EventDragDrop &e) override;
  113. };
  114. struct Slider : OpaqueWidget, QuantityWidget {
  115. BNDwidgetState state = BND_DEFAULT;
  116. Slider() {
  117. box.size.y = BND_WIDGET_HEIGHT;
  118. }
  119. void draw(NVGcontext *vg) override;
  120. void onDragStart(EventDragStart &e) override;
  121. void onDragMove(EventDragMove &e) override;
  122. void onDragEnd(EventDragEnd &e) override;
  123. void onMouseDown(EventMouseDown &e) override;
  124. };
  125. struct ScrollBar;
  126. /** Handles a container with ScrollBar */
  127. struct ScrollWidget : OpaqueWidget {
  128. Widget *container;
  129. ScrollBar *horizontalScrollBar;
  130. ScrollBar *verticalScrollBar;
  131. Vec offset;
  132. ScrollWidget();
  133. void draw(NVGcontext *vg) override;
  134. void step() override;
  135. void onMouseMove(EventMouseMove &e) override;
  136. void onScroll(EventScroll &e) override;
  137. };
  138. struct TextField : OpaqueWidget {
  139. std::string text;
  140. std::string placeholder;
  141. bool multiline = false;
  142. int begin = 0;
  143. int end = 0;
  144. int dragPos = 0;
  145. TextField() {
  146. box.size.y = BND_WIDGET_HEIGHT;
  147. }
  148. void draw(NVGcontext *vg) override;
  149. void onMouseDown(EventMouseDown &e) override;
  150. void onMouseMove(EventMouseMove &e) override;
  151. void onFocus(EventFocus &e) override;
  152. void onText(EventText &e) override;
  153. void onKey(EventKey &e) override;
  154. /** Inserts text at the cursor, replacing the selection if necessary */
  155. void insertText(std::string text);
  156. /** Replaces the entire text */
  157. void setText(std::string text);
  158. virtual int getTextPosition(Vec mousePos);
  159. virtual void onTextChange() {}
  160. };
  161. struct PasswordField : TextField {
  162. void draw(NVGcontext *vg) override;
  163. };
  164. struct ProgressBar : QuantityWidget {
  165. ProgressBar() {
  166. box.size.y = BND_WIDGET_HEIGHT;
  167. }
  168. void draw(NVGcontext *vg) override;
  169. };
  170. struct Tooltip : Widget {
  171. void step() override;
  172. void draw(NVGcontext *vg) override;
  173. };
  174. struct Scene : OpaqueWidget {
  175. Widget *overlay = NULL;
  176. void setOverlay(Widget *w);
  177. Menu *createMenu();
  178. void step() override;
  179. };
  180. ////////////////////
  181. // globals
  182. ////////////////////
  183. extern Scene *gScene;
  184. } // namespace rack