DPF Plugin examples
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.

254 lines
6.7KB

  1. /*
  2. * Author: Harry van Haaren 2013
  3. * harryhaaren@gmail.com
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18. * MA 02110-1301, USA.
  19. *
  20. */
  21. #ifndef AVTK_MASHER_H
  22. #define AVTK_MASHER_H
  23. #include <FL/Fl_Slider.H>
  24. namespace Avtk
  25. {
  26. class Masher : public Fl_Slider
  27. {
  28. public:
  29. Masher(int _x, int _y, int _w, int _h, const char *_label =0):
  30. Fl_Slider(_x, _y, _w, _h, _label)
  31. {
  32. x = _x;
  33. y = _y;
  34. w = _w;
  35. h = _h;
  36. _duration = 0.5;
  37. _volume = 1.0;
  38. _replace = 1.0;
  39. active = true;
  40. label = _label;
  41. highlight = false;
  42. mouseOver = false;
  43. }
  44. void volume(float v){ _volume = v; redraw(); }
  45. void replace(float r){ _replace = r; redraw(); }
  46. void duration(float d){ _duration = d; redraw(); }
  47. bool getActive(){return active;}
  48. void setActive(bool a){active = a; redraw();}
  49. float _volume;
  50. float _duration;
  51. float _replace;
  52. bool active;
  53. bool mouseOver;
  54. bool highlight;
  55. int x, y, w, h;
  56. const char* label;
  57. void draw()
  58. {
  59. if (damage() & FL_DAMAGE_ALL)
  60. {
  61. cairo_t *cr = Fl::cairo_cc();
  62. cairo_save( cr );
  63. // graph
  64. cairo_rectangle( cr, x, y, w, h );
  65. cairo_set_source_rgb( cr,28 / 255.f, 28 / 255.f , 28 / 255.f );
  66. cairo_fill(cr);
  67. // set up dashed lines, 1 px off, 1 px on
  68. double dashes[1];
  69. dashes[0] = 2.0;
  70. cairo_set_dash ( cr, dashes, 1, 0.0);
  71. // loop over each 2nd line, drawing dots
  72. cairo_set_line_width(cr, 1.0);
  73. cairo_set_source_rgb(cr, 0.4,0.4,0.4);
  74. for ( int i = 0; i < 4; i++ )
  75. {
  76. cairo_move_to( cr, x + ((w / 4.f)*i), y );
  77. cairo_line_to( cr, x + ((w / 4.f)*i), y + h );
  78. }
  79. for ( int i = 0; i < 4; i++ )
  80. {
  81. cairo_move_to( cr, x , y + ((h / 4.f)*i) );
  82. cairo_line_to( cr, x + w, y + ((h / 4.f)*i) );
  83. }
  84. cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 );
  85. cairo_stroke(cr);
  86. cairo_set_dash ( cr, dashes, 0, 0.0);
  87. // check that its a new "segment" to redraw
  88. int newAngle = ( _duration * 4.9f);
  89. int xc = (w) / 2.f;
  90. int yc = (h) / 2.f;
  91. float angle = 0.f;
  92. if ( newAngle == 0 )
  93. angle = 0.06;
  94. else if ( newAngle == 1 )
  95. angle = 0.125;
  96. else if ( newAngle <= 2 )
  97. angle = 0.25;
  98. else if ( newAngle <= 3 )
  99. angle = 0.5;
  100. else
  101. angle = 1;
  102. // replace: middle arc
  103. cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND );
  104. cairo_arc( cr, x + xc, y + yc, xc * 6.5 / 14, -(3.1415/2), _replace * 6.28 - (3.1415/2) );
  105. cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8 );
  106. cairo_set_line_width(cr, 9);
  107. cairo_stroke(cr);
  108. if ( newAngle == 0 )
  109. cairo_set_source_rgba (cr, 1.0, 0.0 , 0.0, 1 );
  110. else if ( newAngle == 1 )
  111. cairo_set_source_rgba (cr, 1.0, 0.48, 0.0, 1 );
  112. else if ( newAngle <= 2 )
  113. cairo_set_source_rgba (cr, 0.0, 1.0 , 0.0, 0.8 );
  114. else if ( newAngle <= 3 )
  115. cairo_set_source_rgba (cr, 0.0, 0.48, 1.0, 1 );
  116. else
  117. cairo_set_source_rgba (cr, 1.0, 0.0, 1.0, 0.7 );
  118. // duration : outside arc
  119. cairo_arc( cr, x + xc, y + yc, xc * 9.5 / 14, -(3.1415/2), angle * 6.28 - (3.1415/2) );
  120. cairo_set_line_width(cr, 11);
  121. cairo_stroke(cr);
  122. // volume: inside circle
  123. cairo_set_source_rgba(cr,0.3,0.3,0.3, 0.5);
  124. cairo_arc(cr, x + xc, y + yc, 25 * _volume, 0, 2 * 3.1415);
  125. cairo_set_line_width(cr, 4.2);
  126. cairo_fill_preserve(cr);
  127. cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8 );
  128. cairo_set_line_width(cr, 2);
  129. cairo_stroke(cr);
  130. // stroke rim
  131. cairo_rectangle(cr, x, y, w, h);
  132. //cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 );
  133. cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 );
  134. cairo_set_line_width(cr, 1.0);
  135. cairo_stroke( cr );
  136. if ( !active )
  137. {
  138. // big grey X
  139. cairo_set_line_width(cr, 20.0);
  140. cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7);
  141. cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) );
  142. cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) );
  143. cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) );
  144. cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) );
  145. cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT);
  146. cairo_stroke( cr );
  147. }
  148. cairo_restore( cr );
  149. draw_label();
  150. }
  151. }
  152. void resize(int X, int Y, int W, int H)
  153. {
  154. Fl_Widget::resize(X,Y,W,H);
  155. x = X;
  156. y = Y;
  157. w = W;
  158. h = H;
  159. redraw();
  160. }
  161. int handle(int event)
  162. {
  163. switch(event) {
  164. case FL_PUSH:
  165. highlight = 1;
  166. if ( Fl::event_button() == FL_RIGHT_MOUSE )
  167. {
  168. active = !active;
  169. redraw();
  170. do_callback();
  171. }
  172. return 1;
  173. case FL_DRAG: {
  174. int t = Fl::event_inside(this);
  175. if (t != highlight) {
  176. highlight = t;
  177. redraw();
  178. }
  179. }
  180. return 1;
  181. case FL_ENTER:
  182. mouseOver = true;
  183. redraw();
  184. return 1;
  185. case FL_LEAVE:
  186. mouseOver = false;
  187. redraw();
  188. return 1;
  189. case FL_RELEASE:
  190. if (highlight) {
  191. highlight = 0;
  192. redraw();
  193. }
  194. return 1;
  195. case FL_SHORTCUT:
  196. if ( test_shortcut() )
  197. {
  198. do_callback();
  199. return 1;
  200. }
  201. return 0;
  202. default:
  203. return Fl_Widget::handle(event);
  204. }
  205. }
  206. };
  207. } // Avtk
  208. #endif // AVTK_ADSR_H