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.

347 lines
7.9KB

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0100
  3. header_name {.H}
  4. code_name {.cxx}
  5. decl {\#include <Fl/Fl_Valuator.H>} {public
  6. }
  7. decl {\#include <Fl/fl_draw.H>} {}
  8. decl {\#include <math.h>} {}
  9. class Fl_Knob {open : {public Fl_Valuator}
  10. } {
  11. decl {enum Fl_Knobtype {DOTLIN=0,DOTLOG_1,DOTLOG_2,DOTLOG_3,LINELIN,LINELOG_1,LINELOG_2,LINELOG_3};} {public
  12. }
  13. decl {int _type;} {}
  14. decl {float _percent;} {}
  15. decl {float _capsize;} {}
  16. decl {int _capr,_capg,_capb;} {}
  17. decl {int _scaleticks;} {}
  18. decl {short a1,a2;} {}
  19. Function {Fl_Knob(int xx,int yy,int ww,int hh,const char *l=0): Fl_Valuator(xx,yy,ww,hh,l)} {} {
  20. code {int side;
  21. a1 = 35;
  22. a2 = 325;
  23. _type = DOTLIN;
  24. _percent = 0.3;
  25. _scaleticks = 10;
  26. _capr = _capg = _capb = -1;
  27. side = ww > hh ? hh:ww;
  28. _capsize = 100*(float)(side - 10) / (float)side;} {}
  29. }
  30. Function {~Fl_Knob()} {} {}
  31. Function {draw()} {open private
  32. } {
  33. code {int ox,oy,ww,hh,side;
  34. int capradius;
  35. int capoffset;
  36. float sa,ca,a_r;
  37. unsigned char rr,gg,bb;
  38. ox = x();
  39. oy = y();
  40. ww = w();
  41. hh = h();
  42. draw_label();
  43. fl_clip(ox,oy,ww,hh);
  44. if (ww > hh)
  45. {
  46. side = hh;
  47. ox = ox + (ww - side) / 2;
  48. }
  49. else
  50. {
  51. side = ww;
  52. oy = oy + (hh - side) / 2;
  53. }
  54. side = ww > hh ? hh:ww;
  55. int dam = damage();
  56. capradius = (int)((side-11) * (_capsize / 100.0));
  57. capoffset = (side - capradius)/2;
  58. if (dam & FL_DAMAGE_ALL)
  59. {
  60. int col = ((Fl_Widget *)parent())->color();
  61. // Clear rectangle with parent color
  62. fl_color(col);
  63. fl_rectf(ox,oy,side,side);
  64. // Cast round shadow
  65. Fl::get_color((Fl_Color)col,rr,gg,bb);
  66. shadow(-60,rr,gg,bb);
  67. fl_pie(ox+9,oy+9,side-12,side-12,0,360);
  68. // Draw ticks
  69. draw_scale(ox,oy,side);
  70. col = color();
  71. Fl::get_color((Fl_Color)col,rr,gg,bb);
  72. // Draw hilights of the button crown
  73. shadow(7,rr,gg,bb);
  74. fl_pie(ox+6,oy+6,side-12,side-12,40,50);
  75. fl_pie(ox+6,oy+6,side-12,side-12,260,270);
  76. shadow(15,rr,gg,bb);
  77. fl_pie(ox+6,oy+6,side-12,side-12,50,70);
  78. fl_pie(ox+6,oy+6,side-12,side-12,230,260);
  79. shadow(25,rr,gg,bb);
  80. fl_pie(ox+6,oy+6,side-12,side-12,70,80);
  81. fl_pie(ox+6,oy+6,side-12,side-12,220,230);
  82. shadow(30,rr,gg,bb);
  83. fl_pie(ox+6,oy+6,side-12,side-12,80,220);
  84. shadow(-9,rr,gg,bb);
  85. fl_pie(ox+6,oy+6,side-12,side-12,30,40);
  86. fl_pie(ox+6,oy+6,side-12,side-12,270,280);
  87. shadow(-18,rr,gg,bb);
  88. fl_pie(ox+6,oy+6,side-12,side-12,280,400);
  89. shadow(-28,rr,gg,bb);
  90. fl_pie(ox+6,oy+6,side-12,side-12,290,390);
  91. fl_color(FL_BLACK);
  92. fl_arc(ox+6,oy+6,side-11,side-11,0,360);
  93. }
  94. Fl::get_color((Fl_Color)color(),rr,gg,bb);
  95. // Draw button cap
  96. if (_capr != -1)
  97. { rr = _capr; gg = _capg; bb = _capb;}
  98. else
  99. Fl::get_color((Fl_Color)color(),rr,gg,bb);
  100. fl_color(rr,gg,bb);
  101. int xx = ox + capoffset;
  102. int yy = oy + capoffset;
  103. int dx = capradius;
  104. fl_pie(xx,yy,dx,dx,0,360);
  105. // Draw hilights of button cap
  106. shadow(10,rr,gg,bb);
  107. fl_pie(xx,yy,dx,dx,110,150);
  108. fl_pie(xx,yy,dx,dx,290,330);
  109. shadow(17,rr,gg,bb);
  110. fl_pie(xx,yy,dx,dx,120,140);
  111. fl_pie(xx,yy,dx,dx,300,320);
  112. shadow(30,rr,gg,bb);
  113. fl_pie(xx,yy,dx,dx,127,133);
  114. fl_pie(xx,yy,dx,dx,307,313);
  115. shadow(-7,rr,gg,bb);
  116. fl_pie(xx,yy,dx,dx,50,90);
  117. fl_pie(xx,yy,dx,dx,230,290);
  118. shadow(-15,rr,gg,bb);
  119. fl_pie(xx,yy,dx,dx,65,75);
  120. fl_pie(xx,yy,dx,dx,242,278);
  121. // Draw the button cursor
  122. draw_cursor(ox+side/2,oy+side/2,dx/2);
  123. fl_pop_clip();} {selected
  124. }
  125. }
  126. Function {handle(int event)} {private return_type int
  127. } {
  128. code {int ox,oy,ww,hh;
  129. ox = x() + 10; oy = y() + 10;
  130. ww = w() - 20;
  131. hh = h()-20;
  132. switch (event)
  133. {
  134. case FL_PUSH:
  135. handle_push();
  136. case FL_DRAG:
  137. {
  138. int mx = Fl::event_x()-ox-ww/2;
  139. int my = Fl::event_y()-oy-hh/2;
  140. if (!mx && !my) return 1;
  141. double angle = 270-atan2((float)-my, (float)mx)*180/M_PI;
  142. double oldangle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1;
  143. while (angle < oldangle-180) angle += 360;
  144. while (angle > oldangle+180) angle -= 360;
  145. double val;
  146. if ((a1<a2) ? (angle <= a1) : (angle >= a1))
  147. {
  148. val = minimum();
  149. }
  150. else
  151. if ((a1<a2) ? (angle >= a2) : (angle <= a2))
  152. {
  153. val = maximum();
  154. }
  155. else
  156. {
  157. val = minimum() + (maximum()-minimum())*(angle-a1)/(a2-a1);
  158. }
  159. handle_drag(clamp(round(val)));
  160. }
  161. return 1;
  162. case FL_RELEASE:
  163. handle_release();
  164. return 1;
  165. default:
  166. return 0;
  167. }
  168. return 0;} {}
  169. }
  170. Function {shadow(const int offs,const uchar r,uchar g,uchar b)} {private
  171. } {
  172. code {int rr,gg,bb;
  173. rr = r + offs;
  174. rr = rr > 255 ? 255:rr;
  175. rr = rr < 0 ? 0:rr;
  176. gg = g + offs;
  177. gg = gg > 255 ? 255:gg;
  178. gg = gg < 0 ? 0:gg;
  179. bb = b + offs;
  180. bb = bb > 255 ? 255:bb;
  181. bb = bb < 0 ? 0:bb;
  182. fl_color((uchar)rr,(uchar)gg,(uchar)bb);} {}
  183. }
  184. Function {draw_scale(const int ox,const int oy,const int side)} {private
  185. } {
  186. code {float x1,y1,x2,y2,rds,cx,cy,ca,sa;
  187. float minv,maxv,curv;
  188. rds = side / 2;
  189. cx = ox + side / 2;
  190. cy = oy + side / 2;
  191. if (!(_type & DOTLOG_3))
  192. {
  193. if (_scaleticks == 0) return;
  194. double a_step = (10.0*3.14159/6.0) / _scaleticks;
  195. double a_orig = -(3.14159/3.0);
  196. for (int a = 0; a <= _scaleticks; a++)
  197. {
  198. double na = a_orig + a * a_step;
  199. ca = cos(na);
  200. sa = sin(na);
  201. x1 = cx + rds * ca;
  202. y1 = cy - rds * sa;
  203. x2 = cx + (rds-6) * ca;
  204. y2 = cy - (rds-6) * sa;
  205. fl_color(FL_BLACK);
  206. fl_line(x1,y1,x2,y2);
  207. fl_color(FL_WHITE);
  208. if (sa*ca >=0)
  209. fl_line(x1+1,y1+1,x2+1,y2+1);
  210. else
  211. fl_line(x1+1,y1-1,x2+1,y2-1);
  212. }
  213. }
  214. else
  215. {
  216. int nb_dec = (_type & DOTLOG_3);
  217. for (int k = 0; k < nb_dec; k++)
  218. {
  219. double a_step = (10.0*3.14159/6.0) / nb_dec;
  220. double a_orig = -(3.14159/3.0) + k * a_step;
  221. for (int a = (k) ? 2:1; a <= 10; )
  222. {
  223. double na = a_orig + log10((double)a) * a_step;
  224. ca = cos(na);
  225. sa = sin(na);
  226. x1 = cx - rds * ca;
  227. y1 = cy - rds * sa;
  228. x2 = cx - (rds-6) * ca;
  229. y2 = cy - (rds-6) * sa;
  230. fl_color(FL_BLACK);
  231. fl_line(x1,y1,x2,y2);
  232. fl_color(FL_WHITE);
  233. if (sa*ca <0)
  234. fl_line(x1+1,y1+1,x2+1,y2+1);
  235. else
  236. fl_line(x1+1,y1-1,x2+1,y2-1);
  237. if ((a == 1) || (nb_dec == 1))
  238. a += 1;
  239. else
  240. a += 2;
  241. }
  242. }
  243. }} {}
  244. }
  245. Function {draw_cursor(const int ox,const int oy,const int side)} {open private
  246. } {
  247. code {float rds,cur,cx,cy;
  248. double angle;
  249. // rds = (side-40) * _capsize / 100.0;
  250. rds=side;
  251. cur = _percent * rds / 2;
  252. // cx = ox + side / 2;
  253. // cy = oy + side / 2;
  254. cx = ox;cy = oy;
  255. angle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1;
  256. fl_push_matrix();
  257. fl_scale(1,1);
  258. fl_translate(cx,cy);
  259. fl_rotate(-angle);
  260. fl_translate(0,rds-cur-2.0);
  261. if (_type<LINELIN)
  262. {
  263. fl_begin_polygon();
  264. fl_color(selection_color());
  265. fl_circle(0.0,0.0,cur);
  266. fl_end_polygon();
  267. fl_begin_loop();
  268. fl_color(FL_BLACK);
  269. fl_circle(0.0,0.0,cur);
  270. fl_end_loop();
  271. }
  272. else
  273. {
  274. fl_begin_polygon();
  275. fl_color(selection_color());
  276. fl_vertex(-1.5,-cur);
  277. fl_vertex(-1.5,cur);
  278. fl_vertex(1.5,cur);
  279. fl_vertex(1.5,-cur);
  280. fl_end_polygon();
  281. fl_begin_loop();
  282. fl_color(FL_BLACK);
  283. fl_vertex(-1.5,-cur);
  284. fl_vertex(-1.5,cur);
  285. fl_vertex(1.5,cur);
  286. fl_vertex(1.5,-cur);
  287. fl_end_loop();
  288. }
  289. fl_pop_matrix();} {}
  290. }
  291. Function {type(int ty)} {} {
  292. code {_type = ty;} {}
  293. }
  294. Function {cursor(const int pc)} {} {
  295. code {_percent = (float)pc/100.0;
  296. if (_percent < 0.05) _percent = 0.05;
  297. if (_percent > 1.0) _percent = 1.0;
  298. if (visible()) damage(FL_DAMAGE_CHILD);} {}
  299. }
  300. Function {scaleticks(const int tck)} {} {
  301. code {_scaleticks = tck;
  302. if (_scaleticks < 0) _scaleticks = 0;
  303. if (_scaleticks > 31) _scaleticks = 31;
  304. if (visible()) damage(FL_DAMAGE_ALL);} {}
  305. }
  306. Function {capsize(const float percent)} {} {
  307. code {if (percent > 100) return;
  308. if (percent < 40) return;
  309. _capsize = percent;} {}
  310. }
  311. Function {capcolor(const Fl_Color col)} {} {
  312. code {uchar rr,gg,bb;
  313. Fl::get_color(col,rr,gg,bb);
  314. _capr = rr;
  315. _capg = gg;
  316. _capb = bb;} {}
  317. }
  318. Function {capcolor(const uchar cr,const uchar cg,const uchar cb)} {} {
  319. code {_capr = cr;
  320. _capg = cg;
  321. _capb = cb;} {}
  322. }
  323. }