Files
BetterLyrics/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml.cs
2025-10-12 09:40:10 -04:00

263 lines
9.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Services.LiveStatesService;
using BetterLyrics.WinUI3.Services.SettingsService;
using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.WinUI;
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Input;
using System;
using Vanara.PInvoke;
using WinRT.Interop;
using WinUIEx;
using WinUIEx.Messaging;
namespace BetterLyrics.WinUI3.Views
{
public sealed partial class LyricsWindow : Window
{
private readonly ISettingsService _settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
private readonly ILiveStatesService _liveStatesService = Ioc.Default.GetRequiredService<ILiveStatesService>();
private readonly WindowMessageMonitor _wmm;
private bool _autoSelectLyricsModeOnRunning = true;
public LyricsWindow()
{
this.InitializeComponent();
AppWindow.SetIcons();
AppWindow.Changed += AppWindow_Changed;
ExtendsContentIntoTitleBar = true;
AppWindow.TitleBar.PreferredHeightOption = TitleBarHeightOption.Collapsed;
UpdateTitleBarArea();
Title = App.ResourceLoader!.GetString("LyricsPageTitle");
_wmm = new WindowMessageMonitor(this);
_wmm.WindowMessageReceived += Wmm_WindowMessageReceived;
AppWindow.Closing += AppWindow_Closing;
}
private void AppWindow_Closing(AppWindow sender, AppWindowClosingEventArgs args)
{
ViewModel.ExitOrClose();
args.Cancel = true;
}
public void UpdateTitleBarArea()
{
if (_settingsService.AppSettings.GeneralSettings.IsDragEverywhereEnabled)
{
SetTitleBar(RootGrid);
}
else
{
SetTitleBar(TopCommandGrid);
}
}
private void Wmm_WindowMessageReceived(object? sender, WindowMessageEventArgs e)
{
if (e.Message.MessageId == (uint)User32.WindowMessage.WM_HOTKEY)
{
int id = (int)e.Message.WParam;
GlobalHotKeyHelper.TryInvokeAction(id);
}
}
public LyricsWindowViewModel ViewModel { get; private set; } = Ioc.Default.GetRequiredService<LyricsWindowViewModel>();
public void AutoSelectLyricsMode(LyricsWindowMode? type = null)
{
type ??= _settingsService.AppSettings.GeneralSettings.AutoStartWindowType;
switch (type!)
{
case LyricsWindowMode.StandardMode:
ViewModel.SetStandardModeTitleBarControlsStatus();
if (_settingsService.AppSettings.StandardModeSettings.IsMaximized)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>ڴ<EFBFBD>С<EFBFBD>Ա<EFBFBD><D4B1>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>󻯺<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>ԵӰ<D4B5><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
this.Maximize();
}
else
{
AppWindow.MoveAndResize(_settingsService.AppSettings.StandardModeSettings.WindowBounds.ToRectInt32());
}
break;
case LyricsWindowMode.DockMode:
ViewModel.ToggleDockMode();
break;
case LyricsWindowMode.DesktopMode:
ViewModel.ToggleDesktopMode();
break;
case LyricsWindowMode.PictureInPictureMode:
ViewModel.TogglePictureInPictureMode();
break;
default:
break;
}
_autoSelectLyricsModeOnRunning = false;
var size = AppWindow.Size;
var rect = AppWindow.Position;
_liveStatesService.LiveStates.LyricsWindowBounds = new Windows.Foundation.Rect(rect.X, rect.Y, size.Width, size.Height);
}
private void AppWindow_Changed(AppWindow sender, AppWindowChangedEventArgs args)
{
if (_autoSelectLyricsModeOnRunning) return;
if (args.DidPositionChange || args.DidSizeChange)
{
var size = AppWindow.Size;
var rect = AppWindow.Position;
_liveStatesService.LiveStates.LyricsWindowBounds = new Windows.Foundation.Rect(rect.X, rect.Y, size.Width, size.Height);
if (rect.X < 0 && rect.Y < 0 && rect.X + size.Width < 0 && rect.Y + size.Height < 0)
{
return;
}
else
{
switch (ViewModel.LiveStates.LyricsWindowMode)
{
case LyricsWindowMode.StandardMode:
if (AppWindow.Presenter is OverlappedPresenter overlappedPresenter)
{
_settingsService.AppSettings.StandardModeSettings.WindowBounds = new Windows.Foundation.Rect(rect.X, rect.Y, size.Width, size.Height);
_settingsService.AppSettings.StandardModeSettings.IsMaximized = overlappedPresenter.State == OverlappedPresenterState.Maximized;
ViewModel.MaximiseButtonVisibility = _settingsService.AppSettings.StandardModeSettings.IsMaximized ? Visibility.Collapsed : Visibility.Visible;
ViewModel.RestoreButtonVisibility = _settingsService.AppSettings.StandardModeSettings.IsMaximized ? Visibility.Visible : Visibility.Collapsed;
}
break;
case LyricsWindowMode.DockMode:
break;
case LyricsWindowMode.DesktopMode:
_settingsService.AppSettings.DesktopModeSettings.WindowBounds = new Windows.Foundation.Rect(rect.X, rect.Y, size.Width, size.Height);
break;
case LyricsWindowMode.PictureInPictureMode:
if (AppWindow.Presenter is CompactOverlayPresenter compactOverlayPresenter)
{
_settingsService.AppSettings.PictureInPictureModeSettings.WindowPosition = new Windows.Foundation.Point(rect.X, rect.Y);
}
break;
default:
break;
}
}
}
}
private void FullScreenFlyoutItem_Click(object sender, RoutedEventArgs e)
{
ViewModel.ToggleFullscreen();
}
private void PIPFlyoutItem_Click(object sender, RoutedEventArgs e)
{
ViewModel.TogglePictureInPictureMode();
}
private void SettingsMenuFlyoutItem_Click(object sender, RoutedEventArgs e)
{
WindowHelper.OpenWindow<SettingsWindow>();
}
private void TopCommandGrid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
if (ViewModel.IsImmersiveMode)
{
ViewModel.TopCommandGridOpacity = 1f;
}
}
private void TopCommandGrid_PointerExited(object sender, PointerRoutedEventArgs e)
{
if (ViewModel.IsImmersiveMode)
{
ViewModel.TopCommandGridOpacity = 0f;
}
}
private void RootGrid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
ViewModel.IsMouseWithinWindow = true;
e.Handled = true;
}
private void RootGrid_PointerExited(object sender, PointerRoutedEventArgs e)
{
ViewModel.IsMouseWithinWindow = false;
e.Handled = true;
}
private void RootGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
}
private void ClickThroughButton_Click(object sender, RoutedEventArgs e)
{
ViewModel.ToggleLockWindow();
}
private void DockFlyoutItem_Click(object sender, RoutedEventArgs e)
{
ViewModel.ToggleDockMode();
}
private void DesktopFlyoutItem_Click(object sender, RoutedEventArgs e)
{
ViewModel.ToggleDesktopMode();
}
private void MusicGalleryMenuFlyoutItem_Click(object sender, RoutedEventArgs e)
{
WindowHelper.OpenWindow<MusicGalleryWindow>();
}
private void TipContainerCenter_Loaded(object sender, RoutedEventArgs e)
{
App.Current.LyricsWindowNotificationPanel = TipContainerCenter;
}
private void MinimiseButton_Click(object sender, RoutedEventArgs e)
{
if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.Minimize();
}
}
private void MaximiseButton_Click(object sender, RoutedEventArgs e)
{
if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.Maximize();
}
}
private void RestoreButton_Click(object sender, RoutedEventArgs e)
{
if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.Restore();
}
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
ViewModel.ExitOrClose();
}
}
}