diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js index 4232e1e12bd28f2d3f573c12ec669193e5d02680..ce268c4642083e4e6665ccdfacd9e3394ed05353 100644 --- a/pd/nw/pd_canvas.js +++ b/pd/nw/pd_canvas.js @@ -50,6 +50,7 @@ var canvas_events = (function() { last_dropdown_menu_y, last_search_term = "", svg_view = document.getElementById("patchsvg").viewBox.baseVal, + last_results = [], // last completion results (autocomplete) last_completed = -1, // last Tab completion (autocomplete) last_yanked = "", // last yanked completion (to confirm deletion) textbox = function () { @@ -343,7 +344,7 @@ var canvas_events = (function() { if (obj_class === "obj") { // autocomplete only works for objects pdgui.create_autocomplete_dd(document, ac_dropdown(), textbox()); if (ac_dropdown().getAttribute("searched_text") !== textbox().innerText) { - pdgui.repopulate_autocomplete_dd(document, ac_dropdown, obj_class, textbox().innerText); + last_results = pdgui.repopulate_autocomplete_dd(document, ac_dropdown, obj_class, textbox().innerText); } } }, @@ -548,7 +549,7 @@ var canvas_events = (function() { }, text_mousedown: function(evt) { if (evt.target.parentNode === ac_dropdown()) { - last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed); + last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results); last_yanked = ""; // ag: Don't do the usual object instantiation thing if // we've clicked on the autocompletion dropdown. This @@ -604,7 +605,7 @@ var canvas_events = (function() { if(ac_dropdown() === null || ac_dropdown().getAttribute("selected_item") === "-1") { grow_svg_for_element(textbox()); } else { // else, if there is a selected item on autocompletion tool, the selected item is written on the box - last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed); + last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results); caret_end(); // No need to instantiate the object here, // presumably the user wants to go on editing. @@ -612,13 +613,14 @@ var canvas_events = (function() { last_yanked = ""; break; case 9: // tab - last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed); + last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results); last_yanked = ""; caret_end(); break; case 27: // esc pdgui.delete_autocomplete_dd(ac_dropdown()); last_completed = -1; + last_results = []; if (last_yanked != "") { pdgui.post("Operation aborted.") } @@ -632,6 +634,7 @@ var canvas_events = (function() { // which is to "yank" the current completion // (remove it from the completion index). last_completed = -1; + last_results = []; if (textbox().innerText === "") { pdgui.delete_autocomplete_dd(ac_dropdown()); last_yanked = ""; @@ -672,6 +675,7 @@ var canvas_events = (function() { || e.keyCode == 8 || e.keyCode == 46; } if (is_valid_key(evt)) { + last_results = []; last_completed = -1; last_yanked = ""; if (textbox().innerText === "") { diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index aeebc88a4de3b84a5736e640530870305373bdb3..ebeb39449e5fec6ae88f37347f20af91d208b2c7 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -716,7 +716,7 @@ function update_autocomplete_dd_arrowup(ac_dropdown) { } } -function select_result_autocomplete_dd(textbox, ac_dropdown, last) { +function select_result_autocomplete_dd(textbox, ac_dropdown, last, res) { if (ac_dropdown !== null) { let sel = ac_dropdown.getAttribute("selected_item"); if (sel > -1) { @@ -724,9 +724,9 @@ function select_result_autocomplete_dd(textbox, ac_dropdown, last) { delete_autocomplete_dd(ac_dropdown); return sel; } else { // it only passes here when the user presses 'tab' and there is no option selected - var n = ac_dropdown.children.length; + var n = res.length; var next = (last+1) % n; - textbox.innerText = ac_dropdown.children.item(next).innerText; + textbox.innerText = res[next]; return next; } } else { @@ -800,6 +800,8 @@ function repopulate_autocomplete_dd(doc, ac_dropdown, obj_class, text) { results = results.map(a => a.item.title); } + // record the complete results, we need them for tab completion + let all_results = results; // GB TODO: ideally we should be able to show all the results in a limited window with a scroll bar let n = 8; // Maximum number of suggestions if (results.length > n) results = results.slice(0,n); @@ -823,6 +825,7 @@ function repopulate_autocomplete_dd(doc, ac_dropdown, obj_class, text) { } else { // if there is no suggestion candidate, the autocompletion dropdown should disappear delete_autocomplete_dd (ac_dropdown()); } + return all_results; } // GB: create autocomplete dropdown based on the properties of the textbox for new_obj_element