using System; using System.ComponentModel; using OwlCore.AbstractUI.Models; using StrixMusic.Cores.OneDrive.Services; using StrixMusic.Sdk.AppModels; using StrixMusic.Sdk.Services; namespace StrixMusic.Cores.OneDrive.ConfigPanels { /// /// An of generic configuration options. /// internal sealed class GeneralCoreConfigPanel : AbstractUICollection, IDisposable { private readonly OneDriveCoreSettings _settings; private readonly INotificationService? _notificationService; private Notification? _scannerRequiredNotification; /// /// Creates a new instance of . /// internal GeneralCoreConfigPanel(OneDriveCoreSettings settings, INotificationService? notificationService = null) : base(nameof(GeneralCoreConfigPanel)) { Title = "OneDrive settings"; _settings = settings; _notificationService = notificationService; UseTagLibScannerToggle = new AbstractBoolean("useTagLibScannerToggle", "Use TagLib") { Subtitle = "TagLib is more accurate and supports more formats, but is slower (not recommended).", State = settings.ScanWithTagLib, }; UseFilePropsScannerToggle = new AbstractBoolean("useFilePropsScannerToggle", "Use file properties") { Subtitle = "File properties are very fast, but provide less data.", State = settings.ScanWithFileProperties, }; var metadataScanType = new AbstractUICollection("metadataScanType") { UseTagLibScannerToggle, UseFilePropsScannerToggle, }; metadataScanType.Title = "Scanner type"; metadataScanType.Subtitle = "Requires restart."; Add(metadataScanType); AttachEvents(); } private void AttachEvents() { _settings.PropertyChanged += OnSettingChanged; UseTagLibScannerToggle.StateChanged += OnUseTagLibScannerToggleChanged; UseFilePropsScannerToggle.StateChanged += OnUseFilePropsScannerToggleChanged; } private void DetachEvents() { _settings.PropertyChanged -= OnSettingChanged; UseTagLibScannerToggle.StateChanged -= OnUseTagLibScannerToggleChanged; UseFilePropsScannerToggle.StateChanged -= OnUseFilePropsScannerToggleChanged; } private async void OnSettingChanged(object sender, PropertyChangedEventArgs e) { var isFilePropToggle = e.PropertyName == nameof(OneDriveCoreSettings.ScanWithFileProperties); var isTagLibToggle = e.PropertyName == nameof(OneDriveCoreSettings.ScanWithTagLib); if (!_settings.ScanWithFileProperties && !_settings.ScanWithTagLib) { _scannerRequiredNotification?.Dismiss(); _scannerRequiredNotification = _notificationService?.RaiseNotification("Whoops", "At least one metadata scanner is required."); if (isFilePropToggle) _settings.ScanWithFileProperties = true; if (isTagLibToggle) _settings.ScanWithTagLib = true; return; } // AbstractUI doesn't set state if already the same, preventing an execution loop here. if (isFilePropToggle) UseFilePropsScannerToggle.State = _settings.ScanWithFileProperties; if (isTagLibToggle) UseTagLibScannerToggle.State = _settings.ScanWithTagLib; await _settings.SaveAsync(); } private void OnUseFilePropsScannerToggleChanged(object sender, bool e) => _settings.ScanWithFileProperties = e; private void OnUseTagLibScannerToggleChanged(object sender, bool e) => _settings.ScanWithTagLib = e; /// /// A toggle that indicates if TagLibSharp should be used to read metadata from audio files. /// public AbstractBoolean UseTagLibScannerToggle { get; } /// /// A toggle that indicates if file properties should be used to read metadata from audio files. /// public AbstractBoolean UseFilePropsScannerToggle { get; } /// public void Dispose() => DetachEvents(); } }