commit c6fa0c8c3a532f9056824d56bb772e2048ba938d
parent 466985b2af5507e88ba6318c006fd490734f2fbd
Author: Christopher A. Oliver <caowasteland@gmail.com>
Date: Mon, 5 Oct 2015 19:06:46 -0400
New candidate freemode envelope behavior.
Diffstat:
2 files changed, 108 insertions(+), 163 deletions(-)
diff --git a/src/UI/EnvelopeFreeEdit.cpp b/src/UI/EnvelopeFreeEdit.cpp
@@ -194,84 +194,85 @@ int EnvelopeFreeEdit::handle(int event)
const int x_=Fl::event_x()-x();
const int y_=Fl::event_y()-y();
static Fl_Widget *old_focus;
+ int key;
switch(event) {
case FL_ENTER:
- old_focus=Fl::focus();
- Fl::focus(this);
- break;
+ old_focus=Fl::focus();
+ Fl::focus(this);
+ // Otherwise the underlying window seems to regrab focus,
+ // and I can't see the KEYDOWN action.
+ return 1;
case FL_LEAVE:
- Fl::focus(old_focus);
- break;
+ Fl::focus(old_focus);
+ break;
case FL_KEYDOWN:
case FL_KEYUP:
- {
- int key = Fl::event_key();
+ key = Fl::event_key();
if (key==FL_Control_L || key==FL_Control_R){
- ctrldown = (event==FL_KEYDOWN);
- redraw();
- if (pair!=NULL) pair->redraw();
+ ctrldown = (event==FL_KEYDOWN);
+ redraw();
+ if (pair!=NULL) pair->redraw();
}
- }
- break;
+ break;
case FL_PUSH:
- currentpoint=getnearest(x_,y_);
- cpx=x_;
- cpdt=Penvdt[currentpoint];
- lastpoint=currentpoint;
- redraw();
- if (pair)
- pair->redraw();
- return 1;
+ currentpoint=getnearest(x_,y_);
+ cpx=x_;
+ cpdt=Penvdt[currentpoint];
+ lastpoint=currentpoint;
+ redraw();
+ if (pair)
+ pair->redraw();
+ return 1;
case FL_RELEASE:
- currentpoint=-1;
- redraw();
- if (pair)
- pair->redraw();
- return 1;
+ currentpoint=-1;
+ redraw();
+ if (pair)
+ pair->redraw();
+ return 1;
case FL_MOUSEWHEEL:
- if (lastpoint>=0) {
- if (!ctrldown) {
- int ny = Penvval[lastpoint] - Fl::event_dy();
- ny = ny < 0 ? 0 : ny > 127 ? 127 : ny;
- Penvval[lastpoint] = ny;
- oscWrite(to_s("Penvval")+to_s(lastpoint), "c", ny);
- oscWrite("Penvval","");
- } else if (lastpoint > 0) {
- int newdt = Fl::event_dy() + Penvdt[lastpoint];
- newdt = newdt < 0 ? 0 : newdt > 127 ? 127 : newdt;
- Penvdt[lastpoint] = newdt;
- oscWrite(to_s("Penvdt")+to_s(lastpoint), "c", newdt);
- oscWrite("Penvdt","");
- }
- redraw();
- if (pair!=NULL) pair->redraw();
- return 1;
- }
+ if (lastpoint>=0) {
+ if (!ctrldown) {
+ int ny = Penvval[lastpoint] - Fl::event_dy();
+ ny = ny < 0 ? 0 : ny > 127 ? 127 : ny;
+ Penvval[lastpoint] = ny;
+ oscWrite(to_s("Penvval")+to_s(lastpoint), "c", ny);
+ oscWrite("Penvval","");
+ } else if (lastpoint > 0) {
+ int newdt = Fl::event_dy() + Penvdt[lastpoint];
+ newdt = newdt < 0 ? 0 : newdt > 127 ? 127 : newdt;
+ Penvdt[lastpoint] = newdt;
+ oscWrite(to_s("Penvdt")+to_s(lastpoint), "c", newdt);
+ oscWrite("Penvdt","");
+ }
+ redraw();
+ if (pair!=NULL) pair->redraw();
+ return 1;
+ }
case FL_DRAG:
- if (currentpoint>=0){
- int ny=limit(127-(int) (y_*127.0/h()), 0, 127);
+ if (currentpoint>=0){
+ int ny=limit(127-(int) (y_*127.0/h()), 0, 127);
- Penvval[currentpoint]=ny;
+ Penvval[currentpoint]=ny;
- const int dx=(int)((x_-cpx)*0.1);
- const int newdt=limit(cpdt+dx,0,127);
+ const int dx=(int)((x_-cpx)*0.1);
+ const int newdt=limit(cpdt+dx,0,127);
- if(currentpoint!=0)
- Penvdt[currentpoint]=newdt;
- else
- Penvdt[currentpoint]=0;
+ if(currentpoint!=0)
+ Penvdt[currentpoint]=newdt;
+ else
+ Penvdt[currentpoint]=0;
- oscWrite(to_s("Penvval")+to_s(currentpoint), "c", ny);
- oscWrite(to_s("Penvdt")+to_s(currentpoint), "c", newdt);
- oscWrite("Penvdt","");
- oscWrite("Penvval","");
- redraw();
+ oscWrite(to_s("Penvval")+to_s(currentpoint), "c", ny);
+ oscWrite(to_s("Penvdt")+to_s(currentpoint), "c", newdt);
+ oscWrite("Penvdt","");
+ oscWrite("Penvval","");
+ redraw();
- if(pair)
- pair->redraw();
- return 1;
- }
+ if(pair)
+ pair->redraw();
+ return 1;
+ }
}
// Needed to propagate undo/redo keys.
return 0;
diff --git a/src/UI/EnvelopeUI.fl b/src/UI/EnvelopeUI.fl
@@ -127,18 +127,6 @@ sustaincounter->update();
code0 {(void)o;//if (Pfreemode==0) o->hide();}
class Fl_Osc_Button
}
- Fl_Check_Button freemodebutton {
- label FreeMode
- callback {
- o->oscWrite("Pfreemode", o->value() ? "T" : "F");
- reinit(o->value());
-
-freeedit->lastpoint=-1;
-freeedit->redraw();}
- tooltip {Enable or disable the freemode} xywh {10 155 95 20} labelsize 11
- code0{o->init("Pfreemode");}
- class Fl_Osc_Check
- }
Fl_Check_Button forcedreleasecheck {
label frcR
tooltip {Forced Release} xywh {410 165 40 15} down_box DOWN_BOX labelsize 10
@@ -173,6 +161,18 @@ envfree->redraw();}
code3 {o->init("Penvsustain");}
class Fl_Osc_Counter
}
+ Fl_Check_Button freemodehack {
+ xywh {0 0 0 0} down_box DOWN_BOX
+ callback{refresh();}
+ code0 {o->init("Pfreemode");o->hide();}
+ class Fl_Osc_Check
+ }
+ Fl_Button {} {
+ label {Cancel Freemode}
+ callback {disable_freemode();}
+ xywh {5 155 105 20} box THIN_UP_BOX labelsize 11 labelcolor 1
+ class Fl_Osc_Button
+ }
}
}
Function {make_ADSR_window()} {} {
@@ -237,11 +237,9 @@ envfree->redraw();}
}
Fl_Button {} {
label E
- callback {freemodeeditwindow->show();
- freemodeeditwindow->position(Fl::event_x_root()-20,
- Fl::event_y_root()+20);
- }
+ callback {open_as_freemode();}
tooltip {Envelope window} xywh {185 5 15 15} labelfont 1 labelsize 10
+ class Fl_Osc_Button
}
Fl_Check_Button e1linearenvelope {
label L
@@ -315,11 +313,9 @@ envfree->redraw();}
}
Fl_Button {} {
label E
- callback {freemodeeditwindow->show();
- freemodeeditwindow->position(Fl::event_x_root()-20,
- Fl::event_y_root()+20);
- }
+ callback {open_as_freemode();}
tooltip {Envelope window} xywh {190 5 15 15} labelfont 1 labelsize 10
+ class Fl_Osc_Button
}
}
}
@@ -399,11 +395,9 @@ envfree->redraw();}
}
Fl_Button {} {
label E
- callback {freemodeeditwindow->show();
- freemodeeditwindow->position(Fl::event_x_root()-20,
- Fl::event_y_root()+20);
- }
+ callback {open_as_freemode();}
xywh {255 5 15 15} labelfont 1 labelsize 10
+ class Fl_Osc_Button
}
}
}
@@ -472,11 +466,9 @@ envfree->redraw();}
}
Fl_Button {} {
label E
- callback {freemodeeditwindow->show();
- freemodeeditwindow->position(Fl::event_x_root()-20,
- Fl::event_y_root()+20);
- }
+ callback {open_as_freemode();}
xywh {190 5 15 15} labelfont 1 labelsize 10
+ class Fl_Osc_Button
}
}
}
@@ -493,11 +485,9 @@ envfree->redraw();}
} {
Fl_Button {} {
label E
- callback {freemodeeditwindow->show();
- freemodeeditwindow->position(Fl::event_x_root()-20,
- Fl::event_y_root()+20);
- }
+ callback {open_as_freemode();}
xywh {185 5 15 15} labelfont 1 labelsize 10
+ class Fl_Osc_Button
}
Fl_Box freeeditsmall {
label Envelope
@@ -519,6 +509,18 @@ envfree->redraw();}
}
}
}
+ Function {open_as_freemode()} {open
+ } {
+ code {
+ if (!freemodehack->value() &&
+ fl_choice("Convert envelope to free mode data?","No","Yes",NULL)==0)
+ return;
+ freemodehack->oscWrite("Pfreemode", "T");
+ freeedit->update();
+ freemodeeditwindow->show();
+ freemodeeditwindow->position(Fl::event_x_root()-20, Fl::event_y_root()+20);
+} {}
+}
Function {init(int env_type, Fl_Osc_Interface *osc_, std::string base_, std::string ext_)} {open
} {
code {osc = osc_;
@@ -558,107 +560,52 @@ refresh();} {}
code {Fl_Osc_Group::rebase(new_base);
freemodeeditwindow->rebase(new_base+ext);} {}
}
- Function {reinit(bool Pfreemode)} {open
+ Function {disable_freemode()} {open
} {
- code {
- //if(!Pfreemode){
- // int answer=fl_choice("Disable the free mode of the Envelope?","No","Yes",NULL);
- // freemodebutton->value(Pfreemode);
- // if (answer==0)
- // return;
- //};
- freeedit->update();
+ code {if (fl_choice("Discard free mode data?","No","Yes",NULL)==0)
+ return;
hide();
int winx = Fl::event_x_root()-10;
int winy = Fl::event_y_root()-155;
winx = winx < 1 ? 1 : winx;
winy = winy < 1 ? 1 : winy;
- bool reshow = freemodeeditwindow->visible();
freemodeeditwindow->hide();
envwindow->hide();
Fl_Group *par=envwindow->parent();
par->hide();
-
- refresh();
+ freemodehack->oscWrite("Pfreemode", "F");
+ freeedit->update();
envwindow->show();
par->redraw();
par->show();
show();
- freemodeeditwindow->position(winx,winy);
- if(reshow)
- freemodeeditwindow->show();
-
- if (Pfreemode) {
- freemodebutton->value(1);
- addpoint->show();
- deletepoint->show();
- forcedreleasecheck->show();
- sustaincounter->show();
- envstretchdial->show();
- } else{
- freemodebutton->value(0);
- addpoint->hide();
- deletepoint->hide();
- forcedreleasecheck->hide();
- sustaincounter->hide();
- envstretchdial->hide();
- };
-} {selected
- }
+ freemodeeditwindow->position(winx,winy);} {}
}
Function {refresh()} {open
} {
- code {
- sustaincounter->value(Penvsustain);
+ code {sustaincounter->value(Penvsustain);
sustaincounter->maximum(Penvpoints-2);
envstretchdial->value(Penvstretch);
-linearenvelopecheck->value(Plinearenvelope);
-
-//Conditionally display widgets
- if(freemodebutton->value()) {
- freemodebutton->value(1);
- addpoint->show();
- deletepoint->show();
- forcedreleasecheck->show();
- sustaincounter->show();
- envstretchdial->show();
- } else {
- freemodebutton->value(0);
- addpoint->hide();
- deletepoint->hide();
- forcedreleasecheck->hide();
- sustaincounter->hide();
- envstretchdial->hide();
- }
-
- if(freemodebutton->value() || Envmode>2)
- linearenvelopecheck->hide();
- else
- linearenvelopecheck->show();
+ linearenvelopecheck->value(Plinearenvelope);
+ linearenvelopecheck->show();
forcedreleasecheck->value(Pforcedrelease);
-if (freemodebutton->value()==0){
- addpoint->hide();
- deletepoint->hide();
-} else {
- addpoint->show();
- deletepoint->show();
-}
-
envADSR->hide();
envASR->hide();
envADSRfilter->hide();
envASRbw->hide();
envfree->hide();
-if (freemodebutton->value()==0){
+if (freemodehack->value())
+ envwindow=envfree;
+else
switch(Envmode){
case 1:
case 2:
@@ -676,9 +623,6 @@ if (freemodebutton->value()==0){
default:
break;
};
-}else{
- envwindow=envfree;
-};
assert(envwindow);
envwindow->resize(this->x(),this->y(),this->w(),this->h());