diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index dfcd7c80c9819f1e5246524926ba8fdf92dd6c3b..a6548385d698511325468f7cfddc46b4070cdd45 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -2123,6 +2123,15 @@ function gui_draw_vis(cid, type, attr_array, tag_array) { g.appendChild(item); } +// This is a stop gap to update the old draw commands like [drawpolygon] +// without having to erase and recreate their DOM elements +function gui_draw_configure_old_command(cid, type, attr_array, tag_array) { + var elem = get_item(cid, tag_array[1]); + if (elem !== null) { + configure_item(elem, attr_array); + } +} + function gui_draw_erase_item(cid, tag) { var item = get_item(cid, tag); if (item !== null) { diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c index 8c3eb685eeabf07b86b9529e10a15703a466ea44..12269081d493a87007819fea150532e6bc3ca4ac 100644 --- a/pd/src/g_scalar.c +++ b/pd/src/g_scalar.c @@ -749,8 +749,8 @@ static void scalar_delete(t_gobj *z, t_glist *glist) extern void svg_grouptogui(t_glist *g, t_template *template, t_word *data); -extern void svg_parentwidgettogui(t_gobj *z, t_glist *owner, t_word *data, - t_template *template); +extern void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner, + t_word *data, t_template *template); static void scalar_group_configure(t_scalar *x, t_glist *owner, t_template *template, t_glist *gl, t_glist *parent) @@ -777,7 +777,7 @@ static void scalar_group_configure(t_scalar *x, t_glist *owner, if (!wb) continue; //(*wb->w_parentvisfn)(y, owner, gl, x, x->sc_vec, template, // 0, 0, vis); - svg_parentwidgettogui(y, owner, x->sc_vec, template); + svg_parentwidgettogui(y, x, owner, x->sc_vec, template); } } @@ -839,7 +839,7 @@ void scalar_doconfigure(t_gobj *xgobj, t_glist *owner) } //(*wb->w_parentvisfn)(y, owner, 0, x, x->sc_vec, template, // basex, basey, vis); - svg_parentwidgettogui(y, owner, x->sc_vec, template); + svg_parentwidgettogui(y, x, owner, x->sc_vec, template); } if (glist_isselected(owner, &x->sc_gobj)) { diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 0cc36daa9011839576d8463595410b6b16925d50..267a0b58c75d48164fb40bab442d01fa01a9f6a6 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -3677,34 +3677,6 @@ void svg_grouptogui(t_glist *g, t_template *template, t_word *data) svg_togui(x, template, data); } -void svg_parentwidgettogui(t_gobj *z, t_glist *owner, t_word *data, - t_template *template) -{ - char tagbuf[MAXPDSTRING]; - if (pd_class(&z->g_pd) == draw_class) - { - t_draw *x = (t_draw *)z; - sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, - (long unsigned int)data); - gui_start_vmess("gui_draw_configure_all", "xs", - glist_getcanvas(owner), tagbuf); - svg_togui((t_svg *)x->x_attr, template, data); - gui_end_vmess(); - } - else if (pd_class(&z->g_pd) == drawimage_class) - { - t_drawimage *x = (t_drawimage *)z; - sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, - (long unsigned int)data); - gui_start_vmess("gui_draw_configure_all", "xs", - glist_getcanvas(owner), tagbuf); - svg_togui((t_svg *)x->x_attr, template, data); - gui_end_vmess(); - gui_vmess("gui_drawimage_index", "xxxi", - glist_getcanvas(owner), x, data, - drawimage_getindex(x, template, data)); - } -} static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, @@ -4090,6 +4062,7 @@ void draw_notify(t_canvas *x, t_symbol *s, int argc, t_atom *argv) draw_notifyforscalar(ob, x, sc, event_name, argc, argv); } + /* static int draw_click(t_gobj *z, t_glist *glist, t_word *data, t_template *template, t_scalar *sc, t_array *ap, @@ -4614,8 +4587,11 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, }*/ /* see comment in plot_vis() */ - if (vis && !fielddesc_getfloat(&x->x_vis, template, data, 0)) - return; + /* Note: we can probably get a slight acceleration here-- if vis + is -1 and x->x_vis is 0, we can just send a "visibility:0" attribute + instead of the coords and stuff */ + //if (vis && !fielddesc_getfloat(&x->x_vis, template, data, 0)) + // return; if (vis) { if (n > 1) @@ -4672,13 +4648,21 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, else sprintf(type, "polyline"); } - - gui_start_vmess("gui_draw_vis", "xs", - glist_getcanvas(glist), type); - + if (vis != -1) /* draw for the first time */ + gui_start_vmess("gui_draw_vis", "xs", + glist_getcanvas(glist), type); + else /* just update the attributes for an existing object */ + gui_start_vmess("gui_draw_configure_old_command", "xs", + glist_getcanvas(glist), type); // Attributes array gui_start_array(); + // visibility + gui_s("visibility"); + gui_s((int)fielddesc_getfloat(&x->x_vis, template, data, 0) ? + "normal" : "hidden"); + + // points data if (flags & BEZ) { curve_smooth_to_q(pix, n, (flags & CLOSED)); @@ -4724,6 +4708,8 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, char parent_tagbuf[MAXPDSTRING]; if (in_array) { + /* If we're in an array we want to use the element template + in the tag */ //sys_vgui("-parent .scelem%lx.%lx \\\n", parentglist, data); sprintf(parent_tagbuf, "scelem%lx.%lx", (long unsigned int)parentglist, (long unsigned int)data); gui_s(parent_tagbuf); @@ -4731,6 +4717,8 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, else { //sys_vgui("-parent .dgroup%lx.%lx \\\n", x->x_canvas, sc->sc_vec); + /* Here we can just use x->x_canvas since curves can't appear + inside groups */ sprintf(parent_tagbuf, "dgroup%lx.%lx", (long unsigned int)x->x_canvas, (long unsigned int)data); gui_s(parent_tagbuf); } @@ -7578,6 +7566,45 @@ t_template *template_findbydrawcommand(t_gobj *g) return (0); } +/* set attributes for a scalar's parent draw command. This is handy + because it saves having to erase and redraw the object. */ +void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner, + t_word *data, t_template *template) +{ + char tagbuf[MAXPDSTRING]; + if (pd_class(&z->g_pd) == draw_class) + { + t_draw *x = (t_draw *)z; + sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, + (long unsigned int)data); + gui_start_vmess("gui_draw_configure_all", "xs", + glist_getcanvas(owner), tagbuf); + svg_togui((t_svg *)x->x_attr, template, data); + gui_end_vmess(); + } + else if (pd_class(&z->g_pd) == drawimage_class) + { + t_drawimage *x = (t_drawimage *)z; + sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, + (long unsigned int)data); + gui_start_vmess("gui_draw_configure_all", "xs", + glist_getcanvas(owner), tagbuf); + svg_togui((t_svg *)x->x_attr, template, data); + gui_end_vmess(); + gui_vmess("gui_drawimage_index", "xxxi", + glist_getcanvas(owner), x, data, + drawimage_getindex(x, template, data)); + } + else if (pd_class(&z->g_pd) == curve_class) + { + /* We just call the visfn with a flag of -1 to signal + changing attributes instead of creating a new one. + Not sure what to do with arrays yet-- we'll probably + need a parentglist below instead of a "0" */ + curve_vis(z, owner, 0, sc, data, template, 0, 0, -1); + } +} + /* ---------------------- setup function ---------------------------- */ void g_template_setup(void)