diff --git a/src/Files.App/Dialogs/SettingsDialog.xaml b/src/Files.App/Dialogs/SettingsDialog.xaml index 451a492f67d2..5532ccd71123 100644 --- a/src/Files.App/Dialogs/SettingsDialog.xaml +++ b/src/Files.App/Dialogs/SettingsDialog.xaml @@ -82,6 +82,26 @@ PaneDisplayMode="Left" SelectionChanged="MainSettingsNavigationView_SelectionChanged"> + + + + + + + + + + Text; // Ensures dropdown shows search text + } + + private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) + { + if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) + { + var query = sender.Text; + var results = SearchSettingsPages(query); + + // Store actual objects instead of just text + sender.ItemsSource = results; + } + } + + private void AutoSuggestBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args) + { + var query = args.QueryText; + var results = SearchSettingsPages(query); + sender.ItemsSource = results; + } + + private void NavViewSearchBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args) + { + if (args.SelectedItem is SearchResultItem selectedItem) + { + SettingsContentFrame.Navigate(selectedItem.ParentPage.GetType()); + NavViewSearchBox.Text = string.Empty; + } + } + + private IEnumerable SearchVisualTreeForText(DependencyObject parent, string query) + { + var results = new List(); + + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = VisualTreeHelper.GetChild(parent, i); + + if (child is FrameworkElement element) + { + if (element is TextBlock textBlock && textBlock.Text.Contains(query, StringComparison.OrdinalIgnoreCase)) + results.Add(textBlock.Text); + else if (element is SettingsCard settingsCard && settingsCard.Header is string headerText && + headerText.Contains(query, StringComparison.OrdinalIgnoreCase)) + results.Add(headerText); + else if (element is SettingsExpander settingsExpander) + { + if (settingsExpander.Header is string expanderHeader && + expanderHeader.Contains(query, StringComparison.OrdinalIgnoreCase)) + results.Add(expanderHeader); + + results.AddRange(SearchVisualTreeForText(settingsExpander, query)); + + results.AddRange(settingsExpander.Items.OfType() + .Select(subCard => subCard.Header) + .OfType() + .Where(subCardHeader => subCardHeader.Contains(query, StringComparison.OrdinalIgnoreCase))); + } + } + + results.AddRange(SearchVisualTreeForText(child, query)); + } + + return results; + } + + + private IEnumerable SearchSettingsPages(string query) + { + var results = new List(); + + var settingsPages = new List + { + new AboutPage(), + new AppearancePage(), + new TagsPage(), + new DevToolsPage(), + new GeneralPage(), + new FoldersPage(), + }; + + foreach (var page in settingsPages) + { + var matches = SearchVisualTreeForText(page, query); + foreach (var match in matches) + { + results.Add(new SearchResultItem { Text = match, ParentPage = page }); + } + } + + return results; + } + } }