private void Search() { stack.Clear(); if (hasSearch) { searchCancellationTokenSource?.Cancel(); if (hasSufficientSearch) { var queryNow = query; searchCancellationTokenSource = new CancellationTokenSource(); var searchCancellationToken = searchCancellationTokenSource.Token; ExecuteTask(delegate { if (searchCancellationToken.IsCancellationRequested) { return; } DisplayProgressBar($"Searching for '{queryNow}'...", 0); lock (guiLock) { searchRoot.children.Clear(); searchRoot.isPopulated = false; } Populate(searchRoot, tree.OrderedSearchResults(query, searchCancellationToken).Cancellable(searchCancellationToken).Take(LudiqCore.Configuration.maxSearchResults)); activeSelectedIndex = activeNodes.Count >= 1 ? 0 : -1; }); } else { ExecuteTask(delegate { lock (guiLock) { searchRoot.children.Clear(); searchRoot.isPopulated = true; } }); } stack.Push(searchRoot); } else { stack.Push(root); animTarget = 1; lastRepaintTime = DateTime.Now; return; } }
private void Search() { while (stack.Count > 0 && stack[stack.Count - 1].option is SearchOption) { stack.RemoveAt(stack.Count - 1); } if (hasSearch) { searchCancellationTokenSource?.Cancel(); var query = this.query; var parent = (stack.Count > 1 ? stack[stack.Count - 1] : null); var searchNode = new FuzzyOptionNode(new SearchOption(query)); searchCancellationTokenSource = new CancellationTokenSource(); var searchCancellationToken = searchCancellationTokenSource.Token; ExecuteTask(() => { DisplayProgressBar($"Searching for \"{query}\"...", 0); if (searchCancellationToken.IsCancellationRequested) { return; } lock (guiLock) { searchNode.children.Clear(); searchNode.isPopulated = false; } Populate(searchNode, tree.OrderedSearchResults(query, parent?.option, searchCancellationToken).Take(LudiqCore.Configuration.maxSearchResults)); activeSelectedIndex = activeNodes.Count >= 1 ? 0 : -1; }); stack.Add(searchNode); } else { animTarget = 1; animAncestor = null; lastRepaintTime = DateTime.UtcNow; } }