From 14fc6c7dd80e5a8030bf9fb4b9c100aa51ee4030 Mon Sep 17 00:00:00 2001
From: Albert Graef <aggraef@gmail.com>
Date: Mon, 15 Aug 2022 05:27:49 +0200
Subject: [PATCH] Shift+Tab cycles through the completions in reverse.

---
 pd/nw/pd_canvas.js | 6 +++---
 pd/nw/pdgui.js     | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index ce268c464..77d60d849 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -549,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_results);
+                    last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, 0);
                     last_yanked = "";
                     // ag: Don't do the usual object instantiation thing if
                     // we've clicked on the autocompletion dropdown. This
@@ -605,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_results);
+                            last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, 0);
                             caret_end();
                             // No need to instantiate the object here,
                             // presumably the user wants to go on editing.
@@ -613,7 +613,7 @@ var canvas_events = (function() {
                         last_yanked = "";
                         break;
                     case 9: // tab
-                        last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results);
+                        last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, evt.shiftKey?-1:1);
                         last_yanked = "";
                         caret_end();
                         break;
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index ebeb39449..0bdf7d624 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, res) {
+function select_result_autocomplete_dd(textbox, ac_dropdown, last, res, dir) {
     if (ac_dropdown !== null) {
         let sel = ac_dropdown.getAttribute("selected_item");
         if (sel > -1) {
@@ -725,7 +725,7 @@ function select_result_autocomplete_dd(textbox, ac_dropdown, last, res) {
             return sel;
         } else { // it only passes here when the user presses 'tab' and there is no option selected
             var n = res.length;
-            var next = (last+1) % n;
+            var next = (dir==0 ? last : dir>0 ? last+1 : last<=0 ? n-1 : last-1) % n;
             textbox.innerText = res[next];
             return next;
         }
-- 
GitLab