~ruther/NosTale-PacketLogger

c61f45970d133d6973bfa51d03c9ff4ff5b4e19b — Rutherther 2 years ago a0c91cb
fix: make sender title change correctly
M src/PacketLogger/Models/Packets/DummyPacketProvider.cs => src/PacketLogger/Models/Packets/DummyPacketProvider.cs +3 -0
@@ 58,6 58,9 @@ public class DummyPacketProvider : IPacketProvider, IDisposable
    }

    /// <inheritdoc />
    public bool Closed => false;

    /// <inheritdoc />
    public string Name { get; }

    /// <inheritdoc />

M src/PacketLogger/Models/Packets/FilePacketProvider.cs => src/PacketLogger/Models/Packets/FilePacketProvider.cs +3 -0
@@ 45,6 45,9 @@ public class FilePacketProvider : IPacketProvider
    public string DocumentTitle { get; set; } = string.Empty;

    /// <inheritdoc />
    public bool Closed => false;

    /// <inheritdoc />
    public string Name => Path.GetFileName(_fileName);

    /// <inheritdoc />

M src/PacketLogger/Models/Packets/IPacketProvider.cs => src/PacketLogger/Models/Packets/IPacketProvider.cs +5 -0
@@ 23,6 23,11 @@ namespace PacketLogger.Models.Packets;
public interface IPacketProvider : INotifyPropertyChanged, IDisposable
{
    /// <summary>
    /// Gets whether the connection is closed.
    /// </summary>
    public bool Closed { get; }

    /// <summary>
    /// Gets the name.
    /// </summary>
    public string Name { get; }

M src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs => src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs +29 -29
@@ 18,7 18,7 @@ namespace PacketLogger.Models.Titles;
/// </summary>
public class NumberedTitleGenerator
{
    private readonly SemaphoreSlim _semaphore;
    private readonly object _lock = new object();
    private readonly ConcurrentDictionary<string, List<Title>> _titles;

    /// <summary>


@@ 26,7 26,6 @@ public class NumberedTitleGenerator
    /// </summary>
    public NumberedTitleGenerator()
    {
        _semaphore = new SemaphoreSlim(1, 1);
        _titles = new ConcurrentDictionary<string, List<Title>>();
    }



@@ 76,33 75,34 @@ public class NumberedTitleGenerator

    private void HandleTitleChange(Title title, string newTitle)
    {
        _semaphore.Wait();
        _titles.AddOrUpdate
        (
            title.CurrentTitle,
            _ => new List<Title>(),
            (_, u) =>
            {
                u.Remove(title);
                return u;
            }
        );
        UpdateNumbers(title.CurrentTitle);

        title.CurrentTitle = newTitle;
        _titles.TryAdd(newTitle, new List<Title>());
        _titles.AddOrUpdate
        (
            newTitle,
            _ => new List<Title>(),
            (_, u) =>
            {
                u.Add(title);
                return u;
            }
        );
        UpdateNumbers(title.CurrentTitle);
        _semaphore.Release();
        lock (_lock)
        {
            _titles.AddOrUpdate
            (
                title.CurrentTitle,
                _ => new List<Title>(),
                (_, u) =>
                {
                    u.Remove(title);
                    return u;
                }
            );
            UpdateNumbers(title.CurrentTitle);

            title.CurrentTitle = newTitle;
            _titles.TryAdd(newTitle, new List<Title>());
            _titles.AddOrUpdate
            (
                newTitle,
                _ => new List<Title>(),
                (_, u) =>
                {
                    u.Add(title);
                    return u;
                }
            );
            UpdateNumbers(title.CurrentTitle);
        }
    }

    private void UpdateNumbers(string title)

M src/PacketLogger/ViewModels/DocumentViewModel.cs => src/PacketLogger/ViewModels/DocumentViewModel.cs +5 -2
@@ 313,14 313,17 @@ public class DocumentViewModel : Document, INotifyPropertyChanged, IDisposable
            {
                Loading = true;
                NestedViewModel = new PacketSenderViewModel(provider);
                _cleanUp?.Dispose();
                _cleanUp = null;

                _titleHandle?.Dispose();
                _titleHandle = titleGenerator.AddTitle
                (
                    title => Title = title,
                    provider
                        .WhenAnyValue(x => x.DocumentTitle)
                        .WhenValueChanged(x => x.DocumentTitle)
                        .ObserveOn(RxApp.MainThreadScheduler)
                        .Select(x => $"Sender - {provider.DocumentTitle}"),
                        .Select(x => "Sender - " + x),
                    provider.Name
                );
                Loaded = true;

Do not follow this link