| @@ -28,14 +28,14 @@ static const int BUTTON_COLOUR = 10; | |||||
| static const int EVENT_COLOUR = 0; | static const int EVENT_COLOUR = 0; | ||||
| static const int BG_COLOUR = 139; | |||||
| static const int LINE_COLOUR = 140; | |||||
| int BG_COLOUR;// = 139; | |||||
| int BLACK_KEY_COL;// = 141; | |||||
| int LINE_COLOUR;// = 140; | |||||
| //////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////// | ||||
| Fl_EventMap::Fl_EventMap(int x, int y, int w, int h, const char* label) : | Fl_EventMap::Fl_EventMap(int x, int y, int w, int h, const char* label) : | ||||
| Fl_Group(x,y,w,h,label), | Fl_Group(x,y,w,h,label), | ||||
| m_SeqPointer(NULL), | |||||
| m_Type(ARRANGE_MAP), | m_Type(ARRANGE_MAP), | ||||
| m_Update(true), | m_Update(true), | ||||
| m_Zoom(1.0f), | m_Zoom(1.0f), | ||||
| @@ -47,107 +47,145 @@ m_StartLoop(1.0f), | |||||
| m_EndLoop(2.0f), | m_EndLoop(2.0f), | ||||
| m_Pos(0), | m_Pos(0), | ||||
| m_LastPos(0), | m_LastPos(0), | ||||
| m_DrawBeats(false), | |||||
| m_BarLength(100), | |||||
| m_BeatsBar(8), | |||||
| cb_NewEvent(NULL), | |||||
| cb_RightMouse(NULL), | |||||
| cb_CopyEvent(NULL), | |||||
| m_DrawBeats(true), | |||||
| m_BarLength(1), | |||||
| m_BeatsBar(4), | |||||
| m_FirstUpdate(true) | m_FirstUpdate(true) | ||||
| { | { | ||||
| box(FL_FLAT_BOX); | |||||
| fl_color(0,100,161); | |||||
| BG_COLOUR=fl_color(); | |||||
| fl_color(0,90,150); | |||||
| BLACK_KEY_COL=fl_color(); | |||||
| fl_color(0,80,150); | |||||
| LINE_COLOUR=fl_color(); | |||||
| fl_color(200,200,200); | |||||
| int w=fl_color(); | |||||
| fl_color(50,50,50); | |||||
| int b=fl_color(); | |||||
| // white/black keys for the melody | // white/black keys for the melody | ||||
| m_KeyColMap[0] = FL_YELLOW; | |||||
| m_KeyColMap[1] = FL_BLUE; | |||||
| m_KeyColMap[2] = FL_YELLOW; | |||||
| m_KeyColMap[3] = FL_BLUE; | |||||
| m_KeyColMap[4] = FL_YELLOW; | |||||
| m_KeyColMap[5] = FL_BLUE; | |||||
| m_KeyColMap[6] = FL_YELLOW; | |||||
| m_KeyColMap[7] = FL_YELLOW; | |||||
| m_KeyColMap[8] = FL_BLUE; | |||||
| m_KeyColMap[9] = FL_YELLOW; | |||||
| m_KeyColMap[10] = FL_BLUE; | |||||
| m_KeyColMap[11] = FL_YELLOW; | |||||
| m_KeyColMap[0] = w; | |||||
| m_KeyColMap[1] = b; | |||||
| m_KeyColMap[2] = w; | |||||
| m_KeyColMap[3] = b; | |||||
| m_KeyColMap[4] = w; | |||||
| m_KeyColMap[5] = w; | |||||
| m_KeyColMap[6] = b; | |||||
| m_KeyColMap[7] = w; | |||||
| m_KeyColMap[8] = b; | |||||
| m_KeyColMap[9] = w; | |||||
| m_KeyColMap[10] = b; | |||||
| m_KeyColMap[11] = w; | |||||
| } | } | ||||
| void Fl_EventMap::SetCallbacks(const EventCallbacks &s) | |||||
| { | |||||
| m_Callbacks.cb_NewEvent=s.cb_NewEvent; | |||||
| m_Callbacks.cb_EventDoubleClicked=s.cb_EventDoubleClicked; | |||||
| m_Callbacks.cb_CopyEvent=s.cb_CopyEvent; | |||||
| m_Callbacks.cb_CloneEvent=s.cb_CloneEvent; | |||||
| m_Callbacks.cb_InstanceEvent=s.cb_InstanceEvent; | |||||
| m_Callbacks.cb_MoveEvent=s.cb_MoveEvent; | |||||
| m_Callbacks.cb_EditEvent=s.cb_EditEvent; | |||||
| m_Callbacks.cb_DelEvent=s.cb_DelEvent; | |||||
| m_Callbacks.cb_RenameEvent=s.cb_RenameEvent; | |||||
| m_Callbacks.cb_Recolour=s.cb_Recolour; | |||||
| } | |||||
| void Fl_EventMap::CreateWindow() | void Fl_EventMap::CreateWindow() | ||||
| { | { | ||||
| int yoff=0; | |||||
| //m_StartTri = new Fl_TriEvent(90, 5, 20, 10, ""); | |||||
| //m_StartTri->LockY(); | |||||
| //m_StartTri->SetResizeGrab(0); | |||||
| //m_StartTri->SetPixelsPerSec(m_PixelsPerSec,true); | |||||
| m_PosTri = new Fl_TriEvent(90, 5, 30, 20, ""); | |||||
| m_PosTri->LockY(); | |||||
| m_PosTri->SetResizeGrab(0); | |||||
| m_PosTri->SetPixelsPerSec(m_PixelsPerSec,true); | |||||
| m_EndTri = new Fl_TriEvent(50, 5, 20, 10, ""); | |||||
| m_EndTri->LockY(); | |||||
| m_EndTri->SetResizeGrab(0); | |||||
| m_EndTri->SetPixelsPerSec(m_PixelsPerSec,true); | |||||
| show(); | show(); | ||||
| } | } | ||||
| void Fl_EventMap::draw() | void Fl_EventMap::draw() | ||||
| { | { | ||||
| clear_damage(FL_DAMAGE_ALL); | |||||
| Fl_Widget*const* a = array(); | |||||
| if (!(damage() & ~FL_DAMAGE_CHILD)) | |||||
| { | |||||
| for (int i=children(); i--;) update_child(**a++); | |||||
| return; | |||||
| } | |||||
| draw_box(); | |||||
| m_FirstUpdate=true; | |||||
| fl_color(BG_COLOUR); | fl_color(BG_COLOUR); | ||||
| fl_rectf(x(),y(),w(),h()); | fl_rectf(x(),y(),w(),h()); | ||||
| // draw the section markers | // draw the section markers | ||||
| fl_color(LINE_COLOUR); | |||||
| if (m_GridSizeY) | if (m_GridSizeY) | ||||
| { | { | ||||
| int c=0; | |||||
| // draw the snap points | // draw the snap points | ||||
| for (int n=y(); n<y()+h(); n+=m_GridSizeY) | for (int n=y(); n<y()+h(); n+=m_GridSizeY) | ||||
| { | { | ||||
| fl_color(LINE_COLOUR); | |||||
| fl_line(x(),n,x()+w(),n); | fl_line(x(),n,x()+w(),n); | ||||
| // do black key bg | |||||
| if (m_Type==MELODY_MAP) | |||||
| { | |||||
| int cm = c%12; | |||||
| if (cm==1 || cm==3 || cm==6 || cm==8 || cm==10) | |||||
| { | |||||
| fl_color(BLACK_KEY_COL); | |||||
| fl_rectf(x(),n,w(),m_GridSizeY); | |||||
| } | |||||
| } | |||||
| c++; | |||||
| } | } | ||||
| } | } | ||||
| // draw the bar markers | // draw the bar markers | ||||
| if (m_DrawBeats) | if (m_DrawBeats) | ||||
| { | { | ||||
| int BarLengthPixels=(int)(m_BarLength*(float)m_PixelsPerSec); | |||||
| int BeatLengthPixels=(int)(BarLengthPixels/(float)m_BeatsBar); | |||||
| float BarLength=m_BarLength*(float)m_PixelsPerSec; | |||||
| float BeatLength=BarLength/(float)m_BeatsBar; | |||||
| for (int n=x(); n<x()+w(); n+=BarLengthPixels) | |||||
| float n=x(); | |||||
| while (n<x()+w()) | |||||
| { | { | ||||
| fl_line(n,y(),n,y()+h()); | |||||
| fl_color(LINE_COLOUR); | |||||
| fl_line((int)n,y(),(int)n,y()+h()); | |||||
| if (m_Type==MELODY_MAP) | |||||
| { | |||||
| fl_line((int)n-1,y(),(int)n-1,y()+h()); | |||||
| } | |||||
| if (m_Type!=ARRANGE_MAP) | if (m_Type!=ARRANGE_MAP) | ||||
| { | { | ||||
| // draw the beat markers | // draw the beat markers | ||||
| for (int m=n+1; m<n+BarLengthPixels; m+=BeatLengthPixels) | |||||
| float m=n; | |||||
| while(m<n+BarLength) | |||||
| { | { | ||||
| fl_line(m,y(),m,y()+h()); | |||||
| fl_color(LINE_COLOUR); | |||||
| fl_line((int)m,y(),(int)m,y()+h()); | |||||
| m+=BeatLength; | |||||
| } | } | ||||
| } | } | ||||
| n+=BarLength; | |||||
| } | } | ||||
| } | } | ||||
| if (m_Type==ARRANGE_MAP) | if (m_Type==ARRANGE_MAP) | ||||
| { | { | ||||
| fl_color(FL_BLACK); | fl_color(FL_BLACK); | ||||
| //m_StartLoop=m_StartTri->GetStartTime(); | |||||
| //m_EndLoop=m_EndTri->GetStartTime(); | |||||
| int StartPixels=(int)(m_StartLoop*(float)m_PixelsPerSec)+x(); | int StartPixels=(int)(m_StartLoop*(float)m_PixelsPerSec)+x(); | ||||
| int EndPixels=(int)(m_EndLoop*(float)m_PixelsPerSec)+x(); | int EndPixels=(int)(m_EndLoop*(float)m_PixelsPerSec)+x(); | ||||
| fl_line(StartPixels,y()+15,StartPixels,y()+h()); | |||||
| //fl_line(StartPixels,y()+15,StartPixels,y()+h()); | |||||
| fl_line(EndPixels,y()+15,EndPixels,y()+h()); | fl_line(EndPixels,y()+15,EndPixels,y()+h()); | ||||
| } | } | ||||
| Fl_Group::draw(); | |||||
| for (int i=children(); i--;) { | |||||
| Fl_Widget& o = **a++; | |||||
| draw_child(o); | |||||
| draw_outside_label(o); | |||||
| } | |||||
| SetFirstUpdate(); | SetFirstUpdate(); | ||||
| } | } | ||||
| @@ -166,7 +204,7 @@ int Fl_EventMap::handle(int event) | |||||
| i!=m_EventMap.end(); i++) | i!=m_EventMap.end(); i++) | ||||
| { | { | ||||
| Fl_SEvent *pEvent = i->second; | Fl_SEvent *pEvent = i->second; | ||||
| if (pEvent->Killed()) | if (pEvent->Killed()) | ||||
| { | { | ||||
| RemoveEvent(i->first); | RemoveEvent(i->first); | ||||
| @@ -187,10 +225,7 @@ void Fl_EventMap::SetZoomLevel(float s) | |||||
| { | { | ||||
| i->second->SetPixelsPerSec(m_PixelsPerSec); | i->second->SetPixelsPerSec(m_PixelsPerSec); | ||||
| } | } | ||||
| //m_StartTri->SetPixelsPerSec(m_PixelsPerSec); | |||||
| m_EndTri->SetPixelsPerSec(m_PixelsPerSec); | |||||
| redraw(); | redraw(); | ||||
| } | } | ||||
| @@ -207,32 +242,42 @@ void Fl_EventMap::SetSnapGap(float s) | |||||
| redraw(); | redraw(); | ||||
| } | } | ||||
| vector<EventInfo> Fl_EventMap::GetEvents(float Time) | |||||
| { | |||||
| void Fl_EventMap::SetTime(float Time) | |||||
| { | |||||
| assert(m_PixelsPerSec!=0); | assert(m_PixelsPerSec!=0); | ||||
| Time -= m_TimeOffset; | |||||
| m_Pos = (int)(Time*m_PixelsPerSec); | m_Pos = (int)(Time*m_PixelsPerSec); | ||||
| // line marker update | // line marker update | ||||
| // all in all, some orrible code... | // all in all, some orrible code... | ||||
| if (m_Update && window()->visible() && m_Pos!=m_LastPos) | |||||
| if (m_Update && window()->visible() && visible_r() && m_Pos!=m_LastPos) | |||||
| { | { | ||||
| window()->make_current(); | window()->make_current(); | ||||
| int DrawPos=m_Pos+x(); | int DrawPos=m_Pos+x(); | ||||
| m_PosTri->resize(DrawPos,m_PosTri->y(),m_PosTri->w(),m_PosTri->h()); | |||||
| redraw(); | |||||
| /* if (DrawPos>m_ClipX && DrawPos<m_ClipX+m_ClipW) | |||||
| int Left=parent()->x(); | |||||
| int Top=parent()->y(); | |||||
| int Width=parent()->w(); | |||||
| int Depth=parent()->h(); | |||||
| if (DrawPos>Left && DrawPos<Left+Width) | |||||
| { | { | ||||
| XSetFunction(fl_display,fl_gc,GXxor); | |||||
| if (!m_FirstUpdate) fl_line(m_LastPos,15+m_ClipY,m_LastPos,m_ClipY+m_ClipH); | |||||
| fl_line(DrawPos,15+m_ClipY,DrawPos,m_ClipY+m_ClipH); | |||||
| XSetFunction(fl_display,fl_gc,GXxor); | |||||
| XSetForeground(fl_display, fl_gc, 0xff00ffff); | |||||
| if (!m_FirstUpdate) fl_line(m_LastPos,Top,m_LastPos,Depth); | |||||
| fl_line(DrawPos,Top,DrawPos,Depth); | |||||
| XSetFunction(fl_display,fl_gc,GXcopy); | XSetFunction(fl_display,fl_gc,GXcopy); | ||||
| m_LastPos=DrawPos; | m_LastPos=DrawPos; | ||||
| }*/ | |||||
| //if (Last!=NULL) Last->make_current(); | |||||
| } | |||||
| } | } | ||||
| m_FirstUpdate=false; | m_FirstUpdate=false; | ||||
| } | |||||
| vector<EventInfo> Fl_EventMap::GetEvents(float Time) | |||||
| { | |||||
| SetTime(Time); | |||||
| vector<EventInfo> EventVec; | vector<EventInfo> EventVec; | ||||
| for (map<int,Fl_SEvent*>::iterator i=m_EventMap.begin(); | for (map<int,Fl_SEvent*>::iterator i=m_EventMap.begin(); | ||||
| @@ -290,6 +335,7 @@ int Fl_EventMap::AddEvent(int x, int y, int w, Fl_SEvent::Type EType, bool CallB | |||||
| NewEvent->color(EVENT_COLOUR); | NewEvent->color(EVENT_COLOUR); | ||||
| NewEvent->labelsize(10); | NewEvent->labelsize(10); | ||||
| NewEvent->SetID(m_NextID++); | NewEvent->SetID(m_NextID++); | ||||
| NewEvent->SetType(EType); | NewEvent->SetType(EType); | ||||
| char Name[256]; | char Name[256]; | ||||
| if (m_Type==ARRANGE_MAP) | if (m_Type==ARRANGE_MAP) | ||||
| @@ -316,6 +362,11 @@ int Fl_EventMap::AddEvent(int x, int y, int w, Fl_SEvent::Type EType, bool CallB | |||||
| } | } | ||||
| add(NewEvent); | add(NewEvent); | ||||
| // can only build the menus after adding to the parent, as the features in the | |||||
| // menu depend on which callbacks have been filled out by the parent. | |||||
| NewEvent->BuildMenu(); | |||||
| NewEvent->SnapX(); | NewEvent->SnapX(); | ||||
| NewEvent->SnapY(); | NewEvent->SnapY(); | ||||
| @@ -323,14 +374,14 @@ int Fl_EventMap::AddEvent(int x, int y, int w, Fl_SEvent::Type EType, bool CallB | |||||
| m_EventMap[NewEvent->GetID()]=NewEvent; | m_EventMap[NewEvent->GetID()]=NewEvent; | ||||
| int ID = NewEvent->GetID(); | |||||
| if (cb_NewEvent && CallBack) cb_NewEvent(NewEvent,&ID); | |||||
| int pID = NewEvent->GetID(); | |||||
| if (m_Callbacks.cb_NewEvent && CallBack) m_Callbacks.cb_NewEvent(NewEvent,&pID); | |||||
| redraw(); | redraw(); | ||||
| return NewEvent->GetID(); | return NewEvent->GetID(); | ||||
| } | } | ||||
| void Fl_EventMap::CopyEvent(int x, int y, int w, int ID, float LengthTime) | |||||
| int Fl_EventMap::CopyEvent(int x, int y, int w, int ID, float LengthTime) | |||||
| { | { | ||||
| // make the new widget | // make the new widget | ||||
| int NewID = AddEvent(x,y,w,m_EventMap[ID]->GetType(),false); | int NewID = AddEvent(x,y,w,m_EventMap[ID]->GetType(),false); | ||||
| @@ -343,8 +394,10 @@ void Fl_EventMap::CopyEvent(int x, int y, int w, int ID, float LengthTime) | |||||
| //GetEvent(NewID)->SetName(Name); | //GetEvent(NewID)->SetName(Name); | ||||
| GetEvent(NewID)->SetName(m_EventMap[ID]->GetName()); | GetEvent(NewID)->SetName(m_EventMap[ID]->GetName()); | ||||
| GetEvent(NewID)->SetColour(m_EventMap[ID]->GetColour()); | |||||
| GetEvent(NewID)->SetChannel(m_EventMap[ID]->GetChannel()); | |||||
| if (cb_CopyEvent) cb_CopyEvent(GetEvent(NewID),&ID); | |||||
| return NewID; | |||||
| } | } | ||||
| void Fl_EventMap::RemoveAllEvents() | void Fl_EventMap::RemoveAllEvents() | ||||
| @@ -376,6 +429,8 @@ void Fl_EventMap::RemoveEvent(int ID) | |||||
| remove(e); | remove(e); | ||||
| m_EventMap.erase(i); | m_EventMap.erase(i); | ||||
| delete(e); | delete(e); | ||||
| cerr<<"removed "<<ID<<endl; | |||||
| } | } | ||||
| Fl_SEvent *Fl_EventMap::GetEvent(int ID) | Fl_SEvent *Fl_EventMap::GetEvent(int ID) | ||||
| @@ -63,6 +63,7 @@ public: | |||||
| vector<EventInfo> GetEvents(float Time); | vector<EventInfo> GetEvents(float Time); | ||||
| void SetTime(float Time); | |||||
| void SetUpdate(bool s) {m_Update=s;} | void SetUpdate(bool s) {m_Update=s;} | ||||
| void SetZoomLevel(float s); | void SetZoomLevel(float s); | ||||
| void SetGridSizeX(int s) { m_GridSizeX=s; } | void SetGridSizeX(int s) { m_GridSizeX=s; } | ||||
| @@ -71,34 +72,55 @@ public: | |||||
| void SetType(ModeType s) { m_Type=s; } | void SetType(ModeType s) { m_Type=s; } | ||||
| ModeType GetType() { return m_Type; } | ModeType GetType() { return m_Type; } | ||||
| // Sort this hideaous mess out!! | |||||
| void SetSeq(void* s) { m_SeqPointer=s; } | |||||
| void *GetSeq() { return m_SeqPointer; } | |||||
| void SetID(int ID) { m_ID=ID; } | |||||
| int GetID() { return m_ID; } | |||||
| float GetStartTime() { return m_StartLoop;} | float GetStartTime() { return m_StartLoop;} | ||||
| float GetEndTime() { return m_EndLoop;} | float GetEndTime() { return m_EndLoop;} | ||||
| void SetEndTime(float s) { m_EndLoop=s;} | void SetEndTime(float s) { m_EndLoop=s;} | ||||
| float GetTimeOffset() { return m_TimeOffset;} | |||||
| void SetTimeOffset(float s) { m_TimeOffset=s;} | |||||
| void SetBeatsBar(int s) { m_BeatsBar=s; redraw();} | void SetBeatsBar(int s) { m_BeatsBar=s; redraw();} | ||||
| void SetBarLength(float s) { m_BarLength=s; redraw(); } | void SetBarLength(float s) { m_BarLength=s; redraw(); } | ||||
| void SetSnapGap(float s); | void SetSnapGap(float s); | ||||
| // void SetKeyColMap(int *s) { m_KeyColMap=s; } | |||||
| int *GetKeyColMap() { return m_KeyColMap; } | int *GetKeyColMap() { return m_KeyColMap; } | ||||
| int GetX() { return x(); } | int GetX() { return x(); } | ||||
| int GetY() { return y(); } | int GetY() { return y(); } | ||||
| void SetUpdateLineClip(int X, int Y, int W, int H) | |||||
| { m_ClipX=X; m_ClipY=Y; m_ClipW=W; m_ClipH=H; } | |||||
| void DrawBeats(bool s) { m_DrawBeats=s; redraw(); } | void DrawBeats(bool s) { m_DrawBeats=s; redraw(); } | ||||
| int AddEventTime(float st, int g, float lt, Fl_SEvent::Type EType, bool CallBack=true); | int AddEventTime(float st, int g, float lt, Fl_SEvent::Type EType, bool CallBack=true); | ||||
| void SetEventLength(int ID, float l); | void SetEventLength(int ID, float l); | ||||
| int AddEvent(int x, int y, int w, Fl_SEvent::Type EType, bool CallBack=true); | int AddEvent(int x, int y, int w, Fl_SEvent::Type EType, bool CallBack=true); | ||||
| void CopyEvent(int x, int y, int w, int ID, float LengthTime); | |||||
| int CopyEvent(int x, int y, int w, int ID, float LengthTime); | |||||
| void RemoveAllEvents(); | void RemoveAllEvents(); | ||||
| void RemoveEvent(int ID); | void RemoveEvent(int ID); | ||||
| Fl_SEvent *GetEvent(int ID); | Fl_SEvent *GetEvent(int ID); | ||||
| void CopyFrom(Fl_EventMap *Other); | void CopyFrom(Fl_EventMap *Other); | ||||
| void SetNewEventCallback(Fl_Callback* s) { cb_NewEvent=s; } | |||||
| void SetCopyEventCallback(Fl_Callback* s) { cb_CopyEvent=s; } | |||||
| void SetRightMouseCallback(Fl_Callback* s) { cb_RightMouse=s; } | |||||
| // called by the event widgets on the owner of this object | |||||
| // if you're going to hack callbacks - do it in style ;) | |||||
| class EventCallbacks | |||||
| { | |||||
| public: | |||||
| EventCallbacks() | |||||
| { | |||||
| cb_NewEvent=cb_EventDoubleClicked=cb_CopyEvent=cb_CloneEvent= | |||||
| cb_InstanceEvent=cb_MoveEvent=cb_EditEvent=cb_DelEvent= | |||||
| cb_RenameEvent=cb_Recolour=NULL; | |||||
| } | |||||
| void (*cb_NewEvent)(Fl_Widget*, void*); | |||||
| void (*cb_EventDoubleClicked)(Fl_Widget*, void*); | |||||
| void (*cb_CopyEvent)(Fl_Widget*, void*); | |||||
| void (*cb_CloneEvent)(Fl_Widget*, void*); | |||||
| void (*cb_InstanceEvent)(Fl_Widget*, void*); | |||||
| void (*cb_MoveEvent)(Fl_Widget*, void*); | |||||
| void (*cb_EditEvent)(Fl_Widget*, void*); | |||||
| void (*cb_DelEvent)(Fl_Widget*, void*); | |||||
| void (*cb_RenameEvent)(Fl_Widget*, void*); | |||||
| void (*cb_Recolour)(Fl_Widget*, void*); | |||||
| }; | |||||
| EventCallbacks m_Callbacks; | |||||
| void SetCallbacks(const EventCallbacks &s); | |||||
| void TriggerStart(); | void TriggerStart(); | ||||
| void TriggerEnd(); | void TriggerEnd(); | ||||
| @@ -110,13 +132,10 @@ protected: | |||||
| int GetGroupFromY(int y); | int GetGroupFromY(int y); | ||||
| private: | private: | ||||
| void *m_SeqPointer; | |||||
| ModeType m_Type; | ModeType m_Type; | ||||
| bool m_Update; | bool m_Update; | ||||
| float m_Zoom; | float m_Zoom; | ||||
| int m_ID; | |||||
| int m_GridSizeX; | int m_GridSizeX; | ||||
| int m_GridSizeY; | int m_GridSizeY; | ||||
| int m_PixelsPerSec; | int m_PixelsPerSec; | ||||
| @@ -124,28 +143,15 @@ private: | |||||
| float m_StartLoop; | float m_StartLoop; | ||||
| float m_EndLoop; | float m_EndLoop; | ||||
| int m_Pos; | int m_Pos; | ||||
| int m_LastPos; | |||||
| int m_LastPos; | |||||
| bool m_DrawBeats; | bool m_DrawBeats; | ||||
| float m_BarLength; | float m_BarLength; | ||||
| int m_BeatsBar; | |||||
| float m_TimeOffset; | |||||
| int m_BeatsBar; | |||||
| int m_ClipX,m_ClipY,m_ClipW,m_ClipH; | |||||
| Fl_TriEvent *m_StartTri; | |||||
| Fl_TriEvent *m_PosTri; | |||||
| Fl_TriEvent *m_EndTri; | |||||
| int m_KeyColMap[12]; | int m_KeyColMap[12]; | ||||
| map<int,Fl_SEvent*> m_EventMap; | map<int,Fl_SEvent*> m_EventMap; | ||||
| void (*cb_NewEvent)(Fl_Widget*, void*); | |||||
| public: | |||||
| // needed to be called by the event widgets | |||||
| void (*cb_RightMouse)(Fl_Widget*, void*); | |||||
| void (*cb_CopyEvent)(Fl_Widget*, void*); | |||||
| private: | |||||
| bool m_FirstUpdate; | bool m_FirstUpdate; | ||||
| @@ -25,6 +25,7 @@ | |||||
| static const int MELODY_WIDGET_COL = 142; | static const int MELODY_WIDGET_COL = 142; | ||||
| static const int PERCUSSION_WIDGET_COL = 140; | static const int PERCUSSION_WIDGET_COL = 140; | ||||
| static const int EVENT_RESIZE_GRAB = 10; | |||||
| Fl_SEvent::Fl_SEvent(int x, int y, int w, int h, const char* label) : | Fl_SEvent::Fl_SEvent(int x, int y, int w, int h, const char* label) : | ||||
| Fl_Group(x,y,w,h,""), | Fl_Group(x,y,w,h,""), | ||||
| @@ -34,6 +35,7 @@ m_FirstUpdate(false), | |||||
| m_LastUpdate(false), | m_LastUpdate(false), | ||||
| m_Name(""), | m_Name(""), | ||||
| m_ID(-1), | m_ID(-1), | ||||
| m_Colour(PERCUSSION_WIDGET_COL), | |||||
| m_GridX(0), | m_GridX(0), | ||||
| m_GridY(0), | m_GridY(0), | ||||
| m_LockX(false), | m_LockX(false), | ||||
| @@ -41,6 +43,7 @@ m_LockY(false), | |||||
| m_LockResize(true), | m_LockResize(true), | ||||
| m_ResizeGrab(8), | m_ResizeGrab(8), | ||||
| m_PixelsPerSec(100), | m_PixelsPerSec(100), | ||||
| m_Channel(0), | |||||
| m_StartTime(0.0f), | m_StartTime(0.0f), | ||||
| m_LengthTime(0.0f), | m_LengthTime(0.0f), | ||||
| m_SnapGap(0.0f), | m_SnapGap(0.0f), | ||||
| @@ -49,17 +52,27 @@ m_DelMe(false) | |||||
| { | { | ||||
| Fl_Group::label(m_Name.c_str()); | Fl_Group::label(m_Name.c_str()); | ||||
| labelsize(8); | labelsize(8); | ||||
| m_Menu = new Fl_Menu_Button(x,y,w,h,""); | |||||
| m_Menu->type(Fl_Menu_Button::POPUP2); | |||||
| } | |||||
| void Fl_SEvent::BuildMenu() | |||||
| { | |||||
| Fl_EventMap::EventCallbacks *cb =&((Fl_EventMap*)parent())->m_Callbacks; | |||||
| m_Menu = new Fl_Menu_Button(x(),y(),w(),h(),""); | |||||
| m_Menu->type(Fl_Menu_Button::POPUP3); | |||||
| m_Menu->textsize(8); | m_Menu->textsize(8); | ||||
| m_Menu->add("copy", 0, NULL); | |||||
| m_Menu->add("instance", 0, NULL); | |||||
| m_Menu->add("edit", 0, NULL); | |||||
| m_Menu->add("delete", 0, NULL); | |||||
| if (cb->cb_CopyEvent) m_Menu->add("copy", 0, cb->cb_CopyEvent,this); | |||||
| if (cb->cb_CloneEvent) m_Menu->add("clone", 0, cb->cb_CloneEvent,this); | |||||
| if (cb->cb_InstanceEvent) m_Menu->add("instance", 0, cb->cb_InstanceEvent,this); | |||||
| if (cb->cb_DelEvent) m_Menu->add("delete", 0, cb->cb_DelEvent,this); | |||||
| if (cb->cb_RenameEvent) m_Menu->add("rename", 0, cb->cb_RenameEvent,this); | |||||
| if (cb->cb_Recolour) m_Menu->add("colour", 0, cb->cb_Recolour,this); | |||||
| if (cb->cb_EditEvent) m_Menu->add("edit", 0, cb->cb_EditEvent,this); | |||||
| add(m_Menu); | add(m_Menu); | ||||
| } | } | ||||
| Fl_SEvent::Fl_SEvent(const Fl_SEvent &Other) : | Fl_SEvent::Fl_SEvent(const Fl_SEvent &Other) : | ||||
| Fl_Group(Other.x(),Other.y(),Other.w(),Other.h(),Other.label()), | Fl_Group(Other.x(),Other.y(),Other.w(),Other.h(),Other.label()), | ||||
| m_Type(Other.m_Type), | m_Type(Other.m_Type), | ||||
| @@ -68,6 +81,7 @@ m_FirstUpdate(Other.m_FirstUpdate), | |||||
| m_LastUpdate(Other.m_LastUpdate), | m_LastUpdate(Other.m_LastUpdate), | ||||
| m_Name(Other.m_Name), | m_Name(Other.m_Name), | ||||
| m_ID(Other.m_ID), | m_ID(Other.m_ID), | ||||
| m_Colour(Other.m_Colour), | |||||
| m_GridX(Other.m_GridX), | m_GridX(Other.m_GridX), | ||||
| m_GridY(Other.m_GridY), | m_GridY(Other.m_GridY), | ||||
| m_LockX(Other.m_LockX), | m_LockX(Other.m_LockX), | ||||
| @@ -75,6 +89,7 @@ m_LockY(Other.m_LockY), | |||||
| m_LockResize(Other.m_LockResize), | m_LockResize(Other.m_LockResize), | ||||
| m_ResizeGrab(Other.m_ResizeGrab), | m_ResizeGrab(Other.m_ResizeGrab), | ||||
| m_PixelsPerSec(Other.m_PixelsPerSec), | m_PixelsPerSec(Other.m_PixelsPerSec), | ||||
| m_Channel(Other.m_Channel), | |||||
| m_StartTime(Other.m_StartTime), | m_StartTime(Other.m_StartTime), | ||||
| m_LengthTime(Other.m_LengthTime), | m_LengthTime(Other.m_LengthTime), | ||||
| m_SnapGap(Other.m_SnapGap), | m_SnapGap(Other.m_SnapGap), | ||||
| @@ -128,8 +143,7 @@ void Fl_SEvent::draw() | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| if (m_Type==MELODY) fl_color(MELODY_WIDGET_COL); | |||||
| else fl_color(PERCUSSION_WIDGET_COL); | |||||
| fl_color(m_Colour); | |||||
| fl_rectf(x()+1,y()+1,w()-1,h()-1); | fl_rectf(x()+1,y()+1,w()-1,h()-1); | ||||
| @@ -153,14 +167,17 @@ int Fl_SEvent::handle(int event) | |||||
| int mx=Fl::event_x(); | int mx=Fl::event_x(); | ||||
| int my=Fl::event_y(); | int my=Fl::event_y(); | ||||
| m_Menu->resize(x(),y(),w(),h()); | |||||
| Fl_EventMap::EventCallbacks *cb =&((Fl_EventMap*)parent())->m_Callbacks; | |||||
| static int offsx,offsy; | static int offsx,offsy; | ||||
| if (Fl::event_button()==1 && event==FL_PUSH && Fl::event_clicks()==1) | if (Fl::event_button()==1 && event==FL_PUSH && Fl::event_clicks()==1) | ||||
| { | { | ||||
| // a bit crap I suppose | |||||
| if (((Fl_EventMap*)parent())->cb_EventDoubleClicked!=NULL) | |||||
| if (cb->cb_EventDoubleClicked!=NULL) | |||||
| { | { | ||||
| ((Fl_EventMap*)parent())->cb_EventDoubleClicked(this,NULL); | |||||
| cb->cb_EventDoubleClicked(this,NULL); | |||||
| } | } | ||||
| } | } | ||||
| @@ -172,36 +189,24 @@ int Fl_SEvent::handle(int event) | |||||
| offsx=mx-x(); | offsx=mx-x(); | ||||
| offsy=my-y(); | offsy=my-y(); | ||||
| if (Fl::event_key(FL_BackSpace)) | |||||
| /*if (Fl::event_key(FL_BackSpace)) | |||||
| { | { | ||||
| Fl_EventMap *p = (Fl_EventMap*)parent(); | Fl_EventMap *p = (Fl_EventMap*)parent(); | ||||
| if (p && p->GetType()!=Fl_EventMap::ARRANGE_MAP) | if (p && p->GetType()!=Fl_EventMap::ARRANGE_MAP) | ||||
| { | { | ||||
| if (cb->cb_DelEvent!=NULL) cb->cb_DelEvent(this,NULL); | |||||
| m_DelMe=true; | m_DelMe=true; | ||||
| } | } | ||||
| } | |||||
| }*/ | |||||
| if (LastButtonPushed==1) | if (LastButtonPushed==1) | ||||
| { | |||||
| // if the last EVENT_RESIZE_GRAB pixels | |||||
| // have been grabbed, resize. | |||||
| m_CurrentDragMode=MOVING; | |||||
| //} | |||||
| } | |||||
| /*if (LastButtonPushed==2) | |||||
| { | |||||
| // copy to end | |||||
| Fl_EventMap *p = (Fl_EventMap*)parent(); | |||||
| if (p) p->CopyEvent(x()+w(),y(),w(),m_ID,m_LengthTime); | |||||
| }*/ | |||||
| if (LastButtonPushed==3) | |||||
| { | |||||
| m_CurrentDragMode=RESIZING; | |||||
| } | |||||
| { | |||||
| // if the last EVENT_RESIZE_GRAB pixels | |||||
| // have been grabbed, resize. | |||||
| if (offsx>w()-EVENT_RESIZE_GRAB) m_CurrentDragMode=RESIZING; | |||||
| else m_CurrentDragMode=MOVING; | |||||
| } | |||||
| // fall through | // fall through | ||||
| case FL_DRAG: | case FL_DRAG: | ||||
| { | { | ||||
| @@ -227,6 +232,7 @@ int Fl_SEvent::handle(int event) | |||||
| my=y(); | my=y(); | ||||
| SnapY(); | SnapY(); | ||||
| if (cb->cb_MoveEvent!=NULL) cb->cb_MoveEvent(this,NULL); | |||||
| parent()->redraw(); | parent()->redraw(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -296,32 +302,6 @@ int Fl_SEvent::GetParentY() | |||||
| //////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////// | ||||
| Fl_TriEvent::Fl_TriEvent(int x, int y, int w, int h, const char* label) : | |||||
| Fl_SEvent(x,y,w,h,label) | |||||
| { | |||||
| } | |||||
| Fl_TriEvent::Fl_TriEvent(const Fl_TriEvent &Other) : | |||||
| Fl_SEvent(Other) | |||||
| { | |||||
| } | |||||
| void Fl_TriEvent::draw() | |||||
| { | |||||
| // hackish way to override the zoon scale of the width | |||||
| w(10); | |||||
| h(1000); | |||||
| fl_color(FL_BLACK); | |||||
| //fl_line(x(),y(),x()+10,y()); | |||||
| //fl_line(x()+10,y(),x(),y()+10); | |||||
| //fl_line(x(),y()+10,x(),y()); | |||||
| fl_line(x(),y(),x(),y()+1000); | |||||
| } | |||||
| //////////////////////////////////////////////////////////////////// | |||||
| Fl_CircEvent::Fl_CircEvent(int x, int y, int w, int h, const char* label) : | Fl_CircEvent::Fl_CircEvent(int x, int y, int w, int h, const char* label) : | ||||
| Fl_SEvent(x,y,12,h,label) | Fl_SEvent(x,y,12,h,label) | ||||
| { | { | ||||
| @@ -48,12 +48,18 @@ public: | |||||
| virtual void draw(); | virtual void draw(); | ||||
| virtual int handle(int event); | virtual int handle(int event); | ||||
| void BuildMenu(); | |||||
| int GetID() { return m_ID; } | int GetID() { return m_ID; } | ||||
| void SetID(int s) { m_ID=s; } | |||||
| void SetChannel(int s) { m_Channel=s; } | |||||
| int GetChannel() { return m_Channel; } | |||||
| int GetColour() { return m_Colour; } | |||||
| void SetColour(int s) { m_Colour=s; } | |||||
| void SnapX() { if (m_GridX) x(x()-((x()-GetParentX())%m_GridX)); redraw(); } | void SnapX() { if (m_GridX) x(x()-((x()-GetParentX())%m_GridX)); redraw(); } | ||||
| void SnapY() { if (m_GridY) y(y()-((y()-GetParentY())%m_GridY)); redraw(); } | void SnapY() { if (m_GridY) y(y()-((y()-GetParentY())%m_GridY)); redraw(); } | ||||
| void SetName(string s) { m_Name=s; } | void SetName(string s) { m_Name=s; } | ||||
| string GetName() { return m_Name; } | string GetName() { return m_Name; } | ||||
| void SetID(int s) { m_ID=s; } | |||||
| void SetGridX(int s) { m_GridX=s; } | void SetGridX(int s) { m_GridX=s; } | ||||
| void SetGridY(int s) { m_GridY=s; } | void SetGridY(int s) { m_GridY=s; } | ||||
| void LockX() { m_LockX=true; } | void LockX() { m_LockX=true; } | ||||
| @@ -77,6 +83,7 @@ public: | |||||
| bool AtStart() { return m_FirstUpdate; } | bool AtStart() { return m_FirstUpdate; } | ||||
| bool AtEnd() { return m_LastUpdate; } | bool AtEnd() { return m_LastUpdate; } | ||||
| bool Killed() { return m_DelMe; } | bool Killed() { return m_DelMe; } | ||||
| void KillMe() { m_DelMe=true; } | |||||
| int GetX() { return x(); } | int GetX() { return x(); } | ||||
| int GetY() { return y(); } | int GetY() { return y(); } | ||||
| @@ -96,6 +103,7 @@ private: | |||||
| string m_Name; | string m_Name; | ||||
| int m_ID; | int m_ID; | ||||
| int m_Colour; | |||||
| int m_GridX; | int m_GridX; | ||||
| int m_GridY; | int m_GridY; | ||||
| bool m_LockX; | bool m_LockX; | ||||
| @@ -103,6 +111,7 @@ private: | |||||
| bool m_LockResize; | bool m_LockResize; | ||||
| int m_ResizeGrab; | int m_ResizeGrab; | ||||
| int m_PixelsPerSec; | int m_PixelsPerSec; | ||||
| int m_Channel; | |||||
| float m_StartTime; | float m_StartTime; | ||||
| float m_LengthTime; | float m_LengthTime; | ||||
| @@ -117,17 +126,6 @@ private: | |||||
| ///////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////// | ||||
| class Fl_TriEvent : public Fl_SEvent | |||||
| { | |||||
| public: | |||||
| Fl_TriEvent(int x, int y, int w, int h, const char* label=0); | |||||
| Fl_TriEvent(const Fl_TriEvent &Other); | |||||
| virtual void draw(); | |||||
| private: | |||||
| }; | |||||
| ///////////////////////////////////////////////////////// | |||||
| class Fl_CircEvent : public Fl_SEvent | class Fl_CircEvent : public Fl_SEvent | ||||
| { | { | ||||
| public: | public: | ||||