From 755010240623b1a1c05f212188e1dd0c223ecdfd Mon Sep 17 00:00:00 2001 From: BlossomiShymae <87099578+BlossomiShymae@users.noreply.github.com> Date: Sat, 17 Aug 2024 16:15:06 -0500 Subject: [PATCH 1/3] Fix bug where body template can be incorrect, resolves #5 --- .../ViewModels/OperationViewModel.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Needlework.Net.Desktop/ViewModels/OperationViewModel.cs b/Needlework.Net.Desktop/ViewModels/OperationViewModel.cs index 0d298a6..f755392 100644 --- a/Needlework.Net.Desktop/ViewModels/OperationViewModel.cs +++ b/Needlework.Net.Desktop/ViewModels/OperationViewModel.cs @@ -73,11 +73,20 @@ namespace Needlework.Net.Desktop.ViewModels { var type = template[i]; if (!type.Contains("#")) continue; - if (requestClasses.Where(c => c.Id == type.Replace("#", string.Empty)).Any()) + + var foundClass = requestClasses.Where(c => c.Id == type.Replace("#", string.Empty)); + if (foundClass.Any()) { - AvaloniaList classes = [.. requestClasses]; - classes.Remove(rootClass); - template[i] = string.Join(string.Empty, CreateTemplate(classes)); + if (foundClass.First().PropertyEnums.Any()) + { + template[i] = string.Join(string.Empty, CreateTemplate([.. foundClass])); + } + else + { + AvaloniaList classes = [.. requestClasses]; + classes.Remove(rootClass); + template[i] = string.Join(string.Empty, CreateTemplate(classes)); + } } else { From 79fd79c01dd77004b96cc87d835a23072f1fd953 Mon Sep 17 00:00:00 2001 From: BlossomiShymae <87099578+BlossomiShymae@users.noreply.github.com> Date: Sat, 17 Aug 2024 16:25:37 -0500 Subject: [PATCH 2/3] Fix bug where event viewer may crash from a race condition, resolves #4 --- .../ViewModels/WebsocketViewModel.cs | 37 ++++++++++++------- .../Views/WebsocketView.axaml.cs | 29 +++++++++++++-- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/Needlework.Net.Desktop/ViewModels/WebsocketViewModel.cs b/Needlework.Net.Desktop/ViewModels/WebsocketViewModel.cs index 71d5548..69a162b 100644 --- a/Needlework.Net.Desktop/ViewModels/WebsocketViewModel.cs +++ b/Needlework.Net.Desktop/ViewModels/WebsocketViewModel.cs @@ -18,6 +18,8 @@ namespace Needlework.Net.Desktop.ViewModels public partial class WebsocketViewModel : PageBase { public ObservableCollection EventLog { get; } = []; + public SemaphoreSlim EventLogLock { get; } = new(1, 1); + [NotifyPropertyChangedFor(nameof(FilteredEventLog))] [ObservableProperty] private string _search = string.Empty; [ObservableProperty] private bool _isAttach = true; @@ -94,25 +96,34 @@ namespace Needlework.Net.Desktop.ViewModels private void OnMessage(EventMessage message) { - Avalonia.Threading.Dispatcher.UIThread.Invoke(() => + Avalonia.Threading.Dispatcher.UIThread.Invoke(async () => { if (!IsAttach) return; var line = $"{DateTime.Now:HH:mm:ss.fff} {message.Data?.EventType.ToUpper()} {message.Data?.Uri}"; Trace.WriteLine($"Message: {line}"); - if (EventLog.Count < 1000) - { - EventLog.Add(line); - _events[line] = message; - } - else - { - var key = EventLog[0]; - EventLog.RemoveAt(0); - _events.Remove(key); - EventLog.Add(line); - _events[line] = message; + await EventLogLock.WaitAsync(); + try + { + if (EventLog.Count < 1000) + { + EventLog.Add(line); + _events[line] = message; + } + else + { + var key = EventLog[0]; + EventLog.RemoveAt(0); + _events.Remove(key); + + EventLog.Add(line); + _events[line] = message; + } + } + finally + { + EventLogLock.Release(); } }); } diff --git a/Needlework.Net.Desktop/Views/WebsocketView.axaml.cs b/Needlework.Net.Desktop/Views/WebsocketView.axaml.cs index c751251..af1ec95 100644 --- a/Needlework.Net.Desktop/Views/WebsocketView.axaml.cs +++ b/Needlework.Net.Desktop/Views/WebsocketView.axaml.cs @@ -7,6 +7,7 @@ using CommunityToolkit.Mvvm.Messaging; using Needlework.Net.Desktop.Extensions; using Needlework.Net.Desktop.Messages; using Needlework.Net.Desktop.ViewModels; +using System; using TextMateSharp.Grammars; namespace Needlework.Net.Desktop.Views; @@ -14,6 +15,8 @@ namespace Needlework.Net.Desktop.Views; public partial class WebsocketView : UserControl, IRecipient { private TextEditor? _responseEditor; + public WebsocketViewModel? _viewModel; + private ListBox? _viewer; public WebsocketView() { @@ -29,9 +32,9 @@ public partial class WebsocketView : UserControl, IRecipient("EventViewer"); - vm.EventLog.CollectionChanged += (s, e) => { if (vm.IsTail) viewer!.ScrollIntoView(vm.EventLog.Count - 1); }; + _viewModel = (WebsocketViewModel)DataContext!; + _viewer = this.FindControl("EventViewer"); + _viewModel.EventLog.CollectionChanged += EventLog_CollectionChanged; ; _responseEditor = this.FindControl("ResponseEditor"); _responseEditor?.ApplyJsonEditorSettings(); @@ -41,6 +44,26 @@ public partial class WebsocketView : UserControl, IRecipient + { + if (_viewModel!.IsTail) + { + await _viewModel.EventLogLock.WaitAsync(); + try + { + _viewer!.ScrollIntoView(_viewModel.EventLog.Count - 1); + } + catch (InvalidOperationException) { } + finally + { + _viewModel.EventLogLock.Release(); + } + } + }); + } + private void OnBaseThemeChanged(ThemeVariant currentTheme) { From 88149d1458a0ec53cd4a9e0693dc8e0518a157f1 Mon Sep 17 00:00:00 2001 From: BlossomiShymae <87099578+BlossomiShymae@users.noreply.github.com> Date: Sat, 17 Aug 2024 16:26:52 -0500 Subject: [PATCH 3/3] Bump version --- Needlework.Net.Desktop/Needlework.Net.Desktop.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Needlework.Net.Desktop/Needlework.Net.Desktop.csproj b/Needlework.Net.Desktop/Needlework.Net.Desktop.csproj index 07b15b0..81a673b 100644 --- a/Needlework.Net.Desktop/Needlework.Net.Desktop.csproj +++ b/Needlework.Net.Desktop/Needlework.Net.Desktop.csproj @@ -11,7 +11,7 @@ False app.ico NeedleworkDotNet - 0.5.0.0 + 0.5.1.0 $(AssemblyVersion) False