!7 module ServerModuleSearch > DynQuickSearch { Set recommendedModules; start { moduleDescForSearch = "Loadable"; dm_snippetsDB(); doEvery(5.0, 3600.0, r { setField(recommendedModules := asSet(map psI(collect('moduleID, stefansOS_parseRecommendedModulesList(mL("Recommended Modules")))))); }); } afterVisualize { listPopupMenuThreaded(list, "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)) }); VF1 defaultAction = voidfunc(fS s) enter { dm_addDynamicModuleDialog2(beforeSpace(s), true); dm_hideQuickSearchModules(); }; onDoubleClickOrEnterThreaded(list, defaultAction); quickSearchParams = new O[] { +defaultAction }; } L calc_impl() { 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) + " - " + (contains(recommendedModules, id) ? unicode_whiteStar() + " " : "") + _get(snippet, 'title); })); } L sortSnippets(L snippets) { ret sortByCalculatedFieldDesc(snippets, func(O snippet) -> Int { long id = getLong(snippet, 'snippetID); if (contains(recommendedModules, id)) ret 1; S title = getString(snippet, 'title); ret contains(title, "dev.") ? -1 : 0; }); } }