From ae473fe8c121dc47d0565f8ca125f9fe4bc42e90 Mon Sep 17 00:00:00 2001 From: jmoenig Date: Fri, 27 Nov 2020 09:11:34 +0100 Subject: [PATCH] extended block-search to include dropdown choices in custom blocks --- HISTORY.md | 3 ++- snap.html | 2 +- src/byob.js | 30 ++++++++++++++++++++++++++++-- src/objects.js | 5 ++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index b6333875..f035bc27 100755 --- a/HISTORY.md +++ b/HISTORY.md @@ -3,10 +3,11 @@ ## in development: * **Notable Changes:** - * searching for blocks and keyboard entry now includes thre contents of primitives' dropdown menus + * searching for blocks and keyboard entry now includes the contents of dropdown menus ### 2020-11-27 * objects: extended block-search to include dropdown choices in primitives +* byob, objects: extended block-search to include dropdown choices in custom blocks ### 2020-11-26 * blocks, objects: refactored input slot specs diff --git a/snap.html b/snap.html index 70dc1a79..dc9a3034 100755 --- a/snap.html +++ b/snap.html @@ -14,7 +14,7 @@ - + diff --git a/src/byob.js b/src/byob.js index 9e91b5e6..018f4e37 100644 --- a/src/byob.js +++ b/src/byob.js @@ -97,7 +97,7 @@ /*global modules, CommandBlockMorph, SpriteMorph, TemplateSlotMorph, Map, StringMorph, Color, DialogBoxMorph, ScriptsMorph, ScrollFrameMorph, WHITE, -Point, HandleMorph, HatBlockMorph, BlockMorph, detect, List, Process, +Point, HandleMorph, HatBlockMorph, BlockMorph, detect, List, Process, isString, AlignmentMorph, ToggleMorph, InputFieldMorph, ReporterBlockMorph, StringMorph, nop, radians, BoxMorph, ArrowMorph, PushButtonMorph, contains, InputSlotMorph, ToggleButtonMorph, IDE_Morph, MenuMorph, copy, ToggleElementMorph, fontHeight, @@ -107,7 +107,7 @@ WatcherMorph, Variable, BooleanSlotMorph, XML_Serializer, SnapTranslator*/ // Global stuff //////////////////////////////////////////////////////// -modules.byob = '2020-October-07'; +modules.byob = '2020-November-27'; // Declarations @@ -371,6 +371,32 @@ CustomBlockDefinition.prototype.parseChoices = function (string) { return dict; }; +CustomBlockDefinition.prototype.menuSearchWords = function () { + // return a single string containing words that can be searched for + // inside my dropdown menus + var terms = []; + this.inputNames().forEach(slot => { + var menu = this.dropDownMenuOf(slot); + if (menu) { + if (isString(menu)) { // special menu, translates its values + menu = InputSlotMorph.prototype[menu](true); + terms.push( + Object.values(menu).map(entry => { + if (isNil(entry)) {return ''; } + if (entry instanceof Array) { + return localize(entry[0]); + } + return entry.toString(); + }).join(' ') + ); + } else { // assume a dictionary, take its keys + terms.push(Object.keys(menu).join(' ')); + } + } + }); + return terms.join(' ').toLowerCase(); +}; + CustomBlockDefinition.prototype.isReadOnlyInput = function (inputName) { return this.declarations.has(inputName) && this.declarations.get(inputName)[3] === true; diff --git a/src/objects.js b/src/objects.js index c96c6d39..35f61b5e 100644 --- a/src/objects.js +++ b/src/objects.js @@ -3155,7 +3155,10 @@ SpriteMorph.prototype.blocksMatching = function ( blocksList.forEach(definition => { if (contains(types, definition.type)) { var spec = definition.localizedSpec(), - rel = relevance(labelOf(spec), search); + rel = relevance(labelOf( + spec) + ' ' + definition.menuSearchWords(), + search + ); if (rel !== -1) { blocks.push([definition.templateInstance(), rel + '2']); }