Merge pull request #667 from irihitech/variable

Add search functionality to VariablesDemo
This commit is contained in:
Dong Bin
2025-09-26 00:14:29 +08:00
committed by GitHub
3 changed files with 128 additions and 88 deletions

View File

@@ -11,7 +11,17 @@
<Design.DataContext> <Design.DataContext>
<vm:VariablesDemoViewModel /> <vm:VariablesDemoViewModel />
</Design.DataContext> </Design.DataContext>
<Grid RowDefinitions="Auto, *">
<TextBox
Grid.Row="0"
Width="600"
Margin="8"
Classes="ClearButton"
Text="{Binding SearchText}"
Watermark="Input Variable Category/ResourceKey/Type/Value/Description" />
<DataGrid <DataGrid
Grid.Row="1"
Margin="8" Margin="8"
CanUserReorderColumns="True" CanUserReorderColumns="True"
CanUserResizeColumns="True" CanUserResizeColumns="True"
@@ -91,4 +101,5 @@
</DataGridTemplateColumn> </DataGridTemplateColumn>
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</Grid>
</UserControl> </UserControl>

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
@@ -37,9 +38,9 @@ public partial class IconDemoViewModel : ObservableObject
}; };
if (key.ToString().EndsWith("Stroked")) if (key.ToString().EndsWith("Stroked"))
_strokedIcons[key.ToString().ToLowerInvariant()] = icon; _strokedIcons[key.ToString()] = icon;
else else
_filledIcons[key.ToString().ToLowerInvariant()] = icon; _filledIcons[key.ToString()] = icon;
} }
} }
@@ -48,16 +49,16 @@ public partial class IconDemoViewModel : ObservableObject
partial void OnSearchTextChanged(string? value) partial void OnSearchTextChanged(string? value)
{ {
var search = value?.ToLowerInvariant() ?? string.Empty; var search = string.IsNullOrWhiteSpace(value) ? string.Empty : value.Trim();
FilteredFilledIcons.Clear(); FilteredFilledIcons.Clear();
foreach (var pair in _filledIcons.Where(i => i.Key.Contains(search))) foreach (var pair in _filledIcons.Where(kv => kv.Key.Contains(search, StringComparison.InvariantCultureIgnoreCase)))
{ {
FilteredFilledIcons.Add(pair.Value); FilteredFilledIcons.Add(pair.Value);
} }
FilteredStrokedIcons.Clear(); FilteredStrokedIcons.Clear();
foreach (var pair in _strokedIcons.Where(i => i.Key.Contains(search))) foreach (var pair in _strokedIcons.Where(kv => kv.Key.Contains(search, StringComparison.InvariantCultureIgnoreCase)))
{ {
FilteredStrokedIcons.Add(pair.Value); FilteredStrokedIcons.Add(pair.Value);
} }

View File

@@ -10,9 +10,10 @@ using Semi.Avalonia.Tokens;
namespace Semi.Avalonia.Demo.ViewModels; namespace Semi.Avalonia.Demo.ViewModels;
public class VariablesDemoViewModel : ObservableObject public partial class VariablesDemoViewModel : ObservableObject
{ {
public DataGridCollectionView GridData { get; set; } public DataGridCollectionView GridData { get; set; }
[ObservableProperty] private string _searchText = string.Empty;
public VariablesDemoViewModel() public VariablesDemoViewModel()
{ {
@@ -30,7 +31,7 @@ public class VariablesDemoViewModel : ObservableObject
GridData.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(VariableItem.Category))); GridData.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(VariableItem.Category)));
} }
private static string GetValueString(object? value) private static string? GetValueString(object? value)
{ {
if (value is null) return string.Empty; if (value is null) return string.Empty;
@@ -45,6 +46,28 @@ public class VariablesDemoViewModel : ObservableObject
}; };
} }
partial void OnSearchTextChanged(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
GridData.Filter = _ => true;
GridData.Refresh();
return;
}
var search = value.Trim();
GridData.Filter = item =>
{
if (item is not VariableItem variableItem) return false;
return (variableItem.Category?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
(variableItem.ResourceKey?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
(variableItem.Value?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
(variableItem.Type?.Name.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
(variableItem.Description?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false);
};
GridData.Refresh();
}
private static List<VariableItem> Tokens { get; set; } = private static List<VariableItem> Tokens { get; set; } =
[ [
new("Height", "SemiHeightControlSmall"), new("Height", "SemiHeightControlSmall"),
@@ -55,6 +78,11 @@ public class VariablesDemoViewModel : ObservableObject
new("Icon Size", "SemiWidthIconMedium"), new("Icon Size", "SemiWidthIconMedium"),
new("Icon Size", "SemiWidthIconLarge"), new("Icon Size", "SemiWidthIconLarge"),
new("Icon Size", "SemiWidthIconExtraLarge"), new("Icon Size", "SemiWidthIconExtraLarge"),
new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingExtraSmall"),
new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingSmall"),
new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingMedium"),
new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingLarge"),
new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingFull"),
new("Border CornerRadius", "SemiBorderRadiusExtraSmall"), new("Border CornerRadius", "SemiBorderRadiusExtraSmall"),
new("Border CornerRadius", "SemiBorderRadiusSmall"), new("Border CornerRadius", "SemiBorderRadiusSmall"),
new("Border CornerRadius", "SemiBorderRadiusMedium"), new("Border CornerRadius", "SemiBorderRadiusMedium"),