aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorGuenter Geiger <ggeiger@users.sourceforge.net>2003-08-11 15:42:23 +0000
committerGuenter Geiger <ggeiger@users.sourceforge.net>2003-08-11 15:42:23 +0000
commit18f4d4e6f7029eb607dd5e4fdbadc562c2ea6bc4 (patch)
tree289f3283008dac90ff43cb61968bf791049370dc /gui
parent9205cba07d9bbb100a5f78d47ddbdd91f7a60b95 (diff)
added finetunable settings
svn path=/trunk/externals/ggee/; revision=841
Diffstat (limited to 'gui')
-rwxr-xr-xgui/envgen.c107
-rwxr-xr-xgui/envgen.h11
-rwxr-xr-xgui/w_envgen.h106
3 files changed, 139 insertions, 85 deletions
diff --git a/gui/envgen.c b/gui/envgen.c
index 1632cd5..7192cca 100755
--- a/gui/envgen.c
+++ b/gui/envgen.c
@@ -132,6 +132,11 @@ void envgen_list(t_envgen *x,t_symbol* s, int argc,t_atom* argv)
}
}
+void envgen_setresize(t_envgen *x, t_floatarg f)
+{
+ x->resizeable = f;
+}
+
void envgen_float(t_envgen *x, t_floatarg f)
{
@@ -152,8 +157,6 @@ void envgen_float(t_envgen *x, t_floatarg f)
void envgen_bang(t_envgen *x)
{
t_atom a[2];
- x->x_time = 0.0;
-
SETFLOAT(a,x->finalvalues[NONE]);
SETFLOAT(a+1,0);
@@ -188,7 +191,7 @@ static void envgen_tick(t_envgen* x)
if (x->x_state <= x->last_state) {
float del = x->duration[x->x_state] - x->duration[x->x_state-1];
clock_delay(x->x_clock,del);
- SETFLOAT(a,x->finalvalues[x->x_state]);
+ SETFLOAT(a,x->finalvalues[x->x_state]*(x->max-x->min));
SETFLOAT(a+1,del);
outlet_list(x->x_obj.ob_outlet,&s_list,2,(t_atom*)&a);
@@ -204,59 +207,53 @@ static void envgen_freeze(t_envgen* x, t_floatarg f)
static void *envgen_new(t_symbol *s,int argc,t_atom* argv)
{
- t_envgen *x = (t_envgen *)pd_new(envgen_class);
-
- x->args = STATES;
- x->finalvalues = getbytes( x->args*sizeof(t_float));
- x->duration = getbytes( x->args*sizeof(t_float));
+ t_envgen *x = (t_envgen *)pd_new(envgen_class);
+
+ x->args = STATES;
+ x->finalvalues = getbytes( x->args*sizeof(t_float));
+ x->duration = getbytes( x->args*sizeof(t_float));
#ifdef DEBUG
- post("finalvalues %x",x->finalvalues);
+ post("finalvalues %x",x->finalvalues);
#endif
- /* widget */
-
- x->w.glist = (t_glist*) canvas_getcurrent();
- if (argc) {
- x->w.width = atom_getfloat(argv++);
- argc--;
- }
- else
- x->w.width = 140;
-
- if (argc) {
- x->w.height = atom_getfloat(argv++);
- argc--;
- }
- else
- x->w.height = 200;
-
-
-
- x->w.grabbed = 0;
- x->resizing = 0;
- /* end widget */
-
- if (argc)
- envgen_init(x,argc,argv);
- else {
- t_atom a[5];
- SETFLOAT(a,0);
- SETFLOAT(a+1,50);
- SETFLOAT(a+2,1);
- SETFLOAT(a+3,50);
- SETFLOAT(a+4,0);
- envgen_init(x,5,a);
- }
-
- x->x_val = 0.0;
- x->x_state = NONE;
- x->sustain_state = SUSTAIN;
- x->x_freeze = 0;
-
- outlet_new(&x->x_obj, &s_float);
- x->out2 = outlet_new(&x->x_obj, &s_float);
-
- x->x_clock = clock_new(x, (t_method) envgen_tick);
- return (x);
+ /* widget */
+
+ x->w.grabbed = 0;
+ x->resizing = 0;
+ x->resizeable = 0;
+
+ x->w.glist = (t_glist*) canvas_getcurrent();
+
+ x->w.width = 200;
+ if (argc) x->w.width = atom_getfloat(argv++),argc--;
+ x->w.height = 140;
+ if (argc) x->w.height = atom_getfloat(argv++),argc--;
+ x->max = 1.0;
+ if (argc) x->max = atom_getfloat(argv++),argc--;
+ x->min = 0.0;
+ if (argc) x->min = atom_getfloat(argv++),argc--;
+
+ if (argc)
+ envgen_init(x,argc,argv);
+ else {
+ t_atom a[5];
+ SETFLOAT(a,0);
+ SETFLOAT(a+1,50);
+ SETFLOAT(a+2,1);
+ SETFLOAT(a+3,50);
+ SETFLOAT(a+4,0);
+ envgen_init(x,5,a);
+ }
+
+ x->x_val = 0.0;
+ x->x_state = NONE;
+ x->sustain_state = SUSTAIN;
+ x->x_freeze = 0;
+
+ outlet_new(&x->x_obj, &s_float);
+ x->out2 = outlet_new(&x->x_obj, &s_float);
+
+ x->x_clock = clock_new(x, (t_method) envgen_tick);
+ return (x);
}
@@ -288,7 +285,7 @@ void envgen_setup(void)
class_addmethod(envgen_class,(t_method)envgen_totaldur,gensym("duration"),A_FLOAT,NULL);
class_addmethod(envgen_class,(t_method)envgen_freeze,gensym("freeze"),A_FLOAT,NULL);
-
+ class_addmethod(envgen_class,(t_method)envgen_setresize,gensym("resize"),A_FLOAT,A_NULL);
envgen_setwidget();
class_setwidget(envgen_class,&envgen_widgetbehavior);
diff --git a/gui/envgen.h b/gui/envgen.h
index 8db6b43..905c80a 100755
--- a/gui/envgen.h
+++ b/gui/envgen.h
@@ -9,8 +9,10 @@ typedef struct _wenvgen {
int height;
int numdoodles;
int grabbed; /* for moving points */
- int pointerx;
- int pointery;
+ int shift; /* move 100th */
+ float pointerx;
+ float pointery;
+ t_clock* numclock;
} t_wenvgen;
typedef struct _envgen
@@ -19,8 +21,6 @@ typedef struct _envgen
t_float x_val;
- t_float x_slevel;
- t_float x_time;
int x_state;
int last_state;
int sustain_state;
@@ -31,7 +31,10 @@ typedef struct _envgen
t_float totaldur;
t_int args; /* get rid of that */
t_int resizing;
+ t_int resizeable;
+ t_float min;
+ t_float max;
t_clock* x_clock;
t_float x_freeze;
diff --git a/gui/w_envgen.h b/gui/w_envgen.h
index 12fd511..ffd699e 100755
--- a/gui/w_envgen.h
+++ b/gui/w_envgen.h
@@ -84,7 +84,6 @@ static int envgen_next_doodle(t_envgen *x, int xpos,int ypos)
dy2*=dy2;
tval = sqrt(dx2+dy2);
- // post("%i: dist = %f dx=%f dy=%f",i,tval,dx2,dy2);
if (tval <= minval) {
minval = tval;
insertpos = i;
@@ -92,15 +91,12 @@ static int envgen_next_doodle(t_envgen *x, int xpos,int ypos)
}
/* decide if we want to make a new one */
- // post("insertpos %d minval %f",insertpos,minval);
if (minval > /*5*/ 8 && insertpos >= 0 && !x->x_freeze) {
- // post("insertpos %d",insertpos);
while (((dxpos + (x->duration[insertpos] * xscale)) - xpos) < 0)
insertpos++;
while (((dxpos + (x->duration[insertpos-1] * xscale)) - xpos) > 0)
insertpos--;
- // post("minval = %f, insertpos = %d",minval,insertpos);
if (x->last_state+1 >= x->args)
envgen_resize(x,x->args+1);
@@ -112,9 +108,18 @@ static int envgen_next_doodle(t_envgen *x, int xpos,int ypos)
x->duration[insertpos] = (float)(xpos-dxpos)/x->w.width*x->duration[x->last_state++];
- x->w.grabbed = insertpos;
+ x->w.pointerx = xpos;
+ x->w.pointery = ypos;
}
+ else {
+ x->w.pointerx = x->x_obj.te_xpix + x->duration[insertpos]*x->w.width/x->duration[x->last_state];
+
+ x->w.pointery = x->x_obj.te_ypix +
+ (1.f - x->finalvalues[insertpos])*x->w.height;
+ }
+
+ x->w.grabbed = insertpos;
return insertpos;
}
@@ -149,8 +154,9 @@ static void envgen_create_doodles(t_envgen *x, t_glist *glist)
static void envgen_delete_doodles(t_envgen *x, t_glist *glist)
{
int i;
- for (i=0;i<=x->w.numdoodles;i++)
+ for (i=0;i<=x->w.numdoodles;i++) {
sys_vgui(".x%x.c delete %xD%d\n",glist_getcanvas(glist),x,i);
+ }
}
static void envgen_update_doodles(t_envgen *x, t_glist *glist)
@@ -162,6 +168,40 @@ static void envgen_update_doodles(t_envgen *x, t_glist *glist)
}
+static void envgen_delnum(t_envgen *x)
+{
+ sys_vgui(".x%x.c delete %xT\n",glist_getcanvas(x->w.glist),x);
+}
+
+
+static void envgen_shownum(t_envgen *x)
+{
+ float xscale,yscale;
+ int xpos,ypos;
+ int i= x->w.grabbed;
+
+ xscale = x->w.width/x->duration[x->last_state];
+ yscale = x->w.height;
+
+ xpos = x->x_obj.te_xpix;
+ ypos = (int) (x->x_obj.te_ypix + x->w.height);
+
+ envgen_delnum(x);
+ if (!x->w.grabbed) return;
+ sys_vgui(".x%x.c create text %d %d -text %fx%f -tags %xT\n",
+ (unsigned int)glist_getcanvas(x->w.glist),
+
+ (int) (xpos+(x->duration[i] * xscale) - 2),
+ (int) (ypos - x->finalvalues[i]*yscale - 2),
+
+ x->finalvalues[i]*(x->max-x->min),
+ x->duration[i],
+ (unsigned int)x);
+ clock_delay(x->w.numclock,700);
+}
+
+
+
static void envgen_create(t_envgen *x, t_glist *glist)
{
int i;
@@ -169,7 +209,8 @@ static void envgen_create(t_envgen *x, t_glist *glist)
float xscale,yscale;
int xpos,ypos;
char num[40];
-
+
+ x->w.numclock = clock_new(x, (t_method) envgen_delnum);
sys_vgui(".x%x.c create rectangle \
%d %d %d %d -tags %xS "BACKGROUND"\n",
glist_getcanvas(glist),
@@ -191,7 +232,6 @@ static void envgen_create(t_envgen *x, t_glist *glist)
sprintf(num,"-tags %pP\n",x);
strcat(buf,num);
- // post("sending %s",buf);
sys_vgui("%s",buf);
envgen_create_doodles(x,glist);
}
@@ -224,7 +264,6 @@ int i;
strcat(buf,num);
}
strcat(buf,"\n");
- // post("sending %s",buf);
sys_vgui("%s",buf);
envgen_update_doodles(x,glist);
draw_inlets(x, glist, 0,1,2);
@@ -253,11 +292,10 @@ void envgen_erase(t_envgen* x,t_glist* glist)
sys_vgui(".x%x.c delete %pP\n",
glist_getcanvas(glist), x);
- sys_vgui(".x%x.c delete %xi0\n",glist_getcanvas(glist),x,n);
- sys_vgui(".x%x.c delete %xo0\n",glist_getcanvas(glist),x,n);
- sys_vgui(".x%x.c delete %xo1\n",glist_getcanvas(glist),x,n);
-
-
+
+ sys_vgui(".x%x.c delete %xi0\n",glist_getcanvas(glist),x);
+ sys_vgui(".x%x.c delete %xo0\n",glist_getcanvas(glist),x);
+ sys_vgui(".x%x.c delete %xo1\n",glist_getcanvas(glist),x);
envgen_delete_doodles(x,glist);
}
@@ -328,9 +366,9 @@ static void envgen_vis(t_gobj *z, t_glist *glist, int vis)
static void envgen_save(t_gobj *z, t_binbuf *b)
{
t_envgen *x = (t_envgen *)z;
- binbuf_addv(b, "ssiisii", gensym("#X"),gensym("obj"),
+ binbuf_addv(b, "ssiisiiff", gensym("#X"),gensym("obj"),
(t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix,
- gensym("envgen"),x->w.width,x->w.height);
+ gensym("envgen"),x->w.width,x->w.height,x->max,x->min);
binbuf_addv(b, ";");
}
@@ -341,7 +379,8 @@ static void envgen_followpointer(t_envgen* x)
float dur;
float xscale = x->duration[x->last_state]/x->w.width;
-
+
+
if ((x->w.grabbed > 0) && (x->w.grabbed < x->last_state)) {
dur = (x->w.pointerx - x->x_obj.te_xpix)*xscale;
@@ -354,7 +393,7 @@ static void envgen_followpointer(t_envgen* x)
}
- x->finalvalues[x->w.grabbed] = 1.0f - (float)(x->w.pointery - x->x_obj.te_ypix)/(float)x->w.height;
+ x->finalvalues[x->w.grabbed] = 1.0f - (x->w.pointery - (float)x->x_obj.te_ypix)/(float)x->w.height;
if (x->finalvalues[x->w.grabbed] < 0.0)
x->finalvalues[x->w.grabbed]= 0.0;
else if (x->finalvalues[x->w.grabbed] > 1.0)
@@ -365,15 +404,30 @@ static void envgen_followpointer(t_envgen* x)
void envgen_motion(t_envgen *x, t_floatarg dx, t_floatarg dy)
{
- x->w.pointerx+=dx;
- x->w.pointery+=dy;
+ if (x->w.shift) {
+ x->w.pointerx+=dx/1000.f;
+ x->w.pointery+=dy/1000.f;
+ }
+ else
+ {
+ x->w.pointerx+=dx;
+ x->w.pointery+=dy;
+ }
if (!x->resizing)
envgen_followpointer(x);
else {
- x->w.width+=dx;
- x->w.height+=dy;
+ if (x->w.shift) {
+ x->w.width+=dx;
+ x->w.height+=dy;
+ }
+ else
+ {
+ x->w.pointerx+=dx;
+ x->w.pointery+=dy;
+ }
}
+ envgen_shownum(x);
envgen_update(x,x->w.glist);
}
@@ -403,7 +457,7 @@ void envgen_click(t_envgen *x,
float wxpos = x->x_obj.te_xpix;
float wypos = (int) (x->x_obj.te_ypix + x->w.height);
- x->w.grabbed = envgen_next_doodle(x,xpos,ypos);
+ envgen_next_doodle(x,xpos,ypos);
#if (PD_VERSION_MINOR > 31)
glist_grab(x->w.glist, &x->x_obj.te_g, (t_glistmotionfn) envgen_motion,
(t_glistkeyfn) envgen_key, xpos, ypos);
@@ -411,15 +465,15 @@ void envgen_click(t_envgen *x,
glist_grab(x->w.glist, &x->x_obj.te_g, xpos, ypos);
#endif
x->resizing = 0;
- if ((xpos > wxpos + x->w.width - 3) &&
+ if (x->resizeable && (xpos > wxpos + x->w.width - 3) &&
(fabs(ypos -2 - wypos) < 3.)) {
x->resizing = 1;
return;
}
- x->w.pointerx = xpos;
- x->w.pointery = ypos;
+ x->w.shift = shift;
envgen_followpointer(x);
+ envgen_shownum(x);
envgen_update(x,x->w.glist);
}