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.

269 lines
5.8KB

  1. // generated by Fast Light User Interface Designer (fluid) version 2.00
  2. #include "Fl_Knob.H"
  3. #include <FL/fl_draw.H>
  4. #include <math.h>
  5. #include <iostream>
  6. Fl_Knob::Fl_Knob(int xx,int yy,int ww,int hh,const char *l): Fl_Valuator(xx,yy,ww,hh,l) {
  7. a1 = 35;
  8. a2 = 325;
  9. _type = DOTLIN;
  10. _percent = 0.3;
  11. _scaleticks = 10;
  12. }
  13. Fl_Knob::~Fl_Knob() {
  14. }
  15. void Fl_Knob::draw() {
  16. int ox,oy,ww,hh,side;
  17. float sa,ca,a_r;
  18. unsigned char rr,gg,bb;
  19. ox = x();
  20. oy = y();
  21. ww = w();
  22. hh = h();
  23. draw_label();
  24. fl_clip(ox,oy,ww,hh);
  25. if (ww > hh)
  26. {
  27. side = hh;
  28. ox = ox + (ww - side) / 2;
  29. }
  30. else
  31. {
  32. side = ww;
  33. oy = oy + (hh - side) / 2;
  34. }
  35. side = w() > h () ? hh:ww;
  36. int dam = damage();
  37. if (dam & FL_DAMAGE_ALL)
  38. {
  39. int col = parent()->color();
  40. fl_color(col);
  41. fl_rectf(ox,oy,side,side);
  42. Fl::get_color((Fl_Color)col,rr,gg,bb);
  43. shadow(-60,rr,gg,bb);
  44. fl_pie(ox+9,oy+9,side-12,side-12,0,360);
  45. if (_type!=NONE) draw_scale(ox,oy,side);
  46. col = color();
  47. Fl::get_color((Fl_Color)col,rr,gg,bb);
  48. shadow(15,rr,gg,bb);
  49. fl_pie(ox+6,oy+6,side-12,side-12,40,80);
  50. shadow(30,rr,gg,bb);
  51. fl_pie(ox+6,oy+6,side-12,side-12,80,220);
  52. shadow(-15,rr,gg,bb);
  53. fl_pie(ox+6,oy+6,side-12,side-12,220,260);
  54. shadow(-30,rr,gg,bb);
  55. fl_pie(ox+6,oy+6,side-12,side-12,260,400);
  56. fl_color(FL_BLACK);
  57. fl_arc(ox+6,oy+6,side-11,side-11,0,360);
  58. fl_color(col);
  59. fl_pie(ox+10,oy+10,side-20,side-20,0,360);
  60. }
  61. else
  62. {
  63. fl_color(color());
  64. fl_pie(ox+10,oy+10,side-20,side-20,0,360);
  65. }
  66. Fl::get_color((Fl_Color)color(),rr,gg,bb);
  67. shadow(10,rr,gg,bb);
  68. fl_pie(ox+10,oy+10,side-20,side-20,110,150);
  69. fl_pie(ox+10,oy+10,side-20,side-20,290,330);
  70. shadow(17,rr,gg,bb);
  71. fl_pie(ox+10,oy+10,side-20,side-20,120,140);
  72. fl_pie(ox+10,oy+10,side-20,side-20,300,320);
  73. shadow(25,rr,gg,bb);
  74. fl_pie(ox+10,oy+10,side-20,side-20,127,133);
  75. fl_pie(ox+10,oy+10,side-20,side-20,307,313);
  76. draw_cursor(ox,oy,side);
  77. fl_pop_clip();
  78. }
  79. int Fl_Knob::handle(int event) {
  80. int ox,oy,ww,hh;
  81. ox = x() + 10; oy = y() + 10;
  82. ww = w() - 20;
  83. hh = h()-20;
  84. switch (event)
  85. {
  86. case FL_PUSH:
  87. handle_push();
  88. case FL_DRAG:
  89. {
  90. int mx = Fl::event_x()-ox-ww/2;
  91. int my = Fl::event_y()-oy-hh/2;
  92. if (!mx && !my) return 1;
  93. double angle = 270-atan2((float)-my, (float)mx)*180/M_PI;
  94. double oldangle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1;
  95. while (angle < oldangle-180) angle += 360;
  96. while (angle > oldangle+180) angle -= 360;
  97. double val;
  98. if ((a1<a2) ? (angle <= a1) : (angle >= a1))
  99. {
  100. val = minimum();
  101. }
  102. else
  103. if ((a1<a2) ? (angle >= a2) : (angle <= a2))
  104. {
  105. val = maximum();
  106. }
  107. else
  108. {
  109. val = minimum() + (maximum()-minimum())*(angle-a1)/(a2-a1);
  110. }
  111. handle_drag(clamp(round(val)));
  112. }
  113. return 1;
  114. case FL_RELEASE:
  115. handle_release();
  116. return 1;
  117. default:
  118. return 0;
  119. }
  120. return 0;
  121. }
  122. void Fl_Knob::type(int ty) {
  123. _type = ty;
  124. }
  125. void Fl_Knob::shadow(const int offs,const uchar r,uchar g,uchar b) {
  126. int rr,gg,bb;
  127. rr = r + offs;
  128. rr = rr > 255 ? 255:rr;
  129. rr = rr < 0 ? 0:rr;
  130. gg = g + offs;
  131. gg = gg > 255 ? 255:gg;
  132. gg = gg < 0 ? 0:gg;
  133. bb = b + offs;
  134. bb = bb > 255 ? 255:bb;
  135. bb = bb < 0 ? 0:bb;
  136. fl_color((uchar)rr,(uchar)gg,(uchar)bb);
  137. }
  138. void Fl_Knob::draw_scale(const int ox,const int oy,const int side) {
  139. float x1,y1,x2,y2,rds,cx,cy,ca,sa;
  140. rds = side / 2;
  141. cx = ox + side / 2;
  142. cy = oy + side / 2;
  143. if (!(_type & DOTLOG_3))
  144. {
  145. if (_scaleticks == 0) return;
  146. double a_step = (10.0*3.14159/6.0) / _scaleticks;
  147. double a_orig = -(3.14159/3.0);
  148. for (int a = 0; a <= _scaleticks; a++)
  149. {
  150. double na = a_orig + a * a_step;
  151. ca = cos(na);
  152. sa = sin(na);
  153. x1 = cx + rds * ca;
  154. y1 = cy - rds * sa;
  155. x2 = cx + (rds-6) * ca;
  156. y2 = cy - (rds-6) * sa;
  157. fl_color(FL_BLACK);
  158. fl_line(x1,y1,x2,y2);
  159. fl_color(FL_WHITE);
  160. if (sa*ca >=0)
  161. fl_line(x1+1,y1+1,x2+1,y2+1);
  162. else
  163. fl_line(x1+1,y1-1,x2+1,y2-1);
  164. }
  165. }
  166. else
  167. {
  168. int nb_dec = (_type & DOTLOG_3);
  169. for (int k = 0; k < nb_dec; k++)
  170. {
  171. double a_step = (10.0*3.14159/6.0) / nb_dec;
  172. double a_orig = -(3.14159/3.0) + k * a_step;
  173. for (int a = (k) ? 2:1; a <= 10; )
  174. {
  175. double na = a_orig + log10((double)a) * a_step;
  176. ca = cos(na);
  177. sa = sin(na);
  178. x1 = cx - rds * ca;
  179. y1 = cy - rds * sa;
  180. x2 = cx - (rds-6) * ca;
  181. y2 = cy - (rds-6) * sa;
  182. fl_color(FL_BLACK);
  183. fl_line(x1,y1,x2,y2);
  184. fl_color(FL_WHITE);
  185. if (sa*ca <0)
  186. fl_line(x1+1,y1+1,x2+1,y2+1);
  187. else
  188. fl_line(x1+1,y1-1,x2+1,y2-1);
  189. if ((a == 1) || (nb_dec == 1))
  190. a += 1;
  191. else
  192. a += 2;
  193. }
  194. }
  195. }
  196. }
  197. void Fl_Knob::draw_cursor(const int ox,const int oy,const int side) {
  198. float rds,cur,cx,cy;
  199. double angle;
  200. rds = (side - 20) / 2.0;
  201. cur = _percent * rds / 2;
  202. cx = ox + side / 2;
  203. cy = oy + side / 2;
  204. angle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1;
  205. fl_push_matrix();
  206. fl_scale(1,1);
  207. fl_translate(cx,cy);
  208. fl_rotate(-angle);
  209. fl_translate(0,rds-cur-2.0);
  210. if (_type<LINELIN)
  211. {
  212. fl_begin_polygon();
  213. fl_color(selection_color());
  214. fl_circle(0.0,0.0,cur);
  215. fl_end_polygon();
  216. fl_begin_loop();
  217. fl_color(FL_BLACK);
  218. fl_circle(0.0,0.0,cur);
  219. fl_end_loop();
  220. }
  221. else
  222. {
  223. fl_begin_polygon();
  224. fl_color(selection_color());
  225. fl_vertex(-1.5,-cur);
  226. fl_vertex(-1.5,cur);
  227. fl_vertex(1.5,cur);
  228. fl_vertex(1.5,-cur);
  229. fl_end_polygon();
  230. fl_begin_loop();
  231. fl_color(FL_BLACK);
  232. fl_vertex(-1.5,-cur);
  233. fl_vertex(-1.5,cur);
  234. fl_vertex(1.5,cur);
  235. fl_vertex(1.5,-cur);
  236. fl_end_loop();
  237. }
  238. fl_pop_matrix();
  239. }
  240. void Fl_Knob::cursor(const int pc) {
  241. _percent = (float)pc/100.0;
  242. if (_percent < 0.05) _percent = 0.05;
  243. if (_percent > 1.0) _percent = 1.0;
  244. if (visible()) damage(FL_DAMAGE_CHILD);
  245. }
  246. void Fl_Knob::scaleticks(const int tck) {
  247. _scaleticks = tck;
  248. if (_scaleticks < 0) _scaleticks = 0;
  249. if (_scaleticks > 31) _scaleticks = 31;
  250. if (visible()) damage(FL_DAMAGE_ALL);
  251. }