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.

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