# data file for the Fltk User Interface Designer (fluid) version 1.0110 header_name {.h} code_name {.cxx} decl {\#include } {} decl {\#include } {public } decl {\#include } {public } decl {\#include } {public } decl {\#include } {public } decl {\#include } {public } decl {\#include } {public } decl {\#include} {} decl {\#include } {} decl {\#include } {} decl {\#include "Control.h"} {public } decl {\#include } {} decl {\#include "FreeEdit.h"} {public } decl {\#include } {public } class FreeEditUI {open : {public Fl_Box} } { Function {FreeEditUI(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {max_value_fl=min_value_fl=value_fl=position_fl=NULL; free_edit=NULL; control=NULL; current_point=-1; selected_point=-1; default_value=1.0;} {} } Function {~FreeEditUI()} {} { code {} {} } Function {init(FreeEdit *free_edit_,Control *control_)} {open } { code {free_edit=free_edit_; control=control_; free_edit->update_curve();} {} } Function {init_value_io(Fl_Value_Input *value_fl_,Fl_Value_Input *position_fl_,Fl_Value_Input *min_value_fl_,Fl_Value_Input *max_value_fl_)} {} { code {value_fl=value_fl_; position_fl=position_fl_; min_value_fl=min_value_fl_; max_value_fl=max_value_fl_; if (free_edit){ free_edit->extreme_y.set_min(min_value_fl->value()); free_edit->extreme_y.set_max(max_value_fl->value()); };} {} } Function {get_color(Fl_Color c)} {return_type Fl_Color } { code {if (free_edit->get_enabled()) return c; return fl_color_average(c,fl_rgb_color(178,178,178),0.1);} {} } Function {draw()} {open } { code {int ox=x(),oy=y(),lx=w(),ly=h(); //fl_color(FL_WHITE); fl_color(get_color(color())); fl_rectf(ox,oy,lx,ly); //fl_color(FL_GRAY); fl_color(get_color(labelcolor())); //draw grid fl_line_style(FL_SOLID); for (int ncoord=0;ncoord<2;ncoord++){ FreeEditExtremes *extreme=(ncoord==0)?&free_edit->extreme_x:&free_edit->extreme_y; if (extreme->get_scale()==FE_LOG){//logarithmic scale float p10=pow(10,floor(log10(extreme->get_min()))); int psteps=(int)(floor(log10(extreme->get_max()/extreme->get_min())))+1; for (int k=1;k<=psteps;k++){ for (int i=1;i<10;i++){ if (i==1) fl_line_style(FL_SOLID); else if(i==5) fl_line_style(FL_DASH); else fl_line_style(FL_DOT); float fpos=extreme->real_value_to_coord(p10*i); if ((fpos>0.0)&&(fpos<1.0)){ if (ncoord==0){ int pos=(int)(fpos*lx); fl_line(ox+pos,oy,ox+pos,oy+ly); }else{ int pos=(int)(ly-1-fpos*ly); fl_line(ox,oy+pos,ox+lx,oy+pos); }; }; }; p10*=10.0; }; }else{//linear scale float diff=extreme->get_max()-extreme->get_min(); float stepsize=pow(10,floor(log10( fabs(diff))))*0.1; if (stepsize>=1e-6){ int nsteps=(int)(fabs(diff)/stepsize)+1; if (nsteps>25) { nsteps/=5; stepsize*=5.0; }; float min=extreme->get_min(); float max=extreme->get_max(); float min1=(minreal_value_to_coord(min1+i*stepsize); int ks=(i+kstep)%10; if (ks<0) ks+=10; if (ks==0) fl_line_style(FL_SOLID); else if (ks==5) fl_line_style(FL_DASH); else fl_line_style(FL_DOT); if ((fpos>0.0)&&(fpos<1.0)){ if (ncoord==0){ int pos=(int)(fpos*lx); fl_line(ox+pos,oy,ox+pos,oy+ly); }else{ int pos=(int)(ly-1-fpos*ly); fl_line(ox,oy+pos,ox+lx,oy+pos); }; }; }; }; }; }; //draw the line fl_line_style(FL_SOLID,2); fl_color(get_color(labelcolor())); float *data=new float[lx]; free_edit->get_curve(lx,data,false); int oldy=0; for (int i=0;iget_npoints();i++){ if (!free_edit->is_enabled(i)) continue; fl_color(FL_BLACK); int x=(int)(free_edit->get_posx(i)*lx); int y=(int)((1.0-free_edit->get_posy(i))*ly); fl_circle(ox+x,oy+y,3); if (i==selected_point){ fl_color(get_color(FL_RED)); fl_circle(ox+x,oy+y,4); fl_circle(ox+x,oy+y,5); }; }; /* //test { fl_color(FL_RED); fl_line_style(FL_SOLID); free_edit->update_curve(); int oldy=0; //printf("draw %g\\n",free_edit->get_value(8000.0)); //printf("d %g\\n",free_edit->curve.data[1000]); for (int i=0;icurve.size-1)); //REALTYPE y=free_edit->curve.data[m]; REALTYPE freq=i/(float)lx*25000.0; REALTYPE y=free_edit->get_value(freq); //if (i<20) printf("%d %g\\n",i,y); //printf("%g %g\\n",freq,y); int newy=(int)((1.0-y)*ly); if (i) fl_line(ox+i-1,oy+oldy,ox+i,oy+newy); oldy=newy; }; }; */ /* fl_color(FL_RED); fl_line_style(FL_SOLID); int samplerate=44100; int nfreq=lx; float *freq1=new float [nfreq]; float *freq2=new float [nfreq]; float *tmpfreq1=new float [nfreq*2]; for (int i=0;i=nfreq) x0=nfreq-1; int x1=x0+1; if (x1>=nfreq) x1=nfreq-1; float xp=x-x0; if (xget_posy(0); float a=1.0-exp(-bandwidth*bandwidth*nfreq*0.002); a=pow(a,n); printf("%g\\n",a); for (int k=0;k0;i--){ tmpfreq1[i]=tmpfreq1[i+1]*a+tmpfreq1[i]*(1.0-a); }; }; //convert back to linear spectrum // for (int i=0;i=nfreq) x0=nfreq-1; int x1=x0+1; if (x1>=nfreq) x1=nfreq-1; float xp=x-x0; if (xget_enabled()) return Fl_Box::handle(event); int ox=x(),oy=y(),lx=w(),ly=h(); float px=(Fl::event_x()-ox)/(float)lx; float py=1.0-(Fl::event_y()-oy)/(float)ly; if (px<0) px=0; else if (px>1.0) px=1.0; if (py<0) py=0; else if (py>1.0) py=1.0; int closest=-1; float xyrap=(float)ly/(float)lx; for (int i=0;iget_npoints();i++){ if (!free_edit->is_enabled(i)) continue; float d=pow(px-free_edit->get_posx(i),2)+pow(py-free_edit->get_posy(i),2)*xyrap; if (d<0.0005) { closest=i; break; }; }; if (event==FL_PUSH){ if (closest>=0) { if (Fl::event_button()==1) selected_point=current_point=closest; if ((Fl::event_button()==3)&&(closest>=2)) { free_edit->set_enabled(closest,false); current_point=selected_point=-1; }; }else{ for (int i=0;iget_npoints();i++){ if (!free_edit->is_enabled(i)){ selected_point=closest=current_point=i; free_edit->set_posx(current_point,px); free_edit->set_posy(current_point,py); free_edit->set_enabled(i,true); break; }; }; }; refresh_value(); redraw(); update_curve(); return true; }; if (event==FL_RELEASE){ current_point=-1; refresh_value(); update_curve(); if (control) control->update_process_parameters(); return true; }; if (event==FL_DRAG){ if (current_point>=0){ if (current_point>=2) free_edit->set_posx(current_point,px); free_edit->set_posy(current_point,py); redraw(); }; refresh_value(); update_curve(); return true; }; return Fl_Box::handle(event);} {} } Function {refresh_value()} {} { code {if (!value_fl) return; value_fl->deactivate(); position_fl->deactivate(); if (selected_point<0) return; if (!free_edit->is_enabled(selected_point)) return; value_fl->activate(); position_fl->activate(); float val=free_edit->extreme_y.coord_to_real_value(free_edit->get_posy(selected_point)); val=((int)(val*10000.0))/10000.0; value_fl->value(val); float pos=free_edit->extreme_x.coord_to_real_value(free_edit->get_posx(selected_point)); pos=((int)(pos*1000.0))/1000.0; position_fl->value(pos);} {} } Function {set_selected_value(float val)} {} { code {if (!value_fl) return; if (selected_point<0) return; if (!free_edit->is_enabled(selected_point)) return; free_edit->set_posy(selected_point,free_edit->extreme_y.real_value_to_coord(val)); redraw(); update_curve();} {} } Function {set_selected_position(float pos)} {} { code {if (!value_fl) return; if (selected_point<0) return; if (!free_edit->is_enabled(selected_point)) return; free_edit->set_posx(selected_point,free_edit->extreme_x.real_value_to_coord(pos)); redraw(); update_curve();} {} } Function {set_min_value(float val)} {open } { code {unselect(); free_edit->extreme_y.set_min(val); redraw(); update_curve();} {} } Function {set_max_value(float val)} {open } { code {unselect(); free_edit->extreme_y.set_max(val); redraw(); update_curve();} {} } Function {unselect()} {} { code {selected_point=-1; refresh_value(); redraw();} {} } Function {set_smooth(float smooth)} {} { code {free_edit->set_smooth(smooth); redraw(); update_curve();} {} } Function {set_interp_mode(int interp_mode)} {} { code {free_edit->set_interp_mode((FreeEdit::INTERP_MODE)interp_mode); redraw(); update_curve();} {} } Function {clear()} {} { code {for (int i=2;iget_npoints();i++) free_edit->set_enabled(i,false); free_edit->set_all_values(default_value); redraw(); update_curve();} {} } Function {update_curve()} {} { code {free_edit->update_curve();} {} } decl {int current_point,selected_point;} {public } decl {Fl_Value_Input *value_fl,*position_fl,*min_value_fl,*max_value_fl;} {public } decl {FreeEdit *free_edit;} {public } decl {float default_value;} {public } decl {Control *control;} {public } } class FreeEditControls {open : {public Fl_Group} } { Function {FreeEditControls(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {free_edit_ui=NULL;} {} } Function {~FreeEditControls()} {} { code {hide();} {} } Function {init(FreeEditUI *free_edit_ui_,FREE_EDIT_EXTREME_SCALE scale_x=FE_LINEAR,float min_x=0.0,float max_x=1.0,FREE_EDIT_EXTREME_SCALE scale_val=FE_LINEAR,float min_val=0.0,float max_val=1.0,float default_value=1.0)} {open } { code {free_edit_ui=free_edit_ui_; make_window(); end(); free_edit_ui->init_value_io(free_edit_value_fl,free_edit_position_fl,free_edit_min_value_fl,free_edit_max_value_fl); feui->resize(this->x(),this->y(),this->w(),this->h()); FreeEdit *fe=free_edit_ui->free_edit; fe->extreme_x.set_min(min_x); fe->extreme_x.set_max(max_x); fe->extreme_x.set_scale(scale_x); fe->extreme_y.set_min(min_val); fe->extreme_y.set_max(max_val); fe->extreme_y.set_scale(scale_val); free_edit_min_value_fl->value(min_val); free_edit_max_value_fl->value(max_val); free_edit_ui->default_value=default_value; fe->set_all_values(default_value); enabled_check->value(fe->get_enabled());} {} } Function {update_parameters()} {open } { code {if (free_edit_ui->control) free_edit_ui->control->update_process_parameters();} {} } Function {make_window()} {open } { Fl_Window feui {open xywh {245 395 85 210} type Double color 50 labelfont 1 class Fl_Group visible } { Fl_Group {} {open xywh {0 0 85 210} box PLASTIC_THIN_UP_BOX color 52 labeltype ENGRAVED_LABEL labelsize 10 align 0 } { Fl_Value_Input free_edit_min_value_fl { label {Val.Min} callback {free_edit_ui->unselect(); free_edit_ui->set_min_value(o->value()); update_parameters();} xywh {5 110 50 15} labelsize 10 align 5 minimum -10000 maximum 10000 textfont 1 textsize 10 } Fl_Value_Input free_edit_max_value_fl { label {Val.Max} callback {free_edit_ui->unselect(); free_edit_ui->set_max_value(o->value()); update_parameters();} xywh {5 140 50 15} labelsize 10 align 5 minimum -10000 maximum 10000 value 1 textfont 1 textsize 10 } Fl_Value_Input free_edit_value_fl { label Value callback {free_edit_ui->set_selected_value(o->value()); update_parameters();} xywh {5 75 70 15} labelfont 1 labelsize 10 align 5 minimum 0.03 maximum 100 value 0.5 textfont 1 textsize 10 deactivate } Fl_Roller free_edit_smooth { label Sm callback {free_edit_ui->set_smooth(o->value()); update_parameters();} tooltip {Smooth function} xywh {60 110 15 45} labelsize 10 align 1 when 4 minimum 1 maximum 0 step 0.01 } Fl_Choice free_edit_interpolate { label Interpolate callback {free_edit_ui->set_interp_mode(o->value()); update_parameters();} xywh {5 170 70 15} down_box BORDER_BOX labelsize 11 align 5 textfont 1 textsize 10 } { MenuItem {} { label Linear xywh {10 10 36 21} labelfont 1 labelsize 10 } MenuItem {} { label Cosine xywh {10 10 36 21} labelfont 1 labelsize 10 } } Fl_Button {} { label clear callback {if (!fl_choice("Delete all points?","No","Yes",NULL)) return; free_edit_ui->clear(); update_parameters();} xywh {5 190 75 15} labelsize 12 } Fl_Light_Button enabled_check { label Enable callback {free_edit_ui->free_edit->set_enabled(o->value()); free_edit_ui->update_curve(); free_edit_ui->redraw(); update_parameters();} xywh {5 5 75 20} color 7 selection_color 88 labelfont 1 } Fl_Value_Input free_edit_position_fl { label Position callback {free_edit_ui->set_selected_position(o->value()); update_parameters();} xywh {5 45 70 15} labelsize 10 align 5 minimum 0.0001 maximum 10000 value 1 textfont 1 textsize 10 deactivate } } } } Function {refresh()} {open } { code {enabled_check->value(free_edit_ui->free_edit->get_enabled()); free_edit_min_value_fl->value(free_edit_ui->free_edit->extreme_y.get_min()); free_edit_max_value_fl->value(free_edit_ui->free_edit->extreme_y.get_max()); free_edit_interpolate->value(free_edit_ui->free_edit->get_interp_mode()); free_edit_smooth->value(free_edit_ui->free_edit->get_smooth()); free_edit_ui->update_curve(); free_edit_ui->redraw(); update_parameters();} {selected } } decl {FreeEditUI *free_edit_ui;} {} }