feat: display clicked schema to pane

This commit is contained in:
estrogen elf
2025-06-17 22:52:14 -05:00
parent b56c18a552
commit f9285a2bef
8 changed files with 81 additions and 6 deletions

View File

@@ -0,0 +1,8 @@
using Needlework.Net.ViewModels.Pages.Endpoints;
namespace Needlework.Net.Models
{
public record SchemaPaneItem(string Key, Tab Tab)
{
}
}

View File

@@ -102,6 +102,7 @@ class Program
builder.AddSingleton<DialogService>();
builder.AddSingleton<DocumentService>();
builder.AddSingleton<NotificationService>();
builder.AddSingleton<SchemaPaneService>();
builder.AddSingleton<IFlurlClientCache>(new FlurlClientCache()
.Add("GithubClient", "https://api.github.com")
.Add("GithubUserContentClient", "https://raw.githubusercontent.com")

View File

@@ -0,0 +1,20 @@
using Needlework.Net.Models;
using Needlework.Net.ViewModels.Pages.Endpoints;
using System;
using System.Reactive.Subjects;
namespace Needlework.Net.Services
{
public class SchemaPaneService
{
private readonly Subject<SchemaPaneItem> _schemaPaneItemsSubject = new();
public IObservable<SchemaPaneItem> SchemaPaneItems { get { return _schemaPaneItemsSubject; } }
public void Add(string key, Tab tab)
{
var schemaPaneItem = new SchemaPaneItem(key, tab);
_schemaPaneItemsSubject.OnNext(schemaPaneItem);
}
}
}

View File

@@ -41,15 +41,18 @@ public partial class MainWindowViewModel
private readonly DialogService _dialogService;
private readonly SchemaPaneService _schemaPaneService;
private readonly IDisposable _checkForUpdatesDisposable;
private readonly IDisposable _checkForSchemaVersionDisposable;
public MainWindowViewModel(IEnumerable<PageBase> pages, DialogService dialogService, DocumentService documentService, NotificationService notificationService, IFlurlClientCache clients)
public MainWindowViewModel(IEnumerable<PageBase> pages, DialogService dialogService, DocumentService documentService, NotificationService notificationService, IFlurlClientCache clients, SchemaPaneService schemaPaneService)
{
_dialogService = dialogService;
_documentService = documentService;
_notificationService = notificationService;
_schemaPaneService = schemaPaneService;
_githubClient = clients.Get("GithubClient");
NavigationViewItems = pages
@@ -68,6 +71,26 @@ public partial class MainWindowViewModel
Notifications.Remove(vm);
});
_schemaPaneService.SchemaPaneItems.Subscribe(async item =>
{
var document = item.Tab switch
{
Pages.Endpoints.Tab.LCU => await documentService.GetLcuSchemaDocumentAsync(),
Pages.Endpoints.Tab.GameClient => await documentService.GetLolClientDocumentAsync(),
_ => throw new NotImplementedException()
};
var propertyClassViewModel = OpenApiHelpers.WalkSchema(document.OpenApiDocument.Components.Schemas[item.Key], document.OpenApiDocument);
var schemaViewModel = new SchemaViewModel(propertyClassViewModel);
if (Schemas.ToList().Find(schema => schema.Id == schemaViewModel.Id) == null)
{
Schemas.Add(schemaViewModel);
IsPaneOpen = true;
OpenSchemaPaneCommand.NotifyCanExecuteChanged();
CloseSchemaAllCommand.NotifyCanExecuteChanged();
}
});
_checkForUpdatesDisposable = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMinutes(10))
.Select(time => Unit.Default)
.Subscribe(async _ =>

View File

@@ -1,4 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Needlework.Net.Services;
using Needlework.Net.ViewModels.Pages.Endpoints;
using System;
@@ -6,8 +8,12 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
{
public partial class SchemaSearchDetailsViewModel : ObservableObject
{
public SchemaSearchDetailsViewModel(Tab tab, PropertyClassViewModel vm)
private readonly SchemaPaneService _schemaPaneService;
public SchemaSearchDetailsViewModel(Tab tab, PropertyClassViewModel vm, SchemaPaneService schemaPaneService)
{
_schemaPaneService = schemaPaneService;
Tab = tab;
Id = vm.Id;
}
@@ -22,5 +28,11 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
Tab.GameClient => "Game Client",
_ => throw new NotImplementedException()
};
[RelayCommand]
private void Display()
{
_schemaPaneService.Add(Id, Tab);
}
}
}

View File

@@ -3,6 +3,7 @@ using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using DebounceThrottle;
using Needlework.Net.Helpers;
using Needlework.Net.Services;
using Needlework.Net.ViewModels.Pages.Endpoints;
using System;
using System.Collections.Generic;
@@ -17,11 +18,14 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
private readonly DocumentService _documentService;
private readonly SchemaPaneService _schemaPaneService;
private List<SchemaSearchDetailsViewModel> _schemas = [];
public SchemasViewModel(DocumentService documentService) : base("Schemas", "fa-solid fa-file-lines", -100)
public SchemasViewModel(DocumentService documentService, SchemaPaneService schemaPaneService) : base("Schemas", "fa-solid fa-file-lines", -100)
{
_documentService = documentService;
_schemaPaneService = schemaPaneService;
}
[ObservableProperty]
@@ -61,8 +65,8 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
Dispatcher.UIThread.Invoke(() =>
{
var schemas = Enumerable.Concat(
lcuSchemaDocument.OpenApiDocument.Components.Schemas.Values.Select(schema => new SchemaSearchDetailsViewModel(Tab.LCU, OpenApiHelpers.WalkSchema(schema, lcuSchemaDocument.OpenApiDocument))),
lolClientDocument.OpenApiDocument.Components.Schemas.Values.Select(schema => new SchemaSearchDetailsViewModel(Tab.GameClient, OpenApiHelpers.WalkSchema(schema, lolClientDocument.OpenApiDocument)))
lcuSchemaDocument.OpenApiDocument.Components.Schemas.Values.Select(schema => new SchemaSearchDetailsViewModel(Tab.LCU, OpenApiHelpers.WalkSchema(schema, lcuSchemaDocument.OpenApiDocument), _schemaPaneService)),
lolClientDocument.OpenApiDocument.Components.Schemas.Values.Select(schema => new SchemaSearchDetailsViewModel(Tab.GameClient, OpenApiHelpers.WalkSchema(schema, lolClientDocument.OpenApiDocument), _schemaPaneService))
).ToList();
_schemas = schemas;
SchemaItems = schemas.ToList();

View File

@@ -8,6 +8,7 @@
xmlns:materialIcons="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:i="https://github.com/projektanker/icons.avalonia"
xmlns:vm="using:Needlework.Net.ViewModels.MainWindow"
xmlns:views="using:Needlework.Net.Views.MainWindow"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Needlework.Net.Views.MainWindow.MainWindowView"
x:DataType="vm:MainWindowViewModel"
@@ -132,6 +133,11 @@
<Setter Property="Margin" Value="0 0 0 8"></Setter>
</Style>
</ListBox.Styles>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"/>

View File

@@ -28,7 +28,8 @@
Padding="0"
BorderThickness="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
HorizontalContentAlignment="Stretch"
Command="{Binding DisplayCommand}">
<Border Grid.Column="0"
Background="{DynamicResource CardBackgroundFillColorDefaultBrush}"
Padding="12">