diff --git a/pd/nw/dialog_canvas.html b/pd/nw/dialog_canvas.html index bda157559a8a3ac11c9fdeddb879fa41dbe228e5..7561cc87ff2f6dde6d8d40e8dbd3598e1e90a200 100644 --- a/pd/nw/dialog_canvas.html +++ b/pd/nw/dialog_canvas.html @@ -241,11 +241,24 @@ data-i18n="[title]canvas.prop.array_in_existing_graph_tt"> <input onchange="flag2_change(this);" type="checkbox" + id="array_in_existing_graph" name="array_in_existing_graph" value="on"> <span data-i18n="canvas.prop.array_in_existing_graph"></span> </label> </div> + + <div class="array_delete"> + <label class="array-delete" + data-i18n="[title]canvas.prop.array_delete_tt"> + <input onchange="array_delete_change(this);" + type="checkbox" + id="array_delete" + name="array_delete" + value="on"> + <span data-i18n="canvas.prop.array_delete"></span> + </label> + </div> </fieldset> <div class="submit_buttons"> @@ -345,6 +358,12 @@ function flag2_change(elem) { pdgui.gui_post("array is " + array_attr); } +function array_delete_change(elem) { + var arrays_select = document.getElementById('arrays_select'), + array_attr = pd_garray_attrs[arrays_select.value]; + array_attr.array_delete = elem.checked; +} + function attr_change(elem) { var array_index, array_attr, arrays_select, name; arrays_select = document.getElementById('arrays_select'); @@ -482,8 +501,28 @@ function get_array_value(name, attrs) { return attrs[name]; } + +// for a new array, slot 4 is: +// "0" to create the array in a new graph +// "1" to create the array in existing graph +// for a graph with more than one array in it, slot 4 is: +// "0" to do nothing +// "1" to delete the array when the dialog is finished +// The deletion interface is bad, but it is also an obscure +// feature probably not worth improving. +function get_array_slot_4(attrs) { + if (new_array_dialog) { + return document.getElementById('array_in_existing_graph').checked ? + "1" : "0"; + } else if (pd_garray_attrs.length > 1) { + return attrs.array_delete ? "1" : "0"; + } else { + return "0"; + } +} + function apply() { - var i, attrs, gop, hide_name; + var i, attrs, gop, hide_name, slot_4; // If this is a dialog to create a new array, we // skip the canvas dialog callback if (!new_array_dialog) { @@ -520,8 +559,7 @@ function apply() { name, get_array_value('array_size', attrs), get_array_value('array_flags', attrs), - 0, // create an array in a new graph -- we don't - // need this in a prexisting graph + get_array_slot_4(attrs), 0, // xdraw-- not sure if this is still used 0, // ydraw-- not sure if this is still used get_array_value('array_fill', attrs), @@ -544,12 +582,12 @@ function cancel() { } function populate_array_form(objects) { - var arrays_select, a_field = document.getElementById('arrays'); - var i, opt; + var arrays_select = document.getElementById('arrays_select'), + a_field = document.getElementById('arrays'), + opt, i; a_field.classList.remove('hidden'); - arrays_select = document.getElementById('arrays_select'); - if (i > 0) { - // unhide select element if there's more than one array + if (objects.length > 1) { + // show the select element if there's more than one array arrays_select.classList.remove('hidden'); } for (i = 0; i < objects.length; i++) { @@ -563,6 +601,11 @@ function populate_array_form(objects) { document.getElementsByClassName('array_in_existing_graph')[0] .classList.add('hidden'); } + // Hide the "delete this array" button if we don't have + // more than one array + if (new_array_dialog || objects.length < 2) { + document.getElementsByClassName('array_delete')[0].classList.add('hidden'); + } array_choose(0); } diff --git a/pd/nw/locales/en/translation.json b/pd/nw/locales/en/translation.json index cf0808211b93af19e213328fffb3e35c0892f537..c82958891da3fe9906c99694295037d193f3b764 100644 --- a/pd/nw/locales/en/translation.json +++ b/pd/nw/locales/en/translation.json @@ -289,7 +289,9 @@ "array_fill": "fill color", "array_fill_tt": "inner color of the bars", "array_in_existing_graph": "put in last graph", - "array_in_existing_graph_tt": "draw the array inside the last graph that was created. This is a way to have multiple arrays drawn in the same graph." + "array_in_existing_graph_tt": "draw the array inside the last graph that was created. This is a way to have multiple arrays drawn in the same graph.", + "array_delete": "delete this array", + "array_delete_tt": "delete this array (i.e., remove it from the graph) when you click Ok" } }, "prefs": { diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index aa747a4e3e2e21e362d7f1cb626be42736df1c57..800fe8be69acebff18d45246693f3831fcdeda51 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -2543,8 +2543,10 @@ function gui_graph_deleteborder(cid, tag) { b.parentNode.removeChild(b); } -function gui_graph_label(cid, tag, y, array_name, font, font_size, - font_weight, is_selected) { +function gui_graph_label(cid, tag, label_number, font_height, array_name, + font, font_size, font_weight, is_selected) { + var y = font_height * label_number * -1; + gui_text_new(cid, tag, "graph_label", 0, 0, y, array_name, font_size); } function gui_graph_vtick(cid, tag, x, up_y, down_y, tick_pix, basex, basey) { diff --git a/pd/src/g_array.c b/pd/src/g_array.c index b6524584c21df61a88366311040c9cc3fcfe4444..682fcd4b5922bcd4f634c78ab983259188f7fc49 100644 --- a/pd/src/g_array.c +++ b/pd/src/g_array.c @@ -646,10 +646,11 @@ void garray_arraydialog(t_garray *x, t_symbol *s, int argc, t_atom *argv) //glist_select(x->x_glist, &x->x_gobj); //canvas_undo_add(x->x_glist, 3, "delete", canvas_undo_set_cut(x->x_glist, 2)); // 2 = UCUT_CLEAR (from g_editor.c) //currently cannot be undo'd until we do a new kind of undo + t_canvas *c = x->x_glist; int dspwas = canvas_suspend_dsp(); glist_delete(x->x_glist, &x->x_gobj); canvas_resume_dsp(dspwas); - canvas_redraw(glist_getcanvas(x->x_glist)); + canvas_redraw(glist_getcanvas(c)); } else { diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c index 1463572274e9358b3632d5057af938f1d755c99c..a58466af4c996f1ac1542e3f624b008e90120722 100644 --- a/pd/src/g_graph.c +++ b/pd/src/g_graph.c @@ -980,7 +980,7 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis) "none", 0, x1, y1, x2, y2); /* write garrays' names along the top */ - for (i = (y1 < y2 ? y1 : y2)-1, g = x->gl_list; g; g = g->g_next) + for (i = 0, g = x->gl_list; g; g = g->g_next, i++) { //fprintf(stderr,".\n"); //if (g->g_pd == garray_class) @@ -996,17 +996,16 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis) // tag, // (glist_isselected(x, gr) ? // "$pd_colors(selection)" : "$pd_colors(graph_border)")); - gui_vmess("gui_graph_label", "xsissisi", + gui_vmess("gui_graph_label", "xsiissisi", glist_getcanvas(x), tag, i, + sys_fontheight(glist_getfont(x)), arrayname->s_name, sys_font, sys_hostfontsize(glist_getfont(x)), sys_fontweight, glist_isselected(x, gr)); - - i += sys_fontheight(glist_getfont(x)); } } /* draw ticks on horizontal borders. If lperb field is