@@ -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: | ||||