Audio plugin host https://kx.studio/carla
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.

228 lines
5.5KB

  1. // generated by Fast Light User Interface Designer (fluid) version 1.0107f
  2. #include <cmath>
  3. #include <FL/fl_draw.H>
  4. #include "../Misc/Util.h"
  5. #include "WidgetPDial.h"
  6. //Copyright (c) 2003-2005 Nasca Octavian Paul
  7. //License: GNU GPL version 2 or later
  8. //static int numobj = 0;
  9. WidgetPDial::WidgetPDial(int x, int y, int w, int h, const char *label)
  10. :Fl_Dial(x, y, w, h, label), reset_value(0), integer_step(true),
  11. oldvalue(0.0f), pos(false), textset(false), value_offset(0.0),
  12. value_scale(1.0)
  13. {
  14. //cout << "[" << label << "] There are now " << ++numobj << endl;
  15. Fl_Group *save = Fl_Group::current();
  16. tipwin = new TipWin();
  17. tipwin->hide();
  18. Fl_Group::current(save);
  19. }
  20. WidgetPDial::~WidgetPDial()
  21. {
  22. //cout << "There are now " << --numobj << endl;
  23. delete tipwin;
  24. }
  25. void WidgetPDial::setRounding(unsigned int digits)
  26. {
  27. tipwin->setRounding(digits);
  28. }
  29. int WidgetPDial::handle(int event)
  30. {
  31. double dragsize, min = minimum(), max = maximum(), result;
  32. int dy;
  33. if (event == FL_RELEASE && Fl::event_clicks() == 1) {
  34. Fl::event_clicks(0);
  35. value(reset_value);
  36. value_damage();
  37. if (this->when() != 0)
  38. do_callback();
  39. return 1;
  40. }
  41. switch(event) {
  42. case FL_PUSH:
  43. if (integer_step)
  44. setRounding(0);
  45. else if (Fl::event_shift())
  46. setRounding(4);
  47. else
  48. setRounding(Fl::event_button1() ? 2 : 3);
  49. oldvalue = value();
  50. old_y = Fl::event_y();
  51. case FL_DRAG:
  52. getPos();
  53. dy = old_y - Fl::event_y();
  54. if (Fl::event_shift())
  55. dragsize = 20000.0f;
  56. else
  57. dragsize = Fl::event_button1() ? 200.0f : 2000.0f;
  58. value(clamp(oldvalue + dy / dragsize * (max - min)));
  59. tipwin->showValue(transform(value()));
  60. value_damage();
  61. if(this->when() != 0)
  62. do_callback();
  63. return 1;
  64. case FL_MOUSEWHEEL:
  65. if (Fl::belowmouse() != this)
  66. return 1;
  67. dy = - Fl::event_dy();
  68. if (integer_step) {
  69. setRounding(0);
  70. result = (int)(value() + dy * (Fl::event_ctrl() ? 1 : 8));
  71. } else {
  72. float dragsize;
  73. if (Fl::event_shift()) {
  74. dragsize = 10000.0;
  75. setRounding(4);
  76. } else if (Fl::event_ctrl()) {
  77. dragsize = 1000.0;
  78. setRounding(3);
  79. } else {
  80. dragsize = 100.0;
  81. setRounding(2);
  82. }
  83. result = value() + dy / dragsize * (max - min);
  84. }
  85. value(clamp(result));
  86. tipwin->showValue(transform(value()));
  87. value_damage();
  88. if(this->when() != 0)
  89. do_callback();
  90. return 1;
  91. case FL_ENTER:
  92. getPos();
  93. tipwin->showText();
  94. return 1;
  95. case FL_HIDE:
  96. case FL_LEAVE:
  97. tipwin->hide();
  98. resetPos();
  99. break;
  100. case FL_RELEASE:
  101. if (integer_step) {
  102. int rounded = value() + 0.5;
  103. value(clamp(rounded));
  104. }
  105. tipwin->hide();
  106. resetPos();
  107. if(this->when() == 0)
  108. do_callback();
  109. return 1;
  110. break;
  111. }
  112. return 0;
  113. //#endif
  114. }
  115. void WidgetPDial::draw()
  116. {
  117. #ifdef NTK_GUI
  118. box( FL_NO_BOX );
  119. Fl_Dial::draw();
  120. return;
  121. #else
  122. const int cx = x(), cy = y(), sx = w(), sy = h();
  123. const double a1 = angle1(), a2 = angle2();
  124. const double val = (value() - minimum()) / (maximum() - minimum());
  125. // even radius produces less artifacts if no antialiasing is avail
  126. const int rad = (sx > sy ? sy : sx) &~1;
  127. /* clears the button background */
  128. pdialcolor(160, 160, 160);
  129. fl_pie(cx - 2, cy - 2, rad + 4, rad + 4, 0, 360);
  130. /* dark outline */
  131. fl_color(60, 60, 60);
  132. fl_pie(cx - 1, cy - 1, rad + 2, rad + 2, 0, 360);
  133. /* Draws the button faceplate, min/max */
  134. pdialcolor(110, 110, 115);
  135. fl_pie(cx, cy, rad, rad, 270 - a2, 270 - a1);
  136. /* knob center */
  137. if (rad > 8) {
  138. pdialcolor(140, 140, 145);
  139. fl_pie(cx + 4, cy + 4, rad - 8, rad - 8, 0, 360);
  140. }
  141. /* value circle */
  142. double a = -(a2 - a1) * val - a1;
  143. fl_line_style(0, 2, 0);
  144. pdialcolor(0, 200, 0);
  145. fl_arc(cx + 1, cy + 1, rad - 2, rad - 2, a - 90, a1 - 180);
  146. fl_line_style(0);
  147. /* draw value line */
  148. int ll = rad/4;
  149. if (ll < 2) ll = 2;
  150. fl_push_matrix();
  151. fl_translate(cx + rad / 2, cy + rad / 2);
  152. fl_rotate(a - 90.0f);
  153. fl_translate(rad / 2, 0);
  154. fl_begin_polygon();
  155. pdialcolor(0, 0, 0);
  156. fl_vertex(-ll, 0);
  157. fl_vertex(0, 0);
  158. fl_end_polygon();
  159. fl_pop_matrix();
  160. #endif
  161. }
  162. void WidgetPDial::pdialcolor(int r, int g, int b)
  163. {
  164. if(active_r())
  165. fl_color(r, g, b);
  166. else
  167. fl_color(160 - (160 - r) / 3, 160 - (160 - b) / 3, 160 - (160 - b) / 3);
  168. }
  169. void WidgetPDial::tooltip(const char *c)
  170. {
  171. tipwin->setText(c);
  172. textset = true;
  173. }
  174. void WidgetPDial::getPos()
  175. {
  176. if(!pos) {
  177. tipwin->position(Fl::event_x_root(), Fl::event_y_root() + 20);
  178. pos = true;
  179. }
  180. }
  181. void WidgetPDial::resetPos()
  182. {
  183. pos = false;
  184. }
  185. void WidgetPDial::set_transform(float scale, float offset)
  186. {
  187. value_offset = offset;
  188. value_scale = scale;
  189. }
  190. float WidgetPDial::transform(float x)
  191. {
  192. return value_scale * x + value_offset;
  193. }