Skip to content

Commit cad754c

Browse files
committed
Init
1 parent fea128e commit cad754c

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

src/Files.App/Dialogs/SettingsDialog.xaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,25 @@
8282
PaneDisplayMode="Left"
8383
SelectionChanged="MainSettingsNavigationView_SelectionChanged">
8484

85+
<NavigationView.AutoSuggestBox>
86+
<AutoSuggestBox
87+
x:Name="NavViewSearchBox"
88+
PlaceholderText="{helpers:ResourceString Name=Search}"
89+
QueryIcon="Find"
90+
QuerySubmitted="AutoSuggestBox_QuerySubmitted"
91+
SuggestionChosen="NavViewSearchBox_SuggestionChosen"
92+
TextChanged="AutoSuggestBox_TextChanged">
93+
<AutoSuggestBox.ItemTemplate>
94+
<DataTemplate>
95+
<TextBlock
96+
Padding="0,8,0,8"
97+
Text="{Binding}"
98+
TextWrapping="Wrap" />
99+
</DataTemplate>
100+
</AutoSuggestBox.ItemTemplate>
101+
</AutoSuggestBox>
102+
</NavigationView.AutoSuggestBox>
103+
85104
<!-- Menu Items -->
86105
<NavigationView.MenuItems>
87106
<NavigationViewItem

src/Files.App/Dialogs/SettingsDialog.xaml.cs

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Copyright (c) Files Community
22
// Licensed under the MIT License.
33

4+
using CommunityToolkit.WinUI.Controls;
45
using Files.App.Views.Settings;
56
using Microsoft.UI.Xaml;
67
using Microsoft.UI.Xaml.Controls;
8+
using Microsoft.UI.Xaml.Media;
79
using Microsoft.UI.Xaml.Media.Animation;
810

911
namespace Files.App.Dialogs
@@ -37,7 +39,7 @@ public void NavigateTo(SettingsNavigationParams navParams)
3739
);
3840
if (oldSelection is not null)
3941
oldSelection.IsSelected = false;
40-
42+
4143
MainSettingsNavigationView.SelectedItem = targetSection;
4244
}
4345

@@ -88,5 +90,104 @@ private void CloseSettingsDialogButton_Click(object sender, RoutedEventArgs e)
8890
{
8991
Hide();
9092
}
93+
94+
public class SearchResultItem
95+
{
96+
public string Text { get; set; }
97+
public Page ParentPage { get; set; }
98+
public override string ToString() => Text; // Ensures dropdown shows search text
99+
}
100+
101+
private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
102+
{
103+
if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
104+
{
105+
var query = sender.Text;
106+
var results = SearchSettingsPages(query);
107+
108+
// Store actual objects instead of just text
109+
sender.ItemsSource = results;
110+
}
111+
}
112+
113+
private void AutoSuggestBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
114+
{
115+
var query = args.QueryText;
116+
var results = SearchSettingsPages(query);
117+
sender.ItemsSource = results;
118+
}
119+
120+
private void NavViewSearchBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
121+
{
122+
if (args.SelectedItem is SearchResultItem selectedItem)
123+
{
124+
SettingsContentFrame.Navigate(selectedItem.ParentPage.GetType());
125+
NavViewSearchBox.Text = string.Empty;
126+
}
127+
}
128+
129+
private IEnumerable<string> SearchVisualTreeForText(DependencyObject parent, string query)
130+
{
131+
var results = new List<string>();
132+
133+
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
134+
{
135+
var child = VisualTreeHelper.GetChild(parent, i);
136+
137+
if (child is FrameworkElement element)
138+
{
139+
if (element is TextBlock textBlock && textBlock.Text.Contains(query, StringComparison.OrdinalIgnoreCase))
140+
results.Add(textBlock.Text);
141+
else if (element is SettingsCard settingsCard && settingsCard.Header is string headerText &&
142+
headerText.Contains(query, StringComparison.OrdinalIgnoreCase))
143+
results.Add(headerText);
144+
else if (element is SettingsExpander settingsExpander)
145+
{
146+
if (settingsExpander.Header is string expanderHeader &&
147+
expanderHeader.Contains(query, StringComparison.OrdinalIgnoreCase))
148+
results.Add(expanderHeader);
149+
150+
results.AddRange(SearchVisualTreeForText(settingsExpander, query));
151+
152+
results.AddRange(settingsExpander.Items.OfType<SettingsCard>()
153+
.Select(subCard => subCard.Header)
154+
.OfType<string>()
155+
.Where(subCardHeader => subCardHeader.Contains(query, StringComparison.OrdinalIgnoreCase)));
156+
}
157+
}
158+
159+
results.AddRange(SearchVisualTreeForText(child, query));
160+
}
161+
162+
return results;
163+
}
164+
165+
166+
private IEnumerable<SearchResultItem> SearchSettingsPages(string query)
167+
{
168+
var results = new List<SearchResultItem>();
169+
170+
var settingsPages = new List<Page>
171+
{
172+
new AboutPage(),
173+
new AppearancePage(),
174+
new TagsPage(),
175+
new DevToolsPage(),
176+
new GeneralPage(),
177+
new FoldersPage(),
178+
};
179+
180+
foreach (var page in settingsPages)
181+
{
182+
var matches = SearchVisualTreeForText(page, query);
183+
foreach (var match in matches)
184+
{
185+
results.Add(new SearchResultItem { Text = match, ParentPage = page });
186+
}
187+
}
188+
189+
return results;
190+
}
191+
91192
}
92193
}

0 commit comments

Comments
 (0)