140 lines
4.1 KiB
C#
140 lines
4.1 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using gregExtractor.Models;
|
|
|
|
namespace gregExtractor.GUI.ViewModels;
|
|
|
|
public sealed class HookBrowserRow
|
|
{
|
|
public required string Group { get; init; }
|
|
public required string Namespace { get; init; }
|
|
public required string ClassName { get; init; }
|
|
public required string MethodName { get; init; }
|
|
public required string ReturnType { get; init; }
|
|
public required bool IsVoid { get; init; }
|
|
public required string Parameters { get; init; }
|
|
}
|
|
|
|
public sealed class HookBrowserViewModel : ObservableObject
|
|
{
|
|
private string _searchText = string.Empty;
|
|
private string _selectedGroup = "Alle";
|
|
private bool _isLoading;
|
|
|
|
public HookBrowserViewModel()
|
|
{
|
|
Groups.Add("Alle");
|
|
RefreshCommand = new AsyncRelayCommand(RefreshAsync, () => !IsLoading);
|
|
}
|
|
|
|
public string SearchText
|
|
{
|
|
get => _searchText;
|
|
set
|
|
{
|
|
if (!SetProperty(ref _searchText, value))
|
|
return;
|
|
|
|
ApplyFilter();
|
|
}
|
|
}
|
|
|
|
public string SelectedGroup
|
|
{
|
|
get => _selectedGroup;
|
|
set
|
|
{
|
|
if (!SetProperty(ref _selectedGroup, value))
|
|
return;
|
|
|
|
ApplyFilter();
|
|
}
|
|
}
|
|
|
|
public bool IsLoading
|
|
{
|
|
get => _isLoading;
|
|
set
|
|
{
|
|
if (!SetProperty(ref _isLoading, value))
|
|
return;
|
|
|
|
RefreshCommand.NotifyCanExecuteChanged();
|
|
}
|
|
}
|
|
|
|
public ObservableCollection<string> Groups { get; } = new();
|
|
|
|
public ObservableCollection<HookBrowserRow> Rows { get; } = new();
|
|
|
|
public ObservableCollection<HookBrowserRow> FilteredRows { get; } = new();
|
|
|
|
public IAsyncRelayCommand RefreshCommand { get; }
|
|
|
|
public async Task RefreshAsync()
|
|
{
|
|
IsLoading = true;
|
|
try
|
|
{
|
|
string hooksPath = Path.Combine(Directory.GetCurrentDirectory(), "game_hooks.json");
|
|
if (!File.Exists(hooksPath))
|
|
{
|
|
Rows.Clear();
|
|
FilteredRows.Clear();
|
|
return;
|
|
}
|
|
|
|
string json = await File.ReadAllTextAsync(hooksPath, CancellationToken.None).ConfigureAwait(false);
|
|
HookDefinition[] hooks = JsonSerializer.Deserialize<HookDefinition[]>(json) ?? Array.Empty<HookDefinition>();
|
|
|
|
Rows.Clear();
|
|
foreach (HookDefinition hook in hooks)
|
|
{
|
|
Rows.Add(new HookBrowserRow
|
|
{
|
|
Group = hook.Group,
|
|
Namespace = hook.Namespace,
|
|
ClassName = hook.ClassName,
|
|
MethodName = hook.MethodName,
|
|
ReturnType = hook.ReturnType,
|
|
IsVoid = hook.IsVoid,
|
|
Parameters = string.Join(", ", hook.Parameters.Select(p => $"{p.Type} {p.Name}")),
|
|
});
|
|
}
|
|
|
|
HashSet<string> groups = hooks.Select(h => h.Group).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
|
Groups.Clear();
|
|
Groups.Add("Alle");
|
|
foreach (string group in groups.OrderBy(x => x, StringComparer.OrdinalIgnoreCase))
|
|
Groups.Add(group);
|
|
|
|
ApplyFilter();
|
|
}
|
|
finally
|
|
{
|
|
IsLoading = false;
|
|
}
|
|
}
|
|
|
|
private void ApplyFilter()
|
|
{
|
|
IEnumerable<HookBrowserRow> query = Rows;
|
|
|
|
if (!SelectedGroup.Equals("Alle", StringComparison.OrdinalIgnoreCase))
|
|
query = query.Where(x => x.Group.Equals(SelectedGroup, StringComparison.OrdinalIgnoreCase));
|
|
|
|
if (!string.IsNullOrWhiteSpace(SearchText))
|
|
{
|
|
query = query.Where(x =>
|
|
x.MethodName.Contains(SearchText, StringComparison.OrdinalIgnoreCase)
|
|
|| x.ClassName.Contains(SearchText, StringComparison.OrdinalIgnoreCase)
|
|
|| x.Namespace.Contains(SearchText, StringComparison.OrdinalIgnoreCase)
|
|
|| x.Group.Contains(SearchText, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
|
|
FilteredRows.Clear();
|
|
foreach (HookBrowserRow row in query)
|
|
FilteredRows.Add(row);
|
|
}
|
|
}
|