!7 cmodule2 ServerModuleSearch > DynQuickSearch { Map recommendedModules; start { moduleDescForSearch = "Loadable"; dm_snippetsDB(); doEvery(5.0, 3600.0, r { setField(recommendedModules := mapKeys psI( (Map) indexByField moduleID( stefansOS_parseRecommendedModulesList(mL("Recommended Modules")))); }); quickSearchParams = new O[] { defaultAction := voidfunc(fS s) enter { dm_addDynamicModuleDialog2(beforeSpace(s), true); dm_hideQuickSearchModules(); }, popupItems := new O[] { "Edit", voidfunc(S s) enter { dm_openSnippetInEditor(beforeSpace(s)); }, "Make New", voidfunc(S s) enter { dm_addDynamicModuleDialog2(beforeSpace(s), false); dm_hideQuickSearchModules(); }, "---", "Send to machine...", voidfunc(S s) enter { dm_sendModuleToOtherMachineDialog(beforeSpace(s)) } } }; } afterVisualize { listPopupMenuThreaded(list, (O[]) optPar(quickSearchParams, 'popupItems)); onDoubleClickOrEnterThreaded(list, (VF1) optPar(quickSearchParams, 'defaultAction)); } L calc_impl() { ret searchImpl(query); } L sortSnippets(L snippets) { ret sortByCalculatedFieldDesc(snippets, func(O snippet) -> Int { long id = getLong(snippet, 'snippetID); RecommendedModule rm = mapGet(recommendedModules, id); if (rm != null) ret rm.prio+1; S title = getString(snippet, 'title); ret contains(title, "dev.") ? -1 : 0; }); } // API LS searchImpl(S query) { L snippets = dm_dynModulesOnServer(); // L snippets = sortSnippets(snippets); // TODO: don't do this every time ret scoredSearch_eachTerm(query, map(snippets, func(fO snippet) -> S { long id = getLong(snippet, 'snippetID); ret fsI(id) + " - " + (containsKey(recommendedModules, id) ? unicode_whiteStar() + " " : "") + _get(snippet, 'title); })); } }