diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest index a6327c8..26c7e99 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.0.22.0" /> diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs index 5b5ffc1..3c3fe47 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/ForegroundWindowWatcher.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using CommunityToolkit.WinUI; using Microsoft.UI.Xaml; using Vanara.PInvoke; using Windows.System; @@ -16,6 +17,7 @@ namespace BetterLyrics.WinUI3.Helper private readonly List _hooks = new(); private HWND _currentForeground = HWND.NULL; private readonly IntPtr _selfHwnd; + private readonly ThrottleHelper _winEventProcThrottle = new(TimeSpan.FromSeconds(1)); public delegate void WindowChangedHandler(HWND hwnd); private readonly WindowChangedHandler _onWindowChanged; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs index 8e36042..fdf39a8 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SystemVolumeHelper.cs @@ -63,7 +63,7 @@ namespace BetterLyrics.WinUI3.Helper { var data = pNotify.ToStructure(); _masterVolume = (int)(data.fMasterVolume * 100); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { VolumeChanged?.Invoke(_masterVolume); }); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs index a276d50..ffd1d84 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LibWatcherService.cs @@ -6,18 +6,17 @@ using System.IO; using System.Linq; using BetterLyrics.WinUI3.Events; using BetterLyrics.WinUI3.Models; +using BetterLyrics.WinUI3.ViewModels; +using Microsoft.UI.Dispatching; namespace BetterLyrics.WinUI3.Services { - public class LibWatcherService : IDisposable, ILibWatcherService + public class LibWatcherService : BaseViewModel, IDisposable, ILibWatcherService { - private readonly ISettingsService _settingsService; - private readonly Dictionary _watchers = []; - public LibWatcherService(ISettingsService settingsService) + public LibWatcherService(ISettingsService settingsService) : base(settingsService) { - _settingsService = settingsService; UpdateWatchers(_settingsService.LocalMediaFolders); } @@ -69,14 +68,13 @@ namespace BetterLyrics.WinUI3.Services private void OnChanged(string folder, FileSystemEventArgs e) { - App.DispatcherQueue!.TryEnqueue(() => - { - MusicLibraryFilesChanged?.Invoke( - this, - new LibChangedEventArgs(folder, e.FullPath, e.ChangeType) - ); - } - ); + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => + { + MusicLibraryFilesChanged?.Invoke( + this, + new LibChangedEventArgs(folder, e.FullPath, e.ChangeType) + ); + }); } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs index d2768c6..07dbcdf 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/PlaybackService.cs @@ -110,8 +110,8 @@ namespace BetterLyrics.WinUI3.Services { if (!IsMediaSourceEnabled(mediaSession.ControlSession.SourceAppUserModelId) || mediaSession != _mediaManager.GetFocusedSession()) return; - _dispatcherQueue.TryEnqueue(() => - { + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => + { PositionChanged?.Invoke(this, new PositionChangedEventArgs(timelineProperties.Position)); } ); @@ -128,8 +128,8 @@ namespace BetterLyrics.WinUI3.Services _ => false, }; - _dispatcherQueue.TryEnqueue(() => - { + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => + { IsPlayingChanged?.Invoke(this, new IsPlayingChangedEventArgs(_cachedIsPlaying)); } ); @@ -184,7 +184,7 @@ namespace BetterLyrics.WinUI3.Services if (!token.IsCancellationRequested) { - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { SongInfoChanged?.Invoke(this, new SongInfoChangedEventArgs(_cachedSongInfo)); }); @@ -215,7 +215,7 @@ namespace BetterLyrics.WinUI3.Services { _mediaSourceProvidersInfo.Add(new MediaSourceProviderInfo(id, true)); _settingsService.MediaSourceProvidersInfo = _mediaSourceProvidersInfo; - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { MediaSourceProvidersInfoChanged?.Invoke(this, new MediaSourceProvidersInfoEventArgs(_mediaSourceProvidersInfo)); }); @@ -224,7 +224,7 @@ namespace BetterLyrics.WinUI3.Services private void SendNullMessages() { - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { _cachedSongInfo = null; _cachedIsPlaying = false; @@ -270,7 +270,7 @@ namespace BetterLyrics.WinUI3.Services var _albumArtAccentColor = ImageHelper.GetAccentColorsFromByte(bytes).FirstOrDefault(); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { AlbumArtChangedChanged?.Invoke(this, new AlbumArtChangedEventArgs(_albumArtSwBitmap, _albumArtAccentColor)); }); @@ -287,7 +287,7 @@ namespace BetterLyrics.WinUI3.Services catch (Exception) { _logger.LogError("Failed to start SSE connection for LX Music."); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { App.Current.LyricsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("FailToStartLXMusicServer"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Error); }); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs index ef88d7d..1ed8e35 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/TranslateService.cs @@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Serialization; using BetterLyrics.WinUI3.ViewModels; using Lyricify.Lyrics.Helpers.General; +using Microsoft.UI.Dispatching; using System; using System.Collections.Generic; using System.Linq; @@ -46,7 +47,7 @@ namespace BetterLyrics.WinUI3.Services if (string.IsNullOrEmpty(_settingsService.LibreTranslateServer)) { - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { App.Current.LyricsWindowNotificationPanel?.Notify( App.ResourceLoader!.GetString("TranslateServerNotSet"), diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs index b7eaa56..0c7d2a7 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs @@ -260,7 +260,7 @@ namespace BetterLyrics.WinUI3.ViewModels { if (_timelineThrottle.CanTrigger()) { - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { TimelinePositionSeconds = message.NewValue.TotalSeconds; }); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs index 33d96ce..cfc8c3a 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs @@ -91,20 +91,23 @@ namespace BetterLyrics.WinUI3.ViewModels { _isDockMode = message.NewValue; UpdateColorConfig(); + UpdateImmersiveBackgroundOpacity(); } else if (message.PropertyName == nameof(LyricsWindowViewModel.IsDesktopMode)) { _isDesktopMode = message.NewValue; UpdateColorConfig(); + UpdateImmersiveBackgroundOpacity(); } else if (message.PropertyName == nameof(LyricsWindowViewModel.IsLyricsWindowLocked)) { _isLyricsWindowLocked = message.NewValue; + UpdateImmersiveBackgroundOpacity(); } else if (message.PropertyName == nameof(LyricsWindowViewModel.IsMouseWithinWindow)) { _isMouseWithinWindow = message.NewValue; - _immersiveBgOpacityTransition.StartTransition(_isDesktopMode ? (_isMouseWithinWindow ? 1f : 0f) : 1f); + UpdateImmersiveBackgroundOpacity(); } } else if (message.Sender is LyricsPageViewModel) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs index 7e904e0..82d1da2 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Update.cs @@ -411,5 +411,33 @@ namespace BetterLyrics.WinUI3.ViewModels line.HighlightOpacityTransition.Update(_elapsedTime); } } + + private void UpdateImmersiveBackgroundOpacity() + { + float targetOpacity; + if (_isDesktopMode) + { + if (_isLyricsWindowLocked) + { + targetOpacity = 0; + } + else + { + if (_isMouseWithinWindow) + { + targetOpacity = 1f; + } + else + { + targetOpacity = 0f; + } + } + } + else + { + targetOpacity = 1f; + } + _immersiveBgOpacityTransition.StartTransition(targetOpacity); + } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs index de755dd..ab9a549 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsWindowViewModel.cs @@ -11,6 +11,7 @@ using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using CommunityToolkit.WinUI; using Microsoft.UI; using Microsoft.UI.Windowing; using Microsoft.UI.Xaml; @@ -231,11 +232,14 @@ namespace BetterLyrics.WinUI3 hwnd, onWindowChanged => { - if (_ignoreFullscreenWindow && window.AppWindow.Presenter is OverlappedPresenter presenter) + _dispatcherQueueTimer.Debounce(() => { - presenter.IsAlwaysOnTop = true; - } - UpdateAccentColor(hwnd); + if (_ignoreFullscreenWindow && window.AppWindow.Presenter is OverlappedPresenter presenter) + { + presenter.IsAlwaysOnTop = true; + } + UpdateAccentColor(hwnd); + }, TimeSpan.FromMilliseconds(300)); } ); _windowWatcher.Start(); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs index e30ea43..6c4c064 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs @@ -5,6 +5,7 @@ using BetterLyrics.WinUI3.Services; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml.Controls; using System; using System.Collections.Generic; @@ -94,7 +95,7 @@ namespace BetterLyrics.WinUI3.ViewModels foreach (var file in Directory.GetFiles(folder.Path, $"*.*", SearchOption.AllDirectories)) { Track track = new(file); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { Tracks.Add(track); }); @@ -102,7 +103,7 @@ namespace BetterLyrics.WinUI3.ViewModels } } - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { IsDataLoading = false; }); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs index 7510daa..386ffbe 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs @@ -7,6 +7,7 @@ using BetterLyrics.WinUI3.Services; using BetterLyrics.WinUI3.Views; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System; @@ -16,7 +17,6 @@ using System.Linq; using System.Threading.Tasks; using Windows.ApplicationModel; using Windows.Globalization; -using Windows.System; using Windows.UI; using WinRT.Interop; using MetadataHelper = BetterLyrics.WinUI3.Helper.MetadataHelper; @@ -411,13 +411,13 @@ namespace BetterLyrics.WinUI3.ViewModels [RelayCommand] private async Task LaunchProjectGitHubPageAsync() { - await Launcher.LaunchUriAsync(new Uri(MetadataHelper.GithubUrl)); + await Windows.System.Launcher.LaunchUriAsync(new Uri(MetadataHelper.GithubUrl)); } [RelayCommand] private static async Task OpenCacheFolderAsync() { - await Launcher.LaunchFolderPathAsync(PathHelper.CacheFolder); + await Windows.System.Launcher.LaunchFolderPathAsync(PathHelper.CacheFolder); } [RelayCommand] @@ -456,7 +456,7 @@ namespace BetterLyrics.WinUI3.ViewModels { string targetLangCode = LanguageHelper.SupportedTargetLanguages[SelectedTargetLanguageIndex].Code; string result = await _libreTranslateService.TranslateTextAsync("Hello, world!", targetLangCode, null); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { App.Current.SettingsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("SettingsPageServerTestSuccessInfo"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Success); IsLibreTranslateServerTesting = false; @@ -464,7 +464,7 @@ namespace BetterLyrics.WinUI3.ViewModels } catch (Exception) { - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { App.Current.SettingsWindowNotificationPanel?.Notify(App.ResourceLoader!.GetString("SettingsPageServerTestFailedInfo"), Microsoft.UI.Xaml.Controls.InfoBarSeverity.Error); IsLibreTranslateServerTesting = false; @@ -480,7 +480,7 @@ namespace BetterLyrics.WinUI3.ViewModels Task.Run(async () => { bool testResult = await NetHelper.CheckConnectivity($"{LXMusicServer}/status"); - _dispatcherQueue.TryEnqueue(() => + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => { App.Current.SettingsWindowNotificationPanel?.Notify( App.ResourceLoader!.GetString($"SettingsPageServerTest{(testResult ? "Success" : "Failed")}Info"), diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs index a433bd6..df4d5d8 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SystemTrayViewModel.cs @@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.UI.Xaml; namespace BetterLyrics.WinUI3.ViewModels { @@ -39,7 +40,7 @@ namespace BetterLyrics.WinUI3.ViewModels { DockModeHelper.Disable(lyricsWindow); } - App.Current.Exit(); + Application.Current.Exit(); } [RelayCommand] diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml index a0c7cdc..a86a458 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml @@ -26,6 +26,7 @@ diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs index f0c5086..28b3427 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs @@ -270,7 +270,7 @@ namespace BetterLyrics.WinUI3.Views private void CloseButton_Click(object sender, RoutedEventArgs e) { DockModeHelper.Disable(this); - App.Current.Exit(); + Application.Current.Exit(); } private void MaximiseButton_Click(object sender, RoutedEventArgs e)