|
- /* SpiralPlugin
- * Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
- #include <stdio.h>
- #include "ComplexEnvelopePluginGUI.h"
- #include <FL/fl_draw.h>
- #include <FL/fl_draw.H>
-
- static const int GUI_COLOUR = 179;
- static const int GUIBG_COLOUR = 144;
- static const int GUIBG2_COLOUR = 145;
- static const float TIMED_SLIDER_MAX = 3.0f;
-
- /////////////////////////////////////////////////////////////////////////
-
- Fl_Envelope::Fl_Handle::Fl_Handle(int x,int y, int w, int h, char *Name) :
- Fl_Widget(x,y,w,h,Name),
- m_DelMe(false),
- m_Changed(false),
- m_Coincident(false)
- {
- }
-
- Fl_Envelope::Fl_Handle::~Fl_Handle()
- {
- }
-
- int Fl_Envelope::Fl_Handle::handle(int event)
- {
- int Mousebutton=Fl::event_button();
- if (event==FL_DRAG && Mousebutton==1)
- {
- x(Fl::event_x()-(w()/2));
- y(Fl::event_y()-(h()/2));
-
- // restrict the movement to the parent's area
- if (x()<parent()->x()) x(parent()->x());
- if (x()>parent()->x()+parent()->w()-w()) x(parent()->x()+parent()->w()-w());
- if (y()<parent()->y()) y(parent()->y());
- if (y()>parent()->y()+parent()->h()-h()) y(parent()->y()+parent()->h()-h());
-
- m_Changed=true;
-
- parent()->redraw();
- redraw();
- }
-
- if (event==FL_PUSH && Mousebutton==3)
- {
- m_DelMe=true;
- }
-
- return 1;
- }
-
- void Fl_Envelope::Fl_Handle::draw()
- {
- if (m_Coincident)
- {
- fl_color(FL_BLACK);
- fl_rect(x(),y(),w()+1,h()+1);
- fl_line(x(),y(),x()+w(),y()+h());
- fl_line(x(),y()+h(),x()+w(),y());
- }
- else
- {
- fl_color(FL_RED);
- fl_arc( x(),y(),w()+1,h()+1,0,360);
- }
- }
-
-
-
- Fl_Envelope::Fl_Envelope(int x,int y, int w, int h, char *Name) :
- Fl_Group(x,y,w,h,Name),
- m_Length(1.0),
- m_Bezier(true)
- {
- m_Origin_x=x+10;
- m_Origin_y=y+h-10;
-
- // default setting
- Fl_Handle * newhandle = new Fl_Handle(28,20,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(14,122,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(48,63,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(76,91,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(131,86,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(194,81,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(294,131,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- newhandle = new Fl_Handle(216,124 ,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
-
- show();
- }
-
- Fl_Envelope::~Fl_Envelope()
- {
- end();
- }
-
- int Fl_Envelope::handle(int event)
- {
- int ret=Fl_Group::handle(event);
-
- // search for deleted handles
- for(list<Fl_Handle*>::iterator i = m_HandleList.begin();
- i!=m_HandleList.end(); ++i)
- {
- // if it's been modified, update the env via the callback
- if ((*i)->Changed()) do_callback();
-
- if ((*i)->Deleted())
- {
- remove(*i);
- m_HandleList.erase(i);
- break; // one at a time
- }
- }
-
- if (!ret)
- {
- int Mousebutton=Fl::event_button();
- if (event==FL_PUSH && Mousebutton==2)
- {
- Fl_Handle * newhandle = new
- Fl_Handle(Fl::event_x()-5,Fl::event_y()-5,10,10,"");
- m_HandleList.push_back(newhandle);
- add(newhandle);
- }
-
- redraw();
- }
-
- return ret;
- }
-
- void Fl_Envelope::draw()
- {
- fl_push_clip(x(),y(),w()+1,h()+1);
- fl_color(FL_GRAY);
- fl_rectf(x(),y(),w()+1,h()+1);
-
- fl_color(FL_BLACK);
- fl_rect(x(),y(),w()+1,h()+1);
-
- fl_color(FL_WHITE);
-
- int last_x=m_Origin_x, last_y=m_Origin_y, closest=INT_MAX, dist;
- list<Fl_Handle*>::iterator ClosestHandle=m_HandleList.end();
-
- // draw second markers
- fl_color(150,150,150);
-
- for (int n=0; n<5; n++)
- {
- int p=(int)(m_Origin_x+(w()/m_Length*n));
- fl_line(p,y(),p,y()+h());
- }
-
- m_HandlePos.clear();
-
- m_HandlePos.push_back(Vec2(m_Origin_x,m_Origin_y));
- if (m_Bezier) AddToSpline(Vec2(m_Origin_x,m_Origin_y));
-
- for (unsigned int n=0; n<m_HandleList.size(); n++)
- {
- // slow - search through drawing line connecting handles from left to right
- for(list<Fl_Handle*>::iterator i = m_HandleList.begin();
- i!=m_HandleList.end(); ++i)
- {
- dist=(*i)->x()-last_x;
- if (dist>-5 && dist<closest)
- {
- closest=dist;
- ClosestHandle=i;
- }
- }
-
- if (ClosestHandle!=m_HandleList.end())
- {
- closest=INT_MAX;
- fl_color(FL_WHITE);
- fl_line(last_x,last_y,(*ClosestHandle)->x()+5,(*ClosestHandle)->y()+5);
-
- (*ClosestHandle)->SetIsCoincident(false);
-
- last_x=(*ClosestHandle)->x()+5;
- last_y=(*ClosestHandle)->y()+5;
-
- m_HandlePos.push_back(Vec2((*ClosestHandle)->x()+5,(*ClosestHandle)->y()+5));
-
- if (m_Bezier)
- {
- if (!(n%3)) (*ClosestHandle)->SetIsCoincident(true);
- AddToSpline(Vec2((*ClosestHandle)->x()+5,(*ClosestHandle)->y()+5));
- }
- }
- }
-
- if (m_Bezier)
- {
- vector<Vec2> BezierLineList;
- CalculateBezierSpline(&BezierLineList,10);
-
- vector<Vec2>::iterator bi=BezierLineList.begin();
- bi++;
- fl_color(FL_BLUE);
- for (;bi!=BezierLineList.end(); bi++)
- {
- fl_line((int)(bi-1)->x,(int)(bi-1)->y,(int)bi->x,(int)bi->y);
- }
- }
-
- fl_color(FL_BLACK);
- fl_line(m_Origin_x,m_Origin_y,m_Origin_x,y()+10);
- fl_line(m_Origin_x,m_Origin_y,x()+w()-10,m_Origin_y);
-
- Fl_Group::draw();
- fl_pop_clip();
- }
-
- void Fl_Envelope::Clear()
- {
- for(list<Fl_Handle*>::iterator i = m_HandleList.begin();
- i!=m_HandleList.end(); ++i)
- {
- remove(*i);
- }
-
- m_HandleList.clear();
- }
-
- vector<Vec2> Fl_Envelope::GetCVList()
- {
- vector<Vec2> m_CV;
- for(vector<Vec2>::iterator i = m_HandlePos.begin();
- i!=m_HandlePos.end(); ++i)
- {
- // convert to 0->1
- Vec2 vec((i->x-m_Origin_x)/(float)(w()-m_Origin_x),
- (m_Origin_y-i->y)/(float)(m_Origin_y-y()));
-
- m_CV.push_back(vec);
- }
-
- return m_CV;
- }
-
- void Fl_Envelope::SetCVList(const vector<Vec2> &CV)
- {
- Clear();
-
- for(vector<Vec2>::const_iterator i = CV.begin();
- i!=CV.end(); ++i)
- {
- int minx=m_Origin_x, width=w()-m_Origin_x;
- int miny=m_Origin_y, height=m_Origin_y-y();
-
- // convert from 0->1 screen coords
- Vec2 vec(minx+(i->x*width),
- miny-(i->y*height));
-
- Fl_Handle *nh = new Fl_Handle((int)vec.x,(int)vec.y,10,10,"");
- add(nh);
- m_HandleList.push_back(nh);
- }
-
- redraw();
- }
-
- /////////////////////////////////////////////////////////////////////////
-
- ComplexEnvelopePluginGUI::ComplexEnvelopePluginGUI(int w, int h,ComplexEnvelopePlugin *o,const HostInfo *Info) :
- SpiralPluginGUI(w,h,o)
- {
- m_Plugin=o;
-
- m_Type = new Fl_Button(15,h-35,100,20,"Bezier Curve");
- m_Type->type(1);
- m_Type->value(1);
- m_Type->labelsize(10);
- m_Type->callback((Fl_Callback*)cb_Type);
-
- m_Length = new Fl_Knob(w-60,h-55,40,40,"Length");
- m_Length->color(GUI_COLOUR);
- m_Length->labelsize(10);
- m_Length->maximum(5);
- m_Length->step(0.001);
- m_Length->value(1);
- m_Length->callback((Fl_Callback*)cb_Length);
-
- m_TLength = new Fl_Output(w-130,h-45,60,20,"");
- m_TLength->value("1.0");
-
- m_Envelope = new Fl_Envelope(5,20,w-10,h-75,"");
- m_Envelope->callback((Fl_Callback*)cb_UpdateEnv);
-
- end();
- }
-
- void ComplexEnvelopePluginGUI::UpdateValues()
- {
-
- }
-
- inline void ComplexEnvelopePluginGUI::cb_UpdateEnv_i(Fl_Envelope *o, void* v)
- {
- m_Plugin->CVListToEnvelope(o->GetCVList());
- }
- void ComplexEnvelopePluginGUI::cb_UpdateEnv(Fl_Envelope* o, void* v)
- {((ComplexEnvelopePluginGUI*)(o->parent()))->cb_UpdateEnv_i(o,v);}
-
- inline void ComplexEnvelopePluginGUI::cb_Type_i(Fl_Button *o, void *v)
- {
- m_Envelope->SetBezier(o->value());
- m_Plugin->SetBezier(o->value());
- m_Envelope->redraw();
- }
- void ComplexEnvelopePluginGUI::cb_Type(Fl_Button *o, void *v)
- {((ComplexEnvelopePluginGUI*)(o->parent()))->cb_Type_i(o,v);}
-
- inline void ComplexEnvelopePluginGUI::cb_Length_i(Fl_Knob *o, void *v)
- {
- m_Plugin->SetLength(o->value());
- m_Envelope->SetLength(o->value());
- static char text[16];
- sprintf(text,"%f",o->value());
- m_TLength->value(text);
- m_Envelope->redraw();
- }
- void ComplexEnvelopePluginGUI::cb_Length(Fl_Knob *o, void *v)
- {((ComplexEnvelopePluginGUI*)(o->parent()))->cb_Length_i(o,v);}
|