public async void OnElementChanged(SMDisplayedElementChangedEventArgs e) { var element = e.NewElement; if (element.IsNull()) { return; } if (element.Type != ElementType.Item) { Application.Current.Dispatcher.Invoke(() => { CurrentWdw?.Close(); }); return; } try { // Cancel search early on element changed event var cts = new RemoteCancellationTokenSource(); Svc.SM.UI.ElementWdw.OnElementChanged += new ActionProxy <SMDisplayedElementChangedEventArgs>((args) => cts?.Cancel()); List <string> searchTerms = GetSearchTerms(); await SearchForCards(searchTerms, cts.Token); } catch (RemotingException) { } }
private void UpdateCardWdw(List <Card> cards) { Application.Current.Dispatcher.BeginInvoke((Action)(() => { CurrentWdw.ClearDataGrid(); CurrentWdw.AddCards(cards); })); }
private async Task SearchForCards(List <string> words, RemoteCancellationToken ct) { if (words.IsNull() || !words.Any()) { return; } var results = new Dictionary <string, int>(); try { foreach (var word in words) { if (word.IsNullOrEmpty() || ct.IsNull()) { return; } if (CardIndex.IsNull()) { return; } await foreach (Result res in CardIndex.Search(word, ct.Token())) { string id = res.DocumentReference; if (results.ContainsKey(id)) { results[id]++; } else { results[id] = 1; } } } } catch (TaskCanceledException) { } if (results.IsNull() || !results.Any()) { return; } var ordered = results .OrderByDescending(x => x.Value) .Take(Config.MaxSearchResults); var cards = new List <Card>(); foreach (var pair in ordered) { cards.Add(Cards[pair.Key]); } if (CurrentWdw.IsNull() || CurrentWdw.IsClosed) { OpenCardWdw(cards); } else { UpdateCardWdw(cards); } }