< Summary

Information
Class: Chronicis.Client.Services.QuestDrawerService
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/QuestDrawerService.cs
Line coverage
100%
Covered lines: 37
Uncovered lines: 0
Coverable lines: 37
Total lines: 92
Line coverage: 100%
Branch coverage
96%
Covered branches: 27
Total branches: 28
Branch coverage: 96.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_IsOpen()100%11100%
.ctor(...)100%11100%
Open()100%88100%
Close()100%66100%
Toggle()100%44100%
OnMetadataDrawerToggled()87.5%88100%
Dispose()100%22100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/QuestDrawerService.cs

#LineLine coverage
 1namespace Chronicis.Client.Services;
 2
 3/// <summary>
 4/// Service for coordinating quest drawer toggle events and mutual exclusivity with metadata drawer.
 5/// Ensures only one drawer is open at a time.
 6/// Implements IDisposable to properly clean up event subscriptions.
 7/// </summary>
 8public class QuestDrawerService : IQuestDrawerService, IDisposable
 9{
 10    private readonly IMetadataDrawerService _metadataDrawerService;
 11    private bool _isOpen;
 12    private bool _isProcessingMutualExclusivity;
 13    private bool _disposed;
 14
 15    public event Action? OnOpen;
 16    public event Action? OnClose;
 17
 1218    public bool IsOpen => _isOpen;
 19
 1620    public QuestDrawerService(IMetadataDrawerService metadataDrawerService)
 21    {
 1622        _metadataDrawerService = metadataDrawerService;
 23
 24        // Subscribe to metadata drawer toggle to ensure mutual exclusivity
 1625        _metadataDrawerService.OnToggle += OnMetadataDrawerToggled;
 1626    }
 27
 28    public void Open()
 29    {
 1330        if (_disposed || _isOpen || _isProcessingMutualExclusivity)
 331            return;
 32
 1033        _isProcessingMutualExclusivity = true;
 34        try
 35        {
 1036            _isOpen = true;
 1037            OnOpen?.Invoke();
 238        }
 39        finally
 40        {
 1041            _isProcessingMutualExclusivity = false;
 1042        }
 1043    }
 44
 45    public void Close()
 46    {
 647        if (_disposed || !_isOpen)
 348            return;
 49
 350        _isOpen = false;
 351        OnClose?.Invoke();
 152    }
 53
 54    public void Toggle()
 55    {
 656        if (_disposed)
 157            return;
 58
 559        if (_isOpen)
 260            Close();
 61        else
 362            Open();
 363    }
 64
 65    private void OnMetadataDrawerToggled()
 66    {
 67        // If metadata drawer is toggled while quest drawer is open, close quest drawer
 68        // to ensure mutual exclusivity
 269        if (_isOpen && !_isProcessingMutualExclusivity && !_disposed)
 70        {
 171            _isOpen = false;
 172            OnClose?.Invoke();
 73        }
 274    }
 75
 76    public void Dispose()
 77    {
 2478        if (_disposed)
 879            return;
 80
 1681        _disposed = true;
 82
 83        // Unsubscribe from metadata drawer events to prevent memory leaks
 1684        _metadataDrawerService.OnToggle -= OnMetadataDrawerToggled;
 85
 86        // Clear event handlers
 1687        OnOpen = null;
 1688        OnClose = null;
 89
 1690        GC.SuppressFinalize(this);
 1691    }
 92}