Hi List, More "Put" menu array fun: * settable colors for the trace + "jump on click" action
http://puredata.info/Members/jancsika/array-in-color/view * bar graph with settable outline/fill colors http://puredata.info/Members/jancsika/bargraph-array/view * resizing bar graph http://puredata.info/Members/jancsika/bargraph-sinesum/view * multiple colored arrays in one graph http://puredata.info/Members/jancsika/two-arrays/view plus: * savable colors for "Put" menu arrays * html-style color symbols savable in last two args to [plot] Please test. Data structure "bargraph" arrays probably look a little screwy-- haven't worked on those yet. -Jonathan
diff -rupN pd-0.43-0-old/src/g_array.c pd-0.43-0/src/g_array.c --- pd-0.43-0-old/src/g_array.c 2013-05-01 01:48:51.225292121 -0400 +++ pd-0.43-0/src/g_array.c 2013-05-04 22:39:40.503151248 -0400 @@ -132,16 +132,19 @@ struct _garray t_symbol *x_realname; /* expanded name (symbol we're bound to) */ char x_usedindsp; /* true if some DSP routine is using this */ char x_saveit; /* true if we should save this with parent */ + char x_joc; /* true if we should "jump on click" in a graph */ char x_listviewing; /* true if list view window is open */ char x_hidename; /* don't print name above graph */ + t_symbol *x_fillcolor; /* color for filled area of the are */ + t_symbol *x_outlinecolor; /* color of the outline around the element */ }; static t_pd *garray_arraytemplatecanvas; static char garray_arraytemplatefile[] = "\ #N canvas 0 0 458 153 10;\n\ #X obj 43 31 struct _float_array array z float float style\n\ -float linewidth float color;\n\ -#X obj 43 70 plot z color linewidth 0 0 1 style;\n\ +float linewidth float color symbol fillcolor symbol outlinecolor;\n\ +#X obj 43 70 plot z color linewidth 0 0 1 style fillcolor outlinecolor;\n\ "; static char garray_floattemplatefile[] = "\ #N canvas 0 0 458 153 10;\n\ @@ -179,7 +182,7 @@ always called by graph_array() below; bu to save and create arrays this might get called more directly. */ static t_garray *graph_scalar(t_glist *gl, t_symbol *s, t_symbol *templatesym, - int saveit) + t_symbol *fill, t_symbol *outline, int saveit) { int i, zz; t_garray *x; @@ -187,8 +190,8 @@ static t_garray *graph_scalar(t_glist *g t_template *template; char *str; t_gpointer gp; - if (!template_findbyname(templatesym)) - return (0); + if (!(template = template_findbyname(templatesym))) + return (0); x = (t_garray *)pd_new(garray_class); x->x_scalar = scalar_new(gl, templatesym); x->x_name = s; @@ -197,6 +200,10 @@ static t_garray *graph_scalar(t_glist *g x->x_usedindsp = 0; x->x_saveit = saveit; x->x_listviewing = 0; + template_setsymbol(template, gensym("fillcolor"), x->x_scalar->sc_vec, + fill, 1); + template_setsymbol(template, gensym("outlinecolor"), x->x_scalar->sc_vec, + outline, 1); glist_add(gl, &x->x_gobj); x->x_glist = gl; return (x); @@ -252,6 +259,11 @@ int garray_getname(t_garray *x, t_symbol *namep = x->x_name; return (x->x_hidename); } + /* find out if array elements should "jump on click" in a graph */ +int garray_joc(t_garray *x) +{ + return (x->x_joc); +} /* if there is one garray in a graph, reset the graph's coordinates to fit a new size and style for the garray */ @@ -263,8 +275,8 @@ static void garray_fittograph(t_garray * { vmess(&gl->gl_pd, gensym("bounds"), "ffff", 0., gl->gl_y1, (double) - (style == PLOTSTYLE_POINTS || n == 1 ? n : n-1), - gl->gl_y2); + (style == PLOTSTYLE_POINTS || style == PLOTSTYLE_BARS + || n == 1 ? n : n-1), gl->gl_y2); /* close any dialogs that might have the wrong info now... */ gfxstub_deleteforkey(gl); } @@ -276,10 +288,21 @@ an appropriate template; then set size a from the menu and in the file format for patches. LATER replace this by a more coherent (and general) invocation. */ -t_garray *graph_array(t_glist *gl, t_symbol *s, t_symbol *templateargsym, - t_floatarg fsize, t_floatarg fflags) +t_garray *graph_array(t_glist *gl, t_symbol *s, int argc, t_atom *argv) { - int n = fsize, i, zz, nwords, zonset, ztype, saveit; + t_symbol *fill; + t_symbol *outline; + + if (argc < 4) {pd_error(gl, "arraydialog: not enough args"); return 0;} + t_symbol *name = atom_getsymbolarg(0, argc--, argv++); + int fsize = (int)atom_getfloatarg(0, argc--, argv++); + t_symbol *templateargsym = atom_getsymbolarg(0, argc--, argv++); + int fflags = (int)atom_getfloatarg(0, argc--, argv++); + if (argc) fill = atom_getsymbolarg(0, argc--, argv++); + else fill = gensym("black"); + if (argc) outline = atom_getsymbolarg(0, argc--, argv++); + else outline = gensym("black"); + int n = fsize, i, zz, nwords, zonset, ztype, saveit, joc; t_symbol *zarraytype; t_garray *x; t_pd *x2; @@ -321,17 +344,25 @@ t_garray *graph_array(t_glist *gl, t_sym return (0); } saveit = ((flags & 1) != 0); - x = graph_scalar(gl, s, templatesym, saveit); - x->x_hidename = ((flags & 8) >> 3); + x = graph_scalar(gl, name, templatesym, fill, outline, saveit); + x->x_hidename = ((flags & 8) >> 3); + x->x_joc = ((flags & 16) >> 4); + x->x_fillcolor = fill; + x->x_outlinecolor = outline; if (n <= 0) n = 100; + array_resize(x->x_scalar->sc_vec[zonset].w_array, n); template_setfloat(template, gensym("style"), x->x_scalar->sc_vec, style, 1); template_setfloat(template, gensym("linewidth"), x->x_scalar->sc_vec, ((style == PLOTSTYLE_POINTS) ? 2 : 1), 1); + template_setsymbol(template, gensym("fillcolor"), x->x_scalar->sc_vec, + fill, 1); + template_setsymbol(template, gensym("outlinecolor"), x->x_scalar->sc_vec, + outline, 1); if (x2 = pd_findbyclass(gensym("#A"), garray_class)) pd_unbind(x2, gensym("#A")); @@ -345,7 +376,8 @@ void canvas_menuarray(t_glist *canvas) { t_glist *x = (t_glist *)canvas; char cmdbuf[200]; - sprintf(cmdbuf, "pdtk_array_dialog %%s array%d 100 3 1\n", gcount+1); + sprintf(cmdbuf, "pdtk_array_dialog %%s array%d 100 3 1 black black\n", + gcount+1); gfxstub_new(&x->gl_pd, x, cmdbuf); } @@ -363,38 +395,60 @@ void garray_properties(t_garray *x) properly; right now we just detect a leading '$' and escape it. There should be a systematic way of doing this. */ sprintf(cmdbuf, ((x->x_name->s_name[0] == '$') ? - "pdtk_array_dialog %%s \\%s %d %d 0\n" : - "pdtk_array_dialog %%s %s %d %d 0\n"), - x->x_name->s_name, a->a_n, x->x_saveit + + "pdtk_array_dialog %%s \\%s %d %d 0 %s %s\n" : + "pdtk_array_dialog %%s %s %d %d 0 %s %s\n"), x->x_name->s_name, + a->a_n, x->x_saveit + 2 * (int)(template_getfloat(template_findbyname(sc->sc_template), - gensym("style"), x->x_scalar->sc_vec, 1))); + gensym("style"), x->x_scalar->sc_vec, 1)) + 8 * x->x_hidename + + 16 * x->x_joc, x->x_fillcolor->s_name, x->x_outlinecolor->s_name); gfxstub_new(&x->x_gobj.g_pd, x, cmdbuf); } /* this is called back from the dialog window to create a garray. The otherflag requests that we find an existing graph to put it in. */ -void glist_arraydialog(t_glist *parent, t_symbol *name, t_floatarg size, - t_floatarg fflags, t_floatarg otherflag) +void glist_arraydialog(t_glist *parent, t_symbol *s, int argc, t_atom *argv) { + t_atom at[6]; + if (argc !=6) {pd_error(parent, + "arraydialog: wrong number of args"); return;} t_glist *gl; t_garray *a; - int flags = fflags; + t_symbol *name = atom_getsymbolarg(0, argc, argv); + int size = atom_getfloatarg(1, argc, argv); + int flags = atom_getfloatarg(2, argc, argv); + int otherflag = atom_getfloatarg(3, argc, argv); + t_symbol *fillcolor = atom_getsymbolarg(4, argc, argv); + t_symbol *outlinecolor = atom_getsymbolarg(5, argc, argv); +/* fflags; */ if (size < 1) size = 1; if (otherflag == 0 || (!(gl = glist_findgraph(parent)))) gl = glist_addglist(parent, &s_, 0, 1, (size > 1 ? size-1 : size), -1, 0, 0, 0, 0); - a = graph_array(gl, sharptodollar(name), &s_float, size, flags); + SETSYMBOL(at, sharptodollar(name)); + SETFLOAT(at+1, size); + SETSYMBOL(at+2, &s_float); + SETFLOAT(at+3, flags); + SETSYMBOL(at+4, fillcolor); + SETSYMBOL(at+5, outlinecolor); + a = graph_array(gl, gensym("array"), 6, at); canvas_dirty(parent, 1); } /* this is called from the properties dialog window for an existing array */ -void garray_arraydialog(t_garray *x, t_symbol *name, t_floatarg fsize, - t_floatarg fflags, t_floatarg deleteit) +void garray_arraydialog(t_garray *x, t_symbol *s, int argc, t_atom *argv) { - int flags = fflags; + if (argc !=6) {pd_error(x, "arraydialog: wrong number of args"); return;} + t_symbol *name = atom_getsymbolarg(0, argc, argv); + int fsize = atom_getfloatarg(1, argc, argv); + int flags = atom_getfloatarg(2, argc, argv); + int deleteit = atom_getfloatarg(3, argc, argv); + t_symbol *fill = atom_getsymbolarg(4, argc, argv); + t_symbol *outline = atom_getsymbolarg(5, argc, argv); int saveit = ((flags & 1) != 0); int style = ((flags & 6) >> 1); + int hidename = ((flags & 8) >> 3); + int joc = ((flags & 16) >> 4); t_float stylewas = template_getfloat( template_findbyname(x->x_scalar->sc_template), gensym("style"), x->x_scalar->sc_vec, 1); @@ -451,8 +505,16 @@ void garray_arraydialog(t_garray *x, t_s garray_fittograph(x, size, style); template_setfloat(scalartemplate, gensym("style"), x->x_scalar->sc_vec, (t_float)style, 0); + template_setsymbol(scalartemplate, gensym("fillcolor"), + x->x_scalar->sc_vec, fill, 0); + template_setsymbol(scalartemplate, gensym("outlinecolor"), + x->x_scalar->sc_vec, outline, 0); garray_setsaveit(x, (saveit != 0)); + x->x_joc = joc; + x->x_hidename = hidename; + x->x_fillcolor = fill; + x->x_outlinecolor = outline; garray_redraw(x); canvas_dirty(x->x_glist, 1); } @@ -607,6 +669,7 @@ void array_getcoordinate(t_glist *glist, *wp = wpix; } +extern int array_joc; /* from g_canvas.h */ static t_float array_motion_xcumulative; static t_float array_motion_ycumulative; static t_fielddesc *array_motion_xfield; @@ -800,7 +863,7 @@ int array_doclick(t_array *array, t_glis best = dx + dy; } } - if (best > 8) + if (best > 8 && (array_joc == 0)) { if (scalarvis != 0) return (array_doclick_element(array, glist, sc, ap, @@ -832,13 +895,30 @@ int array_doclick(t_array *array, t_glis dy = 100; } else dy2 = dy3 = 100; - if (dx + dy <= best || dx + dy2 <= best || dx + dy3 <= best) + int hit = 0; + if(array_joc) + { + if(i + incr >= array->a_n) + hit = xpix >= pxpix; + else + { + t_float px2pix, py2pix, pw2pix; + array_getcoordinate(glist, + (char *)(array->a_vec) + i + incr * elemsize, + xonset, yonset, wonset, i + incr, xloc, yloc, xinc, + xfield, yfield, wfield, &px2pix, &py2pix, &pw2pix); + hit = (xpix >= pxpix) && (xpix < px2pix); + } + } + else + hit = dx + dy <= best || dx + dy2 <= best || dx + dy3 <= best; + if (hit) { if (dy < dy2 && dy < dy3) array_motion_fatten = 0; else if (dy2 < dy3) array_motion_fatten = -1; - else array_motion_fatten = 1; + else if (!array_joc) array_motion_fatten = 1; if (doit) { char *elem = (char *)array->a_vec; @@ -902,10 +982,12 @@ int array_doclick(t_array *array, t_glis else if (yonset >= 0) { array_motion_yfield = yfield; - array_motion_ycumulative = + array_motion_ycumulative = fielddesc_getcoord(yfield, array_motion_template, (t_word *)(elem + i * elemsize), 1); /* *(t_float *)((elem + elemsize * i) + yonset); */ + if(array_joc) + array_motion(0, 0, ypix - pypix); } else { @@ -1038,9 +1120,10 @@ static void garray_save(t_gobj *z, t_bin x->x_scalar->sc_vec, 0); filestyle = (style == PLOTSTYLE_POINTS ? 1 : (style == PLOTSTYLE_POLY ? 0 : style)); - binbuf_addv(b, "sssisi;", gensym("#X"), gensym("array"), + binbuf_addv(b, "sssisiss;", gensym("#X"), gensym("array"), x->x_name, array->a_n, &s_float, - x->x_saveit + 2 * filestyle + 8*x->x_hidename); + x->x_saveit + 2 * filestyle + 8*x->x_hidename + + 16*x->x_joc, x->x_fillcolor, x->x_outlinecolor); if (x->x_saveit) { int n = array->a_n, n2 = 0; @@ -1202,7 +1285,7 @@ static void garray_dofo(t_garray *x, lon if (npoints == 0) npoints = 512; /* dunno what a good default would be... */ if (npoints != (1 << ilog2(npoints))) - post("%s: rounnding to %d points", array->a_templatesym->s_name, + post("%s: rounding to %d points", array->a_templatesym->s_name, (npoints = (1<<ilog2(npoints)))); garray_resize_long(x, npoints + 3); phaseincr = 2. * 3.14159 / npoints; @@ -1524,7 +1607,7 @@ void g_array_setup(void) class_addmethod(garray_class, (t_method)garray_normalize, gensym("normalize"), A_DEFFLOAT, 0); class_addmethod(garray_class, (t_method)garray_arraydialog, - gensym("arraydialog"), A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, A_NULL); + gensym("arraydialog"), A_GIMME, 0); /* jsarlo { */ class_addmethod(garray_class, (t_method)garray_arrayviewlist_new, gensym("arrayviewlistnew"), A_NULL); diff -rupN pd-0.43-0-old/src/g_canvas.c pd-0.43-0/src/g_canvas.c --- pd-0.43-0-old/src/g_canvas.c 2013-05-01 01:48:51.229292198 -0400 +++ pd-0.43-0/src/g_canvas.c 2013-05-02 16:56:02.411892760 -0400 @@ -968,6 +968,7 @@ static int tabcount = 0; static void *table_new(t_symbol *s, t_floatarg f) { t_atom a[9]; + t_atom ga[4]; t_glist *gl; t_canvas *x, *z = canvas_getcurrent(); if (s == &s_) @@ -992,8 +993,12 @@ static void *table_new(t_symbol *s, t_fl /* create a graph for the table */ gl = glist_addglist((t_glist*)x, &s_, 0, -1, (f > 1 ? f-1 : 1), 1, 50, 350, 550, 50); - - graph_array(gl, s, &s_float, f, 0); + + SETSYMBOL(ga, s); + SETSYMBOL(ga+1, &s_float); + SETFLOAT(ga+2, f); + SETFLOAT(ga+3, 0); + graph_array(gl, gensym("array"), 4, ga); canvas_pop(x, 0); diff -rupN pd-0.43-0-old/src/g_canvas.h pd-0.43-0/src/g_canvas.h --- pd-0.43-0-old/src/g_canvas.h 2013-05-01 01:48:51.229292198 -0400 +++ pd-0.43-0/src/g_canvas.h 2013-05-03 23:55:50.551835685 -0400 @@ -342,6 +342,7 @@ extern int glist_valid; /* incre #define PLOTSTYLE_POINTS 0 /* plotting styles for arrays */ #define PLOTSTYLE_POLY 1 #define PLOTSTYLE_BEZ 2 +#define PLOTSTYLE_BARS 3 /* ------------------- functions on any gobj ----------------------------- */ EXTERN void gobj_getrect(t_gobj *x, t_glist *owner, int *x1, int *y1, @@ -396,8 +397,8 @@ EXTERN void glist_glist(t_glist *g, t_sy EXTERN t_glist *glist_addglist(t_glist *g, t_symbol *sym, t_float x1, t_float y1, t_float x2, t_float y2, t_float px1, t_float py1, t_float px2, t_float py2); -EXTERN void glist_arraydialog(t_glist *parent, t_symbol *name, - t_floatarg size, t_floatarg saveit, t_floatarg newgraph); +EXTERN void glist_arraydialog(t_glist *parent, t_symbol *s, + int argc, t_atom *argv); EXTERN t_binbuf *glist_writetobinbuf(t_glist *x, int wholething); EXTERN int glist_isgraph(t_glist *x); EXTERN void glist_redraw(t_glist *x); @@ -530,11 +531,11 @@ EXTERN void linetraverser_skipobject(t_l EXTERN t_template *garray_template(t_garray *x); /* -------------------- arrays --------------------- */ -EXTERN t_garray *graph_array(t_glist *gl, t_symbol *s, t_symbol *tmpl, - t_floatarg f, t_floatarg saveit); +EXTERN t_garray *graph_array(t_glist *gl, t_symbol *s, int argc, t_atom *argv); EXTERN t_array *array_new(t_symbol *templatesym, t_gpointer *parent); EXTERN void array_resize(t_array *x, int n); EXTERN void array_free(t_array *x); +int array_joc; /* for "jump on click" array inside a graph */ /* --------------------- gpointers and stubs ---------------- */ EXTERN t_gstub *gstub_new(t_glist *gl, t_array *a); diff -rupN pd-0.43-0-old/src/g_editor.c pd-0.43-0/src/g_editor.c --- pd-0.43-0-old/src/g_editor.c 2013-05-01 01:48:51.229292198 -0400 +++ pd-0.43-0/src/g_editor.c 2013-05-02 17:47:06.958763747 -0400 @@ -2715,7 +2715,7 @@ void g_editor_setup(void) class_addmethod(canvas_class, (t_method)canvas_donecanvasdialog, gensym("donecanvasdialog"), A_GIMME, A_NULL); class_addmethod(canvas_class, (t_method)glist_arraydialog, - gensym("arraydialog"), A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, A_NULL); + gensym("arraydialog"), A_GIMME, 0); /* -------------- connect method used in reading files ------------------ */ class_addmethod(canvas_class, (t_method)canvas_connect, diff -rupN pd-0.43-0-old/src/g_graph.c pd-0.43-0/src/g_graph.c --- pd-0.43-0-old/src/g_graph.c 2013-05-01 01:48:51.225292121 -0400 +++ pd-0.43-0/src/g_graph.c 2013-05-02 02:44:40.533781373 -0400 @@ -14,15 +14,18 @@ to this file... */ #include <stdio.h> #include <string.h> +extern int array_joc; +int garray_joc(t_garray *x); + /* ---------------------- forward definitions ----------------- */ static void graph_vis(t_gobj *gr, t_glist *unused_glist, int vis); -static void graph_graphrect(t_gobj *z, t_glist *glist, +void graph_graphrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2); static void graph_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2); -/* -------------------- maintaining the list -------------------- */ +/* -------------------- maintaining tne list -------------------- */ void canvas_drawredrect(t_canvas *x, int doit); @@ -854,7 +857,7 @@ static void graph_vis(t_gobj *gr, t_glis /* get the graph's rectangle, not counting extra swelling for controls to keep them inside the graph. This is the "logical" pixel size. */ -static void graph_graphrect(t_gobj *z, t_glist *glist, +void graph_graphrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1, int *xp2, int *yp2) { t_glist *x = (t_glist *)z; @@ -1046,12 +1049,21 @@ static int graph_click(t_gobj *z, struct { for (y = x->gl_list; y; y = y->g_next) { - int x1, y1, x2, y2; + if(pd_class(&y->g_pd) == garray_class && + !y->g_next && + (array_joc = garray_joc((t_garray *)y)) && + (clickreturned = gobj_click(y, x, xpix, ypix, + shift, alt, 0, doit))) + break; + else + { + int x1, y1, x2, y2; /* check if the object wants to be clicked */ - if (canvas_hitbox(x, y, xpix, ypix, &x1, &y1, &x2, &y2) - && (clickreturned = gobj_click(y, x, xpix, ypix, + if (canvas_hitbox(x, y, xpix, ypix, &x1, &y1, &x2, &y2) + && (clickreturned = gobj_click(y, x, xpix, ypix, shift, alt, 0, doit))) break; + } } if (!doit) { @@ -1102,7 +1114,7 @@ void g_graph_setup(void) class_addmethod(canvas_class, (t_method)graph_ylabel, gensym("ylabel"), A_GIMME, 0); class_addmethod(canvas_class, (t_method)graph_array, gensym("array"), - A_SYMBOL, A_FLOAT, A_SYMBOL, A_DEFFLOAT, A_NULL); + A_GIMME, A_NULL); class_addmethod(canvas_class, (t_method)canvas_menuarray, gensym("menuarray"), A_NULL); class_addmethod(canvas_class, (t_method)glist_sort, diff -rupN pd-0.43-0-old/src/g_template.c pd-0.43-0/src/g_template.c --- pd-0.43-0-old/src/g_template.c 2013-05-01 01:48:51.229292198 -0400 +++ pd-0.43-0/src/g_template.c 2013-05-04 22:40:50.548670259 -0400 @@ -11,7 +11,8 @@ #include "g_canvas.h" void array_redraw(t_array *a, t_glist *glist); - +void graph_graphrect(t_gobj *z, t_glist *glist, + int *xp1, int *yp1, int *xp2, int *yp2); /* This file contains text objects you would put in a canvas to define a template. Templates describe objects of type "array" (g_array.c) and @@ -1352,6 +1353,8 @@ typedef struct _plot t_fielddesc x_wpoints; t_fielddesc x_vis; /* visible */ t_fielddesc x_scalarvis; /* true if drawing the scalar at each point */ + t_fielddesc x_symoutlinecolor; /* color as hex symbol */ + t_fielddesc x_symfillcolor; /* fill color as hex symbol */ } t_plot; static void *plot_new(t_symbol *classsym, t_int argc, t_atom *argv) @@ -1416,6 +1419,9 @@ static void *plot_new(t_symbol *classsym else fielddesc_setfloat_const(&x->x_xinc, 1); if (argc) fielddesc_setfloatarg(&x->x_style, argc--, argv++); else fielddesc_setfloat_const(&x->x_style, defstyle); + if (argc) fielddesc_setsymbolarg(&x->x_symfillcolor, argc--, argv++); + else argc--, argv++; + if (argc) fielddesc_setsymbolarg(&x->x_symoutlinecolor, argc--, argv++); return (x); } @@ -1446,7 +1452,8 @@ static int plot_readownertemplate(t_plot t_symbol **elemtemplatesymp, t_array **arrayp, t_float *linewidthp, t_float *xlocp, t_float *xincp, t_float *ylocp, t_float *stylep, t_float *visp, t_float *scalarvisp, - t_fielddesc **xfield, t_fielddesc **yfield, t_fielddesc **wfield) + t_fielddesc **xfield, t_fielddesc **yfield, t_fielddesc **wfield, t_symbol **fillcolorp, + t_symbol **outlinecolorp) { int arrayonset, type; t_symbol *elemtemplatesym; @@ -1482,6 +1489,10 @@ static int plot_readownertemplate(t_plot *xfield = &x->x_xpoints; *yfield = &x->x_ypoints; *wfield = &x->x_wpoints; + *fillcolorp = fielddesc_getsymbol(&x->x_symfillcolor, ownertemplate, + data, 1); + *outlinecolorp = fielddesc_getsymbol(&x->x_symoutlinecolor, ownertemplate, + data, 1); return (0); } @@ -1553,6 +1564,8 @@ static void plot_getrect(t_gobj *z, t_gl t_template *elemtemplate; t_symbol *elemtemplatesym; t_float linewidth, xloc, xinc, yloc, style, xsum, yval, vis, scalarvis; + t_symbol *symfillcolor; + t_symbol *symoutlinecolor; t_array *array; int x1 = 0x7fffffff, y1 = 0x7fffffff, x2 = -0x7fffffff, y2 = -0x7fffffff; int i; @@ -1560,7 +1573,8 @@ static void plot_getrect(t_gobj *z, t_gl t_fielddesc *xfielddesc, *yfielddesc, *wfielddesc; if (!plot_readownertemplate(x, data, template, &elemtemplatesym, &array, &linewidth, &xloc, &xinc, &yloc, &style, - &vis, &scalarvis, &xfielddesc, &yfielddesc, &wfielddesc) && + &vis, &scalarvis, &xfielddesc, &yfielddesc, &wfielddesc, + &symfillcolor, &symoutlinecolor) && (vis != 0) && !array_getfields(elemtemplatesym, &elemtemplatecanvas, &elemtemplate, &elemsize, @@ -1659,6 +1673,11 @@ static void plot_vis(t_gobj *z, t_glist t_symbol *elemtemplatesym; t_float linewidth, xloc, xinc, yloc, style, usexloc, xsum, yval, vis, scalarvis; + t_symbol *symfill; + t_symbol *symoutline; + char outline[20]; + numbertocolor(fielddesc_getfloat(&x->x_outlinecolor, template, + data, 1), outline); t_array *array; int nelem; char *elem; @@ -1674,7 +1693,8 @@ static void plot_vis(t_gobj *z, t_glist if (plot_readownertemplate(x, data, template, &elemtemplatesym, &array, &linewidth, &xloc, &xinc, &yloc, &style, - &vis, &scalarvis, &xfielddesc, &yfielddesc, &wfielddesc) || + &vis, &scalarvis, &xfielddesc, &yfielddesc, &wfielddesc, &symfill, + &symoutline) || ((vis == 0) && tovis) /* see above for 'tovis' */ || array_getfields(elemtemplatesym, &elemtemplatecanvas, &elemtemplate, &elemsize, xfielddesc, yfielddesc, wfielddesc, @@ -1685,8 +1705,17 @@ static void plot_vis(t_gobj *z, t_glist if (tovis) { - if (style == PLOTSTYLE_POINTS) + /* check if old 3-digit color field is being used... */ + int dscolor = fielddesc_getfloat(&x->x_outlinecolor, template, data, 1); + if (dscolor != 0) { + char outline[20]; + numbertocolor(dscolor, outline); + symoutline = gensym(outline); + } + if (style == PLOTSTYLE_POINTS || style == PLOTSTYLE_BARS) + { + symfill = style == PLOTSTYLE_POINTS ? symoutline : symfill; t_float minyval = 1e20, maxyval = -1e20; int ndrawn = 0; for (xsum = basex + xloc, i = 0; i < nelem; i++) @@ -1721,14 +1750,34 @@ static void plot_vis(t_gobj *z, t_glist minyval = yval; if (i == nelem-1 || inextx != ixpix) { + int py2 = 0; + int border = 0; + if(style == PLOTSTYLE_POINTS) + py2 = (int)(glist_ytopixels(glist, + basey + fielddesc_cvttocoord(yfielddesc, maxyval)) + + linewidth); + else + { + /* this should probably be changed to anchor to the + y-minimum instead of the bottom of the graph. That + way the user can invert the y min/max to get a graph + anchored from the top */ + if(glist->gl_isgraph && !glist->gl_havewindow) + { + int x1, y1, x2, y2; + graph_graphrect(&glist->gl_gobj, glist->gl_owner, + &x1, &y1, &x2, &y2); + py2 = y2; + border = 1; + } + } sys_vgui(".x%lx.c create rectangle %d %d %d %d \ --fill black -width 0 -tags [list plot%lx array]\n", +-fill %s -outline %s -width %d -tags [list plot%lx array]\n", glist_getcanvas(glist), ixpix, (int)glist_ytopixels(glist, - basey + fielddesc_cvttocoord(yfielddesc, minyval)), - inextx, (int)(glist_ytopixels(glist, - basey + fielddesc_cvttocoord(yfielddesc, maxyval)) - + linewidth), data); + basey + fielddesc_cvttocoord(yfielddesc, minyval)), + inextx, py2, symfill->s_name, symoutline->s_name, + border, data); ndrawn++; minyval = 1e20; maxyval = -1e20; @@ -1738,13 +1787,10 @@ static void plot_vis(t_gobj *z, t_glist } else { - char outline[20]; int lastpixel = -1, ndrawn = 0; t_float yval = 0, wval = 0, xpix; int ixpix = 0; /* draw the trace */ - numbertocolor(fielddesc_getfloat(&x->x_outlinecolor, template, - data, 1), outline); if (wonset >= 0) { /* found "w" field which controls linewidth. The trace is @@ -1818,7 +1864,7 @@ static void plot_vis(t_gobj *z, t_glist } ouch: sys_vgui(" -width 1 -fill %s -outline %s\\\n", - outline, outline); + symfill->s_name, symoutline->s_name); if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n"); sys_vgui("-tags [list plot%lx array]\n", data); @@ -1861,12 +1907,15 @@ static void plot_vis(t_gobj *z, t_glist fielddesc_cvttocoord(yfielddesc, yval))); sys_vgui("-width %f\\\n", linewidth); - sys_vgui("-fill %s\\\n", outline); + sys_vgui("-fill %s\\\n", symoutline->s_name); if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n"); sys_vgui("-tags [list plot%lx array]\n", data); } } + /* make sure the array drawings are behind the graph */ + sys_vgui(".x%lx.c lower plot%lx graph%lx\n", glist_getcanvas(glist), + data, glist); /* We're done with the outline; now draw all the points. This code is inefficient since the template has to be searched for drawing instructions for every last point. */ @@ -1931,11 +1980,14 @@ static int plot_click(t_gobj *z, t_glist t_float linewidth, xloc, xinc, yloc, style, vis, scalarvis; t_array *array; t_fielddesc *xfielddesc, *yfielddesc, *wfielddesc; + t_symbol *symfillcolor; + t_symbol *symoutlinecolor; if (!plot_readownertemplate(x, data, template, &elemtemplatesym, &array, &linewidth, &xloc, &xinc, &yloc, &style, &vis, &scalarvis, - &xfielddesc, &yfielddesc, &wfielddesc) && (vis != 0)) + &xfielddesc, &yfielddesc, &wfielddesc, &symfillcolor, &symoutlinecolor) + && (vis != 0)) { return (array_doclick(array, glist, sc, ap, elemtemplatesym, diff -rupN pd-0.43-0-old/tcl/dialog_array.tcl pd-0.43-0/tcl/dialog_array.tcl --- pd-0.43-0-old/tcl/dialog_array.tcl 2013-05-01 01:48:51.205291726 -0400 +++ pd-0.43-0/tcl/dialog_array.tcl 2013-05-04 22:11:20.773728018 -0400 @@ -1,5 +1,7 @@ package provide dialog_array 0.1 +# todo: probably not a bad idea to unset these arrays + namespace eval ::dialog_array:: { namespace export pdtk_array_dialog namespace export pdtk_array_listview_new @@ -15,8 +17,16 @@ array set pd_array_listview_page {} set pd_array_listview_pagesize 0 # this stores the state of the "save me" check button array set saveme_button {} +# this stores the state of the "joc" check button +array set joc_button {} +# whether to hide the array name +array set hidename_button {} # this stores the state of the "draw as" radio buttons array set drawas_button {} +# border color for an element +array set pd_array_outlinecolor {} +# inner color for an element +array set pd_array_fillcolor {} # this stores the state of the "in new graph"/"in last graph" radio buttons # and the "delete array" checkbutton array set otherflag_button {} @@ -217,18 +227,47 @@ proc ::dialog_array::apply {mytoplevel} set mofo [$mytoplevel.name.entry get] if {[string index $mofo 0] == "$"} { set mofo [string replace $mofo 0 0 #] } - pdsend "$mytoplevel arraydialog \ $mofo \ [$mytoplevel.size.entry get] \ - [expr $::saveme_button($mytoplevel) + (2 * $::drawas_button($mytoplevel))] \ - $::otherflag_button($mytoplevel)" + [expr $::saveme_button($mytoplevel) + \ + (2 * $::drawas_button($mytoplevel)) + \ + (8 * $::hidename_button($mytoplevel)) + \ + (16 * $::joc_button($mytoplevel))] \ + $::otherflag_button($mytoplevel) \ + $::pd_array_fillcolor($mytoplevel) \ + $::pd_array_outlinecolor($mytoplevel)" } proc ::dialog_array::openlistview {mytoplevel} { pdsend "$mytoplevel arrayviewlistnew" } +proc ::dialog_array::choosecolor {mytoplevel type} { + set colorp [format "::pd_array_%scolor(%s)" $type $mytoplevel] + if {[info exists $colorp]} { + set initcolor [set $colorp] + } else { + set initcolor "black"} + set tmp [tk_chooseColor -parent $mytoplevel -initialcolor $initcolor] + if {$tmp eq ""} {return} else {set $colorp $tmp} +} + +proc ::dialog_array::update_colorpreview {color widget args} { + upvar #0 $color c + $widget configure -background $c -activebackground $c +} + +proc ::dialog_array::update_drawas {mytoplevel outlineframe filllabel args} { + if {$::drawas_button($mytoplevel) == 3} { + pack $outlineframe -before $mytoplevel.colors.o -side top -anchor w + $filllabel configure -text "Outline color" + } else { + pack forget $outlineframe + $filllabel configure -text "Trace color" + } +} + proc ::dialog_array::cancel {mytoplevel} { pdsend "$mytoplevel cancel" } @@ -238,7 +277,8 @@ proc ::dialog_array::ok {mytoplevel} { ::dialog_array::cancel $mytoplevel } -proc ::dialog_array::pdtk_array_dialog {mytoplevel name size flags newone} { +proc ::dialog_array::pdtk_array_dialog {mytoplevel name \ + size flags newone fillcolor outlinecolor} { if {[winfo exists $mytoplevel]} { wm deiconify $mytoplevel raise $mytoplevel @@ -250,7 +290,12 @@ proc ::dialog_array::pdtk_array_dialog { $mytoplevel.size.entry insert 0 $size set ::saveme_button($mytoplevel) [expr $flags & 1] set ::drawas_button($mytoplevel) [expr ( $flags & 6 ) >> 1] + set ::hidename_button($mytoplevel) [expr ( $flags & 8 ) >> 3] + set ::joc_button($mytoplevel) [expr ( $flags & 16) >> 4] set ::otherflag_button($mytoplevel) 0 + set ::pd_array_fillcolor($mytoplevel) $fillcolor + set ::pd_array_outlinecolor($mytoplevel) $outlinecolor + # pd -> tcl # 2 * (int)(template_getfloat(template_findbyname(sc->sc_template), gensym("style"), x->x_scalar->sc_vec, 1))); @@ -280,9 +325,17 @@ proc ::dialog_array::create_dialog {myto entry $mytoplevel.size.entry pack $mytoplevel.size.label $mytoplevel.size.entry -anchor w - checkbutton $mytoplevel.saveme -text [_ "Save contents"] \ - -variable ::saveme_button($mytoplevel) -anchor w - pack $mytoplevel.saveme -side top + frame $mytoplevel.flags + pack $mytoplevel.flags -side top -fill x -padx 20 + checkbutton $mytoplevel.flags.saveme -text [_ "Save contents"] \ + -variable ::saveme_button($mytoplevel) + pack $mytoplevel.flags.saveme -side top -anchor w + checkbutton $mytoplevel.flags.joc -text [_ "Jump on click"] \ + -variable ::joc_button($mytoplevel) -anchor w + pack $mytoplevel.flags.joc -side top -anchor w + checkbutton $mytoplevel.flags.hidename -text [_ "Hide array name"] \ + -variable ::hidename_button($mytoplevel) -anchor w + pack $mytoplevel.flags.hidename -side top -anchor w labelframe $mytoplevel.drawas -text [_ "Draw as:"] -padx 20 -borderwidth 1 pack $mytoplevel.drawas -side top -fill x @@ -292,9 +345,50 @@ proc ::dialog_array::create_dialog {myto -variable ::drawas_button($mytoplevel) -text [_ "Polygon"] radiobutton $mytoplevel.drawas.bezier -value 2 \ -variable ::drawas_button($mytoplevel) -text [_ "Bezier curve"] + radiobutton $mytoplevel.drawas.bargraph -value 3 \ + -variable ::drawas_button($mytoplevel) -text [_ "Bargraph"] pack $mytoplevel.drawas.points -side top -anchor w pack $mytoplevel.drawas.polygon -side top -anchor w pack $mytoplevel.drawas.bezier -side top -anchor w + pack $mytoplevel.drawas.bargraph -side top -anchor w + trace add variable ::drawas_button($mytoplevel) write \ + "::dialog_array::update_drawas $mytoplevel $mytoplevel.colors.f \ + $mytoplevel.colors.o.outlinecolor" + + set fillp ::pd_array_fillcolor($mytoplevel) + set outlinep ::pd_array_outlinecolor($mytoplevel) + labelframe $mytoplevel.colors -text [_ "Colors:"] -padx 20 -pady 5 \ + -borderwidth 1 + pack $mytoplevel.colors -side top -fill both + frame $mytoplevel.colors.f + frame $mytoplevel.colors.o + pack $mytoplevel.colors.f -side top -anchor w + pack $mytoplevel.colors.o -side top -anchor w + set fillpreview $mytoplevel.colors.f.preview + set flabel [label $mytoplevel.colors.f.fillcolor -text [_ "Fill color"]] + set olabel \ + [label $mytoplevel.colors.o.outlinecolor -text [_ "Outline color"]] + bind $flabel <Enter> "$flabel configure -foreground blue" + bind $flabel <Leave> "$flabel configure -foreground black" + bind $flabel <1> "::dialog_array::choosecolor $mytoplevel fill" + bind $olabel <Enter> "$olabel configure -foreground blue" + bind $olabel <Leave> "$olabel configure -foreground black" + bind $olabel <1> "::dialog_array::choosecolor $mytoplevel outline" + button $fillpreview -relief raised -padx 7 -pady 0 \ + -command "::dialog_array::choosecolor $mytoplevel fill" + set outlinepreview $mytoplevel.colors.o.preview + button $outlinepreview -relief raised -padx 7 -pady 0 \ + -command \ + "::dialog_array::choosecolor $mytoplevel outline" + #automagically update the preview buttons when the variables are changed + trace add variable $fillp write \ + "::dialog_array::update_colorpreview $fillp $fillpreview" + trace add variable $outlinep write \ + "::dialog_array::update_colorpreview $outlinep $outlinepreview" + pack $mytoplevel.colors.f.fillcolor -side right -anchor w + pack $mytoplevel.colors.f.preview -side left -anchor e -padx 3 + pack $mytoplevel.colors.o.outlinecolor -side right -anchor w + pack $mytoplevel.colors.o.preview -side left -anchor e -padx 3 if {$newone != 0} { labelframe $mytoplevel.radio -text [_ "Put array into:"] -padx 20 -borderwidth 1
_______________________________________________ Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list