!7 srecord Result(S text, S moduleID, S moduleDesc, O[] params, double value) {} module QuickSearchManager > DynQuickSearch { transient S resultsQuery; transient Map> resultsByModule = synchroMap(); transient L shownResults; afterVisualize { onDoubleClickOrEnter(list, r { Result r = _get(shownResults, getSelectedIndex(list)); if (r == null) ret; dm_hideQuickSearchModules(); O defaultAction = optPar(r.params, 'defaultAction); print("defaultAction: " + defaultAction); callFInNewThread(defaultAction, r.text); }); } LS calc_impl() { L results = concatLists(cloneValues(getResultsByModule())); sortByFieldDesc_inPlace(results, 'value); ret map(func(Result r) -> S { resultToText(r) }, shownResults = takeFirst(50, results)); } S resultToText(Result r) { ret "[" + r.moduleDesc + "] " + r.text; } // clear if query changed Map> getResultsByModule() { S input = dm_topInput(); synchronized(resultsByModule) { if (neq(resultsQuery, input)) { resultsQuery = input; resultsByModule.clear(); } ret resultsByModule; } } // API void setResultsForModule(S moduleID, S query, LS results) { setResultsForModule(moduleID, null, query, results); } void setResultsForModule(fS moduleID, S _moduleDesc, S query, LS results, fO... _) { fS moduleDesc = _moduleDesc != null ? _moduleDesc : dm_moduleName(moduleID); if (neq(query, dm_topInput())) ret with print("Results for wrong query: " + query); synchronized(resultsByModule) { getResultsByModule().put(moduleID, map(results, func(S s) -> Result { Result(s, moduleID, moduleDesc, _, 0) })); } // show/update list if (nempty(results)) doSearch(resultsQuery); } }