mirror of
https://github.com/jayfunc/BetterLyrics.git
synced 2026-01-13 03:34:55 +08:00
Compare commits
45 Commits
v1.1.175.0
...
v1.1.190.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa7d56f1cb | ||
|
|
8dbe76e790 | ||
|
|
de6410492e | ||
|
|
26df7c7f67 | ||
|
|
3c411374bd | ||
|
|
99f0b9443b | ||
|
|
a3bc148816 | ||
|
|
cea757702b | ||
|
|
8938a5c798 | ||
|
|
46f4589b64 | ||
|
|
adb02658f4 | ||
|
|
3d7e6061e9 | ||
|
|
a51220c7b9 | ||
|
|
22b813e687 | ||
|
|
fda94d5020 | ||
|
|
205cbe8fb6 | ||
|
|
816f7064db | ||
|
|
132c5267b0 | ||
|
|
4e866818df | ||
|
|
9b7b56a0ee | ||
|
|
66f2da0e4c | ||
|
|
1735c6a7e6 | ||
|
|
8c06c98068 | ||
|
|
e2ac4c166c | ||
|
|
728397cafa | ||
|
|
059787a28f | ||
|
|
4c4231b48c | ||
|
|
2412927b29 | ||
|
|
f3bdbba83e | ||
|
|
4c811b12ca | ||
|
|
933103c57f | ||
|
|
718e7bdad3 | ||
|
|
42284b4f45 | ||
|
|
7da8af7c2a | ||
|
|
a4fc457065 | ||
|
|
d3c2ee592c | ||
|
|
2eef88523c | ||
|
|
220b1063ac | ||
|
|
28bcd8ddfc | ||
|
|
5750bd3ad7 | ||
|
|
1667c701b0 | ||
|
|
160398f7ab | ||
|
|
c25ddf770f | ||
|
|
44fa3312b2 | ||
|
|
81f3d1f6bf |
291
.devin/wiki.json
Normal file
291
.devin/wiki.json
Normal file
@@ -0,0 +1,291 @@
|
||||
{
|
||||
"repo_notes": [
|
||||
{
|
||||
"content": "Always use the latest files in the repo to generate the wiki"
|
||||
}
|
||||
],
|
||||
"pages": [
|
||||
{
|
||||
"title": "Overview",
|
||||
"purpose": "Introduce BetterLyrics, its purpose as a WinUI3 lyrics display application, key features, and supported music players",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Getting Started",
|
||||
"purpose": "Guide users through installation, initial setup, and basic usage of BetterLyrics",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Installation and Deployment",
|
||||
"purpose": "Explain how to install BetterLyrics from Microsoft Store or build from source, system requirements, and supported Windows versions",
|
||||
"parent": "Getting Started",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Initial Configuration",
|
||||
"purpose": "Walk through first-time setup including media player configuration, folder selection, and basic settings",
|
||||
"parent": "Getting Started",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Architecture",
|
||||
"purpose": "Provide technical overview of BetterLyrics' internal architecture, design patterns, and component organization",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Application Entry Point and Dependency Injection",
|
||||
"purpose": "Document the App.xaml.cs entry point, service registration, and dependency injection container configuration",
|
||||
"parent": "Architecture",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Service Layer Architecture",
|
||||
"purpose": "Explain the service-oriented architecture, service interfaces, and their implementations including MediaSessionsService, LyricsSearchService, and SettingsService",
|
||||
"parent": "Architecture",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Data Models",
|
||||
"purpose": "Document core data models including LyricsLine, LyricsData, SongInfo, and configuration models",
|
||||
"parent": "Architecture",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Multi-Window System",
|
||||
"purpose": "Explain how BetterLyrics manages multiple simultaneous lyrics windows, window lifecycle, and state management",
|
||||
"parent": "Architecture",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "User Interface",
|
||||
"purpose": "Document the UI components, windows, and user interaction patterns in BetterLyrics",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Now Playing Window",
|
||||
"purpose": "Detail the main lyrics display window, its components, and integration with the rendering system",
|
||||
"parent": "User Interface",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Display Modes and Window Configurations",
|
||||
"purpose": "Explain different display modes (Standard, Desktop, Docked, Fullscreen, Narrow, Taskbar) and how to configure them",
|
||||
"parent": "User Interface",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Settings and Customization",
|
||||
"purpose": "Document the settings interface, configuration options, and how to customize lyrics appearance and behavior",
|
||||
"parent": "User Interface",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Music Gallery",
|
||||
"purpose": "Explain the local music library management feature, including playback, playlist management, and integration with media controls",
|
||||
"parent": "User Interface",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "System Tray and Global Controls",
|
||||
"purpose": "Document the system tray integration, global hotkeys, and application-wide controls",
|
||||
"parent": "User Interface",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Lyrics System",
|
||||
"purpose": "Comprehensive documentation of the lyrics acquisition, processing, and display pipeline",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Lyrics Search and Providers",
|
||||
"purpose": "Document the lyrics search system, supported providers (QQ Music, Netease, Kugou, LrcLib, Apple Music, local files), and search strategies",
|
||||
"parent": "Lyrics System",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Parsing and Translation",
|
||||
"purpose": "Explain how lyrics are parsed from different formats (LRC, QRC, TTML), translation system using LibreTranslate, and metadata matching",
|
||||
"parent": "Lyrics System",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Rendering Pipeline",
|
||||
"purpose": "Document the Win2D-based rendering system, LyricsCanvas, PlayingLineRenderer, UnplayingLineRenderer, and LyricsLayoutManager",
|
||||
"parent": "Lyrics System",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Visual Effects and Animation",
|
||||
"purpose": "Explain character-level effects (glow, float, scale), background effects (fluid, snow, fog, spectrum), and the animation transition system",
|
||||
"parent": "Lyrics System",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Media Integration",
|
||||
"purpose": "Document how BetterLyrics integrates with music players and manages media sessions",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Windows Media Transport Controls Integration",
|
||||
"purpose": "Explain how BetterLyrics uses Windows SMTC to work universally with media players",
|
||||
"parent": "Media Integration",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Supported Players and Special Configurations",
|
||||
"purpose": "List supported media players, document special configurations (Apple Music token, LX Music SSE), and player-specific handling",
|
||||
"parent": "Media Integration",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Album Art and Theme Colors",
|
||||
"purpose": "Document album art retrieval from multiple sources, color palette generation (MedianCut, OctTree), and adaptive theming",
|
||||
"parent": "Media Integration",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Internationalization",
|
||||
"purpose": "Explain the localization system, supported languages, and how resources are managed",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Development",
|
||||
"purpose": "Technical documentation for developers contributing to or extending BetterLyrics",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Build Configuration and Deployment",
|
||||
"purpose": "Document the build process, publish profiles for different architectures, CI/CD pipeline, and packaging for Microsoft Store",
|
||||
"parent": "Development",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Helper Utilities and Extensions",
|
||||
"purpose": "Document utility classes including TaskbarHook, WindowHook, ColorHelper, ImageHelper, and various extension methods",
|
||||
"parent": "Development",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "External Dependencies and Libraries",
|
||||
"purpose": "List and explain third-party dependencies including Win2D, NAudio, ATL.NET, FlaUI, and their usage in the application",
|
||||
"parent": "Development",
|
||||
"page_notes": [
|
||||
{
|
||||
"content": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
<Identity
|
||||
Name="37412.BetterLyrics"
|
||||
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
|
||||
Version="1.1.175.0" />
|
||||
Version="1.1.190.0" />
|
||||
|
||||
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||
|
||||
|
||||
@@ -69,25 +69,25 @@
|
||||
<PackageReference Include="ComputeSharp.D2D1.WinUI" Version="3.2.0" />
|
||||
<PackageReference Include="csharp-kana" Version="1.0.2" />
|
||||
<PackageReference Include="csharp-pinyin" Version="1.0.1" />
|
||||
<PackageReference Include="DevWinUI.Controls" Version="9.7.0" />
|
||||
<PackageReference Include="Dubya.WindowsMediaController" Version="2.5.5" />
|
||||
<PackageReference Include="DevWinUI.Controls" Version="9.7.1" />
|
||||
<PackageReference Include="Dubya.WindowsMediaController" Version="2.5.6" />
|
||||
<PackageReference Include="F23.StringSimilarity" Version="7.0.1" />
|
||||
<PackageReference Include="FlaUI.UIA3" Version="5.0.0" />
|
||||
<PackageReference Include="H.NotifyIcon.WinUI" Version="2.4.1" />
|
||||
<PackageReference Include="Hqub.Last.fm" Version="2.5.1" />
|
||||
<PackageReference Include="Interop.UIAutomationClient" Version="10.19041.0" />
|
||||
<PackageReference Include="Lyricify.Lyrics.Helper-NativeAot" Version="0.1.4-alpha.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.Graphics.Win2D" Version="1.3.2" />
|
||||
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" />
|
||||
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
|
||||
<PackageReference Include="NAudio.Wasapi" Version="2.2.1" />
|
||||
<PackageReference Include="Nito.AsyncEx" Version="5.1.2" />
|
||||
<PackageReference Include="Nito.AsyncEx.Tasks" Version="5.1.2" />
|
||||
<PackageReference Include="NTextCat" Version="0.3.65" />
|
||||
<PackageReference Include="Serilog.Extensions.Logging" Version="10.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="10.0.0" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="10.0.1" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="10.0.1" />
|
||||
<PackageReference Include="TagLibSharp" Version="2.3.0" />
|
||||
<PackageReference Include="Ude.NetStandard" Version="1.2.0" />
|
||||
<PackageReference Include="Vanara.PInvoke.DwmApi" Version="4.2.1" />
|
||||
@@ -115,6 +115,8 @@
|
||||
</ItemGroup>
|
||||
<!--Disable Trimming for Specific Packages-->
|
||||
<ItemGroup>
|
||||
<TrimmerRootAssembly Include="FlaUI.UIA3" />
|
||||
<TrimmerRootAssembly Include="Interop.UIAutomationClient" />
|
||||
<TrimmerRootAssembly Include="NAudio.Wasapi" />
|
||||
<TrimmerRootAssembly Include="TagLibSharp" />
|
||||
<TrimmerRootAssembly Include="Vanara.PInvoke.DwmApi" />
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
public const string MicrosoftStore = "https://apps.microsoft.com/detail/9p1wcd1p597r";
|
||||
|
||||
public const string AuthorGitHub = "https://github.com/jayfunc";
|
||||
|
||||
|
||||
public const string BetterLyricsGitHub = $"{AuthorGitHub}/BetterLyrics";
|
||||
|
||||
|
||||
public const string ShareHub = $"{BetterLyricsGitHub}/blob/dev/ShareHub/index.md";
|
||||
public const string TermsOfService = $"{BetterLyricsGitHub}/blob/dev/TermsofService.md";
|
||||
public const string PrivacyPolicy = $"{BetterLyricsGitHub}/blob/dev/PrivacyPolicy.md";
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
|
||||
<!-- 打赏者 -->
|
||||
<!-- 赞助 -->
|
||||
<Paragraph Margin="0,20,0,0" FontWeight="Bold">
|
||||
<Run x:Uid="SettingsPagePatrons" />
|
||||
</Paragraph>
|
||||
@@ -277,231 +277,94 @@
|
||||
<Run Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="Aug 28, 2025" />
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Run x:Uid="SettingsPageYouNowUsing" FontStyle="Italic" />
|
||||
<Run x:Uid="SettingsPageUserWhoPurchased" />
|
||||
</Paragraph>
|
||||
|
||||
<!-- 依赖包 -->
|
||||
<!-- 特别鸣谢 -->
|
||||
<Paragraph Margin="0,20,0,0" FontWeight="Bold">
|
||||
<Run x:Uid="SetingsPageSpecialThanks" />
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Run x:Uid="SettingsPageYouNowUsing" />
|
||||
</Paragraph>
|
||||
|
||||
<!-- 代码参考 -->
|
||||
<Paragraph Margin="0,20,0,0" FontWeight="Bold">
|
||||
<Run x:Uid="SetingsPageDeps" />
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/3v.EvtSource">
|
||||
<Run Text="3v.EvtSource" />
|
||||
<Hyperlink NavigateUri="https://gist.github.com/mcworkaholic/82fbf203e3f1043bbe534b5b2974c0ce">
|
||||
<Run Text="Get album artwork from ITunes (with Python3 or C#)" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.Labs.WinUI.Controls.OpacityMaskView">
|
||||
<Run Text="CommunityToolkit.Labs.WinUI.Controls.OpacityMaskView" />
|
||||
<Hyperlink NavigateUri="https://stackoverflow.com/a/32013610/11048731">
|
||||
<Run Text="FullyObservableCollection" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.Labs.WinUI.Shimmer">
|
||||
<Run Text="CommunityToolkit.Labs.WinUI.Shimmer" />
|
||||
<Hyperlink NavigateUri="https://github.com/Storyteller-Studios/Impressionist">
|
||||
<Run Text="Impressionist" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.Mvvm">
|
||||
<Run Text="CommunityToolkit.Mvvm" />
|
||||
<Hyperlink NavigateUri="https://github.com/Storyteller-Studios/ColorThief.WinUI3">
|
||||
<Run Text="ColorThief.WinUI3" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Behaviors">
|
||||
<Run Text="CommunityToolkit.WinUI.Behaviors" />
|
||||
<Hyperlink NavigateUri="https://github.com/Johnwikix/SpectrumVisualization">
|
||||
<Run Text="SpectrumVisualization" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Controls.Primitives">
|
||||
<Run Text="CommunityToolkit.WinUI.Controls.Primitives" />
|
||||
<Hyperlink NavigateUri="https://www.shadertoy.com/view/Mdt3Df">
|
||||
<Run Text="Snow (as shown in sweden)" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Controls.Segmented">
|
||||
<Run Text="CommunityToolkit.WinUI.Controls.Segmented" />
|
||||
<Hyperlink NavigateUri="https://www.shadertoy.com/view/lllSR2">
|
||||
<Run Text="w10" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Converters">
|
||||
<Run Text="CommunityToolkit.WinUI.Converters" />
|
||||
<Hyperlink NavigateUri="https://github.com/mo-jinran/Taskbar-Lyrics">
|
||||
<Run Text="Taskbar-Lyrics" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Extensions">
|
||||
<Run Text="CommunityToolkit.WinUI.Extensions" />
|
||||
<Hyperlink NavigateUri="https://github.com/jayfunc/BetterLyrics/network/dependencies">
|
||||
<Run Text="..." />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
|
||||
<!-- UI/UX 设计参考 -->
|
||||
<Paragraph Margin="0,20,0,0" FontWeight="Bold">
|
||||
<Run x:Uid="SetingsPageUIUXRef" />
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://github.com/solstice23/refined-now-playing-netease">
|
||||
<Run Text="refined-now-playing-netease" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Helpers">
|
||||
<Run Text="CommunityToolkit.WinUI.Helpers" />
|
||||
<Hyperlink NavigateUri="https://github.com/WXRIW/Lyricify-App">
|
||||
<Run Text="Lyricify" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Media">
|
||||
<Run Text="CommunityToolkit.WinUI.Media" />
|
||||
<Hyperlink NavigateUri="https://moriafly.com/program/salt-player">
|
||||
<Run Text="椒盐音乐 Salt Player" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/CommunityToolkit.WinUI.Triggers">
|
||||
<Run Text="CommunityToolkit.WinUI.Triggers" />
|
||||
<Hyperlink NavigateUri="https://github.com/TwilightLemon/MyToolBar">
|
||||
<Run Text="MyToolBar" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/ComputeSharp.D2D1.WinUI">
|
||||
<Run Text="ComputeSharp.D2D1.WinUI" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/csharp-kana">
|
||||
<Run Text="csharp-kana" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/csharp-pinyin">
|
||||
<Run Text="csharp-pinyin" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/DevWinUI.Controls">
|
||||
<Run Text="DevWinUI.Controls" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Dubya.WindowsMediaController">
|
||||
<Run Text="Dubya.WindowsMediaController" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/F23.StringSimilarity">
|
||||
<Run Text="F23.StringSimilarity" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/H.NotifyIcon.WinUI">
|
||||
<Run Text="H.NotifyIcon.WinUI" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Hqub.Last.fm">
|
||||
<Run Text="Hqub.Last.fm" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Lyricify.Lyrics.Helper-NativeAot">
|
||||
<Run Text="Lyricify.Lyrics.Helper-NativeAot" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection">
|
||||
<Run Text="Microsoft.Extensions.DependencyInjection" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Microsoft.Extensions.Logging">
|
||||
<Run Text="Microsoft.Extensions.Logging" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Microsoft.Graphics.Win2D">
|
||||
<Run Text="Microsoft.Graphics.Win2D" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Microsoft.Windows.SDK.BuildTools">
|
||||
<Run Text="Microsoft.Windows.SDK.BuildTools" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Microsoft.WindowsAppSDK">
|
||||
<Run Text="Microsoft.WindowsAppSDK" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/NAudio.Wasapi">
|
||||
<Run Text="NAudio.Wasapi" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Nito.AsyncEx">
|
||||
<Run Text="Nito.AsyncEx" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Nito.AsyncEx.Tasks">
|
||||
<Run Text="Nito.AsyncEx.Tasks" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/NTextCat">
|
||||
<Run Text="NTextCat" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Serilog.Extensions.Logging">
|
||||
<Run Text="Serilog.Extensions.Logging" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Serilog.Sinks.File">
|
||||
<Run Text="Serilog.Sinks.File" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/System.Drawing.Common">
|
||||
<Run Text="System.Drawing.Common" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/System.Text.Encoding.CodePages">
|
||||
<Run Text="System.Text.Encoding.CodePages" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/TagLibSharp">
|
||||
<Run Text="TagLibSharp" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Ude.NetStandard">
|
||||
<Run Text="Ude.NetStandard" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Vanara.PInvoke.DwmApi">
|
||||
<Run Text="Vanara.PInvoke.DwmApi" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Vanara.PInvoke.Gdi32">
|
||||
<Run Text="Vanara.PInvoke.Gdi32" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Vanara.PInvoke.Shell32">
|
||||
<Run Text="Vanara.PInvoke.Shell32" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Vanara.PInvoke.User32">
|
||||
<Run Text="Vanara.PInvoke.User32" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/Vanara.Windows.Shell">
|
||||
<Run Text="Vanara.Windows.Shell" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/VCollab.DiscordRichPresence">
|
||||
<Run Text="VCollab.DiscordRichPresence" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/WinUIEx">
|
||||
<Run Text="WinUIEx" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
<Hyperlink NavigateUri="https://www.nuget.org/packages/z440.atl.core">
|
||||
<Run Text="z440.atl.core" />
|
||||
<Hyperlink NavigateUri="">
|
||||
<Run Text="" />
|
||||
</Hyperlink>
|
||||
</Paragraph>
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ using CommunityToolkit.Mvvm.DependencyInjection;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.UI.ApplicationSettings;
|
||||
|
||||
// To learn more about WinUI, the WinUI project structure,
|
||||
// and more about our project templates, see: http://aka.ms/winui-project-info.
|
||||
|
||||
@@ -71,6 +71,10 @@
|
||||
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.MusicGallerySettings.AutoPlay, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageStopTrackOnGalleryWindowClosed" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=}">
|
||||
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.MusicGallerySettings.StopOnWindowClosed, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageExitOnGalleryWindowClosed" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=}">
|
||||
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.MusicGallerySettings.ExitOnWindowClosed, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
// FontFamilies = fontFamilies;
|
||||
// });
|
||||
//});
|
||||
FontFamilies = FontHelper.SystemFontFamilies.OrderBy(x => x).ToList();
|
||||
FontFamilies = FontHelper.GetSystemFontFamilies();
|
||||
}
|
||||
|
||||
private void AutoSuggestBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
|
||||
|
||||
@@ -47,6 +47,51 @@
|
||||
</dev:SettingsExpander.Items>
|
||||
</dev:SettingsExpander>
|
||||
|
||||
<dev:SettingsExpander
|
||||
x:Uid="SettingsPageAlbumArtLayer"
|
||||
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
|
||||
Glyph=}"
|
||||
IsExpanded="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=OneWay}">
|
||||
<ToggleSwitch IsOn="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=TwoWay}" />
|
||||
<dev:SettingsExpander.Items>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageOpacity" IsEnabled="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=OneWay}">
|
||||
<uc:ExtendedSlider
|
||||
Default="100"
|
||||
Maximum="100"
|
||||
Minimum="0"
|
||||
Unit="%"
|
||||
Value="{x:Bind LyricsBackgroundSettings.CoverOverlayOpacity, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageSpeed" IsEnabled="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=OneWay}">
|
||||
<uc:ExtendedSlider
|
||||
Default="50"
|
||||
Maximum="100"
|
||||
Minimum="0"
|
||||
Unit="%"
|
||||
Value="{x:Bind LyricsBackgroundSettings.CoverOverlaySpeed, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageBlurAmount" IsEnabled="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=OneWay}">
|
||||
<uc:ExtendedSlider
|
||||
Default="100"
|
||||
Maximum="200"
|
||||
Minimum="0"
|
||||
Value="{x:Bind LyricsBackgroundSettings.CoverOverlayBlurAmount, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<!--<dev:SettingsCard x:Uid="SettingsPageBackgroundAcrylicEffectAmount" IsEnabled="{x:Bind LyricsBackgroundSettings.IsCoverOverlayEnabled, Mode=OneWay}">
|
||||
<uc:ExtendedSlider
|
||||
Default="0"
|
||||
Maximum="10"
|
||||
Minimum="0"
|
||||
Value="{x:Bind LyricsBackgroundSettings.CoverAcrylicEffectAmount, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>-->
|
||||
|
||||
</dev:SettingsExpander.Items>
|
||||
</dev:SettingsExpander>
|
||||
|
||||
<dev:SettingsExpander
|
||||
x:Uid="SettingsPageFluidLayer"
|
||||
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
|
||||
|
||||
@@ -13,15 +13,21 @@ using BetterLyrics.WinUI3.Services.SettingsService;
|
||||
using CommunityToolkit.Mvvm.DependencyInjection;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using Lyricify.Lyrics.Providers.Web.Netease;
|
||||
using Microsoft.Graphics.Canvas;
|
||||
using Microsoft.Graphics.Canvas.UI.Xaml;
|
||||
using Microsoft.UI;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Foundation;
|
||||
using Windows.Storage.Streams;
|
||||
using Windows.UI;
|
||||
using static Vanara.PInvoke.Ole32;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Controls
|
||||
{
|
||||
@@ -34,7 +40,8 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
IRecipient<PropertyChangedMessage<bool>>,
|
||||
IRecipient<PropertyChangedMessage<TextAlignmentType>>,
|
||||
IRecipient<PropertyChangedMessage<LyricsFontWeight>>,
|
||||
IRecipient<PropertyChangedMessage<string>>
|
||||
IRecipient<PropertyChangedMessage<string>>,
|
||||
IRecipient<PropertyChangedMessage<IRandomAccessStream?>>
|
||||
{
|
||||
private readonly ISettingsService _settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
|
||||
private readonly IMediaSessionsService _mediaSessionsService = Ioc.Default.GetRequiredService<IMediaSessionsService>();
|
||||
@@ -42,6 +49,7 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
|
||||
private readonly LyricsRenderer _lyricsRenderer = new();
|
||||
private readonly FluidBackgroundRenderer _fluidRenderer = new();
|
||||
private readonly CoverBackgroundRenderer _coverRenderer = new();
|
||||
private readonly PureColorBackgroundRenderer _pureColorRenderer = new();
|
||||
private readonly SnowRenderer _snowRenderer = new();
|
||||
private readonly FogRenderer _fogRenderer = new();
|
||||
@@ -368,8 +376,8 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
lyricsBg.IsPureColorOverlayEnabled
|
||||
);
|
||||
|
||||
_fluidRenderer.Opacity = lyricsBg.FluidOverlayOpacity / 100.0;
|
||||
_fluidRenderer.IsEnabled = lyricsBg.IsFluidOverlayEnabled;
|
||||
_coverRenderer.Draw(sender, args.DrawingSession);
|
||||
|
||||
_fluidRenderer.Draw(sender, args.DrawingSession);
|
||||
|
||||
_snowRenderer.Draw(sender, args.DrawingSession);
|
||||
@@ -549,16 +557,21 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
|
||||
_isLayoutChanged = false;
|
||||
|
||||
if (_fluidRenderer.IsEnabled)
|
||||
{
|
||||
_fluidRenderer.UpdateColors(
|
||||
_accentColor1Transition.Value,
|
||||
_accentColor2Transition.Value,
|
||||
_accentColor3Transition.Value,
|
||||
_accentColor4Transition.Value
|
||||
);
|
||||
_fluidRenderer.Update(elapsedTime);
|
||||
}
|
||||
_fluidRenderer.IsEnabled = lyricsBg.IsFluidOverlayEnabled;
|
||||
_fluidRenderer.Opacity = lyricsBg.FluidOverlayOpacity / 100.0;
|
||||
_fluidRenderer.UpdateColors(
|
||||
_accentColor1Transition.Value,
|
||||
_accentColor2Transition.Value,
|
||||
_accentColor3Transition.Value,
|
||||
_accentColor4Transition.Value
|
||||
);
|
||||
_fluidRenderer.Update(elapsedTime);
|
||||
|
||||
_coverRenderer.IsEnabled = lyricsBg.IsCoverOverlayEnabled;
|
||||
_coverRenderer.Opacity = lyricsBg.CoverOverlayOpacity;
|
||||
_coverRenderer.BlurAmount = lyricsBg.CoverOverlayBlurAmount;
|
||||
_coverRenderer.Speed = lyricsBg.CoverOverlaySpeed;
|
||||
_coverRenderer.Update(elapsedTime);
|
||||
|
||||
_snowRenderer.IsEnabled = lyricsBg.IsSnowFlakeOverlayEnabled;
|
||||
_snowRenderer.Amount = lyricsBg.SnowFlakeOverlayAmount / 100f;
|
||||
@@ -586,6 +599,7 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
private void Canvas_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_fluidRenderer.Dispose();
|
||||
_coverRenderer.Dispose();
|
||||
_snowRenderer.Dispose();
|
||||
_fogRenderer.Dispose();
|
||||
_spectrumRenderer.Dispose();
|
||||
@@ -600,7 +614,13 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
|
||||
private async void Canvas_CreateResources(CanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
|
||||
{
|
||||
args.TrackAsyncAction(_fluidRenderer.LoadResourcesAsync().AsAsyncAction());
|
||||
var tasks = new Task[]
|
||||
{
|
||||
_fluidRenderer.LoadResourcesAsync(),
|
||||
ReloadCoverBackgroundResourcesAsync()
|
||||
};
|
||||
args.TrackAsyncAction(Task.WhenAll(tasks).AsAsyncAction());
|
||||
|
||||
_snowRenderer.LoadResources();
|
||||
_fogRenderer.LoadResources();
|
||||
|
||||
@@ -682,6 +702,16 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
private async Task ReloadCoverBackgroundResourcesAsync()
|
||||
{
|
||||
if (_mediaSessionsService.AlbumArtBitmapStream is IRandomAccessStream stream)
|
||||
{
|
||||
stream.Seek(0);
|
||||
CanvasBitmap bitmap = await CanvasBitmap.LoadAsync(Canvas, stream);
|
||||
_coverRenderer.SetCoverBitmap(bitmap);
|
||||
}
|
||||
}
|
||||
|
||||
public void Receive(PropertyChangedMessage<TimeSpan> message)
|
||||
{
|
||||
if (message.Sender is IMediaSessionsService)
|
||||
@@ -874,5 +904,15 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
}
|
||||
}
|
||||
|
||||
public void Receive(PropertyChangedMessage<IRandomAccessStream?> message)
|
||||
{
|
||||
if (message.Sender is IMediaSessionsService)
|
||||
{
|
||||
if (message.PropertyName == nameof(IMediaSessionsService.AlbumArtBitmapStream))
|
||||
{
|
||||
_ = ReloadCoverBackgroundResourcesAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
<dev:SettingsCard x:Uid="SettingsPageLyricsCenterTopOffset" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=}">
|
||||
<local:ExtendedSlider
|
||||
Default="50"
|
||||
Maximum="100"
|
||||
Minimum="0"
|
||||
Maximum="99"
|
||||
Minimum="1"
|
||||
Unit="%"
|
||||
Value="{x:Bind LyricsStyleSettings.PlayingLineTopOffset, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:uc="using:BetterLyrics.WinUI3.Controls"
|
||||
xmlns:ui="using:CommunityToolkit.WinUI"
|
||||
Loaded="UserControl_Loaded"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid>
|
||||
@@ -37,6 +38,7 @@
|
||||
<MenuFlyoutItem x:Uid="SettingsPageDockedMode" Command="{x:Bind ViewModel.CreateDockedLyricsWindowStatusCommand}" />
|
||||
<MenuFlyoutItem x:Uid="SettingsPageFullscreenMode" Command="{x:Bind ViewModel.CreateFullLyricsWindowStatusCommand}" />
|
||||
<MenuFlyoutItem x:Uid="SettingsPageNarrowMode" Command="{x:Bind ViewModel.CreateNarrowLyricsWindowStatusCommand}" />
|
||||
<MenuFlyoutItem x:Uid="SettingsPageTaskbarMode" Command="{x:Bind ViewModel.CreateTaskbarLyricsWindowStatusCommand}" />
|
||||
</MenuFlyout>
|
||||
</Button.Flyout>
|
||||
</Button>
|
||||
@@ -194,26 +196,34 @@
|
||||
Style="{StaticResource AccentButtonStyle}" />
|
||||
</Grid>
|
||||
|
||||
<SelectorBar x:Name="ConfigSelectorBar" SelectionChanged="ConfigSelectorBar_SelectionChanged">
|
||||
<controls:Segmented
|
||||
x:Name="ConfigSegmented"
|
||||
SelectionChanged="ConfigSegmented_SelectionChanged"
|
||||
Style="{StaticResource PivotSegmentedStyle}">
|
||||
|
||||
<SelectorBarItem
|
||||
x:Name="WindowSelectorBarItem"
|
||||
x:Uid="AppSettingsControlGeneral"
|
||||
Tag="Window" />
|
||||
<SelectorBarItem
|
||||
x:Name="LayoutSelectorBarItem"
|
||||
x:Uid="SettingsPageLayout"
|
||||
Tag="Layout" />
|
||||
<SelectorBarItem
|
||||
x:Name="AlbumArtStyleSelectorBarItem"
|
||||
x:Uid="SettingsPageAlbumStyle"
|
||||
Tag="AlbumArtStyle" />
|
||||
<SelectorBarItem x:Uid="SettingsPageAlbumEffect" Tag="AlbumArtEffect" />
|
||||
<SelectorBarItem x:Uid="SettingsPageLyricsStyle" Tag="LyricsStyle" />
|
||||
<SelectorBarItem x:Uid="SettingsPageLyricsEffect" Tag="LyricsEffect" />
|
||||
<SelectorBarItem x:Uid="SettingsPageBackgroundOverlay" Tag="LyricsBackground" />
|
||||
<controls:SegmentedItem x:Name="WindowSegmentedItem" Tag="Window">
|
||||
<TextBlock x:Uid="AppSettingsControlGeneral" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem x:Name="LayoutSegmentedItem" Tag="Layout">
|
||||
<TextBlock x:Uid="SettingsPageLayout" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem x:Name="AlbumArtStyleSegmentedItem" Tag="AlbumArtStyle">
|
||||
<TextBlock x:Uid="SettingsPageAlbumStyle" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem Tag="AlbumArtEffect">
|
||||
<TextBlock x:Uid="SettingsPageAlbumEffect" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem Tag="LyricsStyle">
|
||||
<TextBlock x:Uid="SettingsPageLyricsStyle" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem Tag="LyricsEffect">
|
||||
<TextBlock x:Uid="SettingsPageLyricsEffect" />
|
||||
</controls:SegmentedItem>
|
||||
<controls:SegmentedItem Tag="LyricsBackground">
|
||||
<TextBlock x:Uid="SettingsPageBackgroundOverlay" />
|
||||
</controls:SegmentedItem>
|
||||
|
||||
</SelectorBar>
|
||||
</controls:Segmented>
|
||||
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -6,9 +6,11 @@ using BetterLyrics.WinUI3.Services.SettingsService;
|
||||
using BetterLyrics.WinUI3.ViewModels;
|
||||
using BetterLyrics.WinUI3.Views;
|
||||
using CommunityToolkit.Mvvm.DependencyInjection;
|
||||
using CommunityToolkit.WinUI.Controls;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Input;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -25,14 +27,14 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
|
||||
private readonly ISettingsService _settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
|
||||
|
||||
public LyricsWindowStatus LyricsWindowStatus
|
||||
public LyricsWindowStatus? LyricsWindowStatus
|
||||
{
|
||||
get { return (LyricsWindowStatus)GetValue(LyricsWindowStatusProperty); }
|
||||
get { return (LyricsWindowStatus?)GetValue(LyricsWindowStatusProperty); }
|
||||
set { SetValue(LyricsWindowStatusProperty, value); }
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty LyricsWindowStatusProperty =
|
||||
DependencyProperty.Register(nameof(LyricsWindowStatus), typeof(LyricsWindowStatus), typeof(LyricsWindowSettingsControl), new PropertyMetadata(default));
|
||||
DependencyProperty.Register(nameof(LyricsWindowStatus), typeof(LyricsWindowStatus), typeof(LyricsWindowSettingsControl), new PropertyMetadata(null));
|
||||
|
||||
public LyricsWindowSettingsControl()
|
||||
{
|
||||
@@ -151,16 +153,16 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
|
||||
private void ConfigButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
WindowSelectorBarItem.Visibility = LayoutSelectorBarItem.Visibility = Visibility.Visible;
|
||||
ConfigSelectorBar.SelectedItem = WindowSelectorBarItem;
|
||||
WindowSegmentedItem.IsEnabled = LayoutSegmentedItem.IsEnabled = true;
|
||||
ConfigSegmented.SelectedItem = WindowSegmentedItem;
|
||||
LyricsWindowStatus = (LyricsWindowStatus)((Button)sender).DataContext;
|
||||
ViewModel.OpenConfigPanel();
|
||||
}
|
||||
|
||||
private void EmbeddedConfigButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
WindowSelectorBarItem.Visibility = LayoutSelectorBarItem.Visibility = Visibility.Collapsed;
|
||||
ConfigSelectorBar.SelectedItem = AlbumArtStyleSelectorBarItem;
|
||||
WindowSegmentedItem.IsEnabled = LayoutSegmentedItem.IsEnabled = false;
|
||||
ConfigSegmented.SelectedItem = AlbumArtStyleSegmentedItem;
|
||||
LyricsWindowStatus = _settingsService.AppSettings.MusicGallerySettings.LyricsWindowStatus;
|
||||
ViewModel.OpenConfigPanel();
|
||||
}
|
||||
@@ -185,17 +187,6 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
}
|
||||
}
|
||||
|
||||
private void ConfigSelectorBar_SelectionChanged(SelectorBar sender, SelectorBarSelectionChangedEventArgs args)
|
||||
{
|
||||
if (sender is SelectorBar bar)
|
||||
{
|
||||
if (bar.SelectedItem is SelectorBarItem item)
|
||||
{
|
||||
ViewModel?.SelectorBarSelectedItemTag = item.Tag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CloseStatusButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is FrameworkElement element)
|
||||
@@ -207,5 +198,15 @@ namespace BetterLyrics.WinUI3.Controls
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ConfigSegmented_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
ViewModel.SelectorBarSelectedItemTag = (string)((SegmentedItem)((Segmented)sender).SelectedItem).Tag;
|
||||
}
|
||||
|
||||
private void UserControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel.CloseConfigPanelCommand.Execute(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
<Grid
|
||||
x:Name="BottomCommandGrid"
|
||||
Background="{ThemeResource AcrylicInAppFillColorDefaultBrush}"
|
||||
Background="{ThemeResource LayerOnMicaBaseAltFillColorDefaultBrush}"
|
||||
Opacity="{x:Bind ViewModel.BottomCommandGridOpacity, Mode=OneWay}"
|
||||
PointerEntered="BottomCommandGrid_PointerEntered"
|
||||
PointerExited="BottomCommandGrid_PointerExited">
|
||||
|
||||
@@ -86,6 +86,26 @@
|
||||
</dev:SettingsExpander.Items>
|
||||
</dev:SettingsExpander>
|
||||
|
||||
<dev:SettingsExpander
|
||||
x:Uid="SettingsPagePinToTaskbar"
|
||||
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
|
||||
Glyph=}"
|
||||
IsExpanded="{x:Bind LyricsWindowStatus.IsPinToTaskbar, Mode=OneWay}">
|
||||
<ToggleSwitch IsOn="{x:Bind LyricsWindowStatus.IsPinToTaskbar, Mode=TwoWay}" />
|
||||
<dev:SettingsExpander.Items>
|
||||
<dev:SettingsCard x:Uid="SettingsPageTaskbarPlacement">
|
||||
<ComboBox SelectedIndex="{x:Bind LyricsWindowStatus.TaskbarPlacement, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
|
||||
<ComboBoxItem x:Uid="SettingsPageLeft" />
|
||||
<ComboBoxItem x:Uid="SettingsPageRight" />
|
||||
</ComboBox>
|
||||
</dev:SettingsCard>
|
||||
</dev:SettingsExpander.Items>
|
||||
</dev:SettingsExpander>
|
||||
|
||||
<dev:SettingsCard x:Uid="SettingsPageAlwaysHideUnlockButton" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=}">
|
||||
<ToggleSwitch IsOn="{x:Bind LyricsWindowStatus.IsAlwaysHideUnlockButton, Mode=TwoWay}" />
|
||||
</dev:SettingsCard>
|
||||
|
||||
<dev:SettingsExpander
|
||||
x:Uid="SettingsPageAOT"
|
||||
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace BetterLyrics.WinUI3.Enums
|
||||
{
|
||||
public enum TaskbarPlacement
|
||||
{
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using Windows.Foundation;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Events
|
||||
{
|
||||
public class TaskbarFreeBoundsChangedEventArgs : EventArgs
|
||||
{
|
||||
public Rect TaskbarFreeBounds { get; }
|
||||
public TaskbarFreeBoundsChangedEventArgs(Rect taskbarBounds)
|
||||
{
|
||||
TaskbarFreeBounds = taskbarBounds;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,9 +22,9 @@ namespace BetterLyrics.WinUI3.Extensions
|
||||
Name = _resourceService.GetLocalizedString("DesktopMode"),
|
||||
LyricsDisplayType = LyricsDisplayType.LyricsOnly,
|
||||
WindowBounds = new Rect(100, 100, 600, 250),
|
||||
IsLocked = true,
|
||||
IsAlwaysOnTop = true,
|
||||
IsAlwaysOnTopPolling = true,
|
||||
IsLocked = true,
|
||||
IsAdaptToEnvironment = true,
|
||||
IsShownInSwitchers = false,
|
||||
EnvironmentSampleMode = WindowPixelSampleMode.WindowEdge,
|
||||
@@ -52,7 +52,6 @@ namespace BetterLyrics.WinUI3.Extensions
|
||||
IsShownInSwitchers = false,
|
||||
LyricsDisplayType = LyricsDisplayType.LyricsOnly,
|
||||
EnvironmentSampleMode = WindowPixelSampleMode.BelowWindow,
|
||||
TitleBarArea = TitleBarArea.None,
|
||||
LyricsStyleSettings = new LyricsStyleSettings
|
||||
{
|
||||
LyricsAlignmentType = TextAlignmentType.Center,
|
||||
@@ -108,5 +107,30 @@ namespace BetterLyrics.WinUI3.Extensions
|
||||
LyricsLayoutOrientation = LyricsLayoutOrientation.Vertical,
|
||||
};
|
||||
}
|
||||
|
||||
public static LyricsWindowStatus TaskbarMode(Window? window = null)
|
||||
{
|
||||
window ??= WindowHook.GetWindow<SystemTrayWindow>();
|
||||
return new LyricsWindowStatus(window)
|
||||
{
|
||||
Name = _resourceService.GetLocalizedString("TaskbarMode"),
|
||||
LyricsDisplayType = LyricsDisplayType.LyricsOnly,
|
||||
IsPinToTaskbar = true,
|
||||
IsLocked = true,
|
||||
IsAlwaysOnTop = true,
|
||||
IsAlwaysOnTopPolling = true,
|
||||
IsAdaptToEnvironment = true,
|
||||
IsShownInSwitchers = false,
|
||||
EnvironmentSampleMode = WindowPixelSampleMode.WindowEdge,
|
||||
LyricsStyleSettings = new()
|
||||
{
|
||||
LyricsAlignmentType = TextAlignmentType.Center,
|
||||
},
|
||||
LyricsBackgroundSettings = new LyricsBackgroundSettings
|
||||
{
|
||||
IsFluidOverlayEnabled = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Windows.Foundation;
|
||||
using Vanara.PInvoke;
|
||||
using Windows.Foundation;
|
||||
using Windows.Graphics;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Extensions
|
||||
@@ -77,5 +78,15 @@ namespace BetterLyrics.WinUI3.Extensions
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
extension(RECT rect)
|
||||
{
|
||||
public Rect ToRect() => new(
|
||||
rect.Left,
|
||||
rect.Top,
|
||||
rect.Right - rect.Left,
|
||||
rect.Bottom - rect.Top
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using System.Drawing;
|
||||
using Windows.Foundation;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Extensions
|
||||
{
|
||||
public static class RectangleExtensions
|
||||
{
|
||||
extension(Rectangle rect)
|
||||
{
|
||||
public Rect ToRect() => new(
|
||||
rect.Left,
|
||||
rect.Top,
|
||||
rect.Right - rect.Left,
|
||||
rect.Bottom - rect.Top
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
using Microsoft.Graphics.Canvas.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media;
|
||||
|
||||
@@ -8,8 +10,6 @@ namespace BetterLyrics.WinUI3.Helper
|
||||
{
|
||||
public static class FontHelper
|
||||
{
|
||||
public static string[] SystemFontFamilies => CanvasTextFormat.GetSystemFontFamilies().Order().ToArray();
|
||||
|
||||
public static string GetLocalizedFontFamilyName(string sourceName, string langCode)
|
||||
{
|
||||
if (langCode == "")
|
||||
@@ -33,5 +33,20 @@ namespace BetterLyrics.WinUI3.Helper
|
||||
|
||||
return sourceName;
|
||||
}
|
||||
|
||||
public static List<string> GetSystemFontFamilies()
|
||||
{
|
||||
List<string> fontFamilies = new();
|
||||
|
||||
foreach (var font in Fonts.SystemFontFamilies)
|
||||
{
|
||||
if (font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("en-us"), out string englishFamilyName))
|
||||
{
|
||||
fontFamilies.Add(englishFamilyName);
|
||||
}
|
||||
}
|
||||
|
||||
return fontFamilies.Order().ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,211 @@
|
||||
using Microsoft.UI.Xaml;
|
||||
using BetterLyrics.WinUI3.Enums;
|
||||
using BetterLyrics.WinUI3.Events;
|
||||
using BetterLyrics.WinUI3.Extensions;
|
||||
using FlaUI.Core.AutomationElements;
|
||||
using FlaUI.Core.Definitions;
|
||||
using FlaUI.Core.EventHandlers;
|
||||
using FlaUI.UIA3;
|
||||
using Microsoft.UI.Dispatching;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Hooks
|
||||
{
|
||||
public class TaskbarHook
|
||||
public partial class TaskbarHook : IDisposable
|
||||
{
|
||||
private readonly DispatcherTimer _timer;
|
||||
private readonly UIA3Automation _automation;
|
||||
private AutomationElement? _taskbar;
|
||||
|
||||
public Action<EventArgs> OnTaskbarBoundsChanged;
|
||||
private StructureChangedEventHandlerBase? _structureHandler;
|
||||
private PropertyChangedEventHandlerBase? _propertyHandler;
|
||||
|
||||
public TaskbarHook()
|
||||
private TaskbarPlacement _currentPlacement;
|
||||
|
||||
private readonly DispatcherQueue _dispatcherQueue;
|
||||
private readonly Action<TaskbarFreeBoundsChangedEventArgs> _onLayoutChanged;
|
||||
private Timer? _debounceTimer;
|
||||
private const int DebounceDelay = 150;
|
||||
private bool _isDisposed;
|
||||
|
||||
public TaskbarHook(TaskbarPlacement placement, Action<TaskbarFreeBoundsChangedEventArgs> onLayoutChanged)
|
||||
{
|
||||
_timer = new DispatcherTimer();
|
||||
_timer.Interval = TimeSpan.FromMilliseconds(50);
|
||||
_timer.Tick += Timer_Tick;
|
||||
_automation = new UIA3Automation();
|
||||
_onLayoutChanged = onLayoutChanged;
|
||||
_dispatcherQueue = DispatcherQueue.GetForCurrentThread();
|
||||
|
||||
_currentPlacement = placement;
|
||||
|
||||
StartHook();
|
||||
}
|
||||
|
||||
private void Timer_Tick(object? sender, object e)
|
||||
public void UpdatePlacement(TaskbarPlacement newPlacement)
|
||||
{
|
||||
_currentPlacement = newPlacement;
|
||||
RequestUpdate(); // 立即刷新位置
|
||||
}
|
||||
|
||||
private void StartHook()
|
||||
{
|
||||
try
|
||||
{
|
||||
var desktop = _automation.GetDesktop();
|
||||
_taskbar = desktop.FindFirstChild(cf => cf.ByClassName("Shell_TrayWnd"));
|
||||
|
||||
if (_taskbar == null) return;
|
||||
|
||||
// 监听结构变化
|
||||
// 这里的返回值就是一个可以 Dispose 的对象
|
||||
_structureHandler = _taskbar.RegisterStructureChangedEvent(
|
||||
TreeScope.Descendants,
|
||||
(element, type, id) => RequestUpdate());
|
||||
|
||||
// 监听属性变化
|
||||
_propertyHandler = _taskbar.RegisterPropertyChangedEvent(
|
||||
TreeScope.Element,
|
||||
(element, id, val) => RequestUpdate(),
|
||||
_automation.PropertyLibrary.Element.BoundingRectangle);
|
||||
|
||||
RequestUpdate();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"Hook Init Failed: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void RequestUpdate()
|
||||
{
|
||||
if (_isDisposed) return;
|
||||
_debounceTimer?.Dispose();
|
||||
_debounceTimer = new Timer(_ =>
|
||||
{
|
||||
Rectangle voidRect = CalculateVoidRect(_currentPlacement);
|
||||
_dispatcherQueue.TryEnqueue(() =>
|
||||
{
|
||||
if (!_isDisposed && voidRect != Rectangle.Empty)
|
||||
{
|
||||
_onLayoutChanged?.Invoke(new TaskbarFreeBoundsChangedEventArgs(voidRect.ToRect()));
|
||||
}
|
||||
});
|
||||
}, null, DebounceDelay, Timeout.Infinite);
|
||||
}
|
||||
|
||||
private Rectangle CalculateVoidRect(TaskbarPlacement placement)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_taskbar == null) return Rectangle.Empty;
|
||||
|
||||
try { var _ = _taskbar.BoundingRectangle; }
|
||||
catch
|
||||
{
|
||||
var desktop = _automation.GetDesktop();
|
||||
_taskbar = desktop.FindFirstChild(cf => cf.ByClassName("Shell_TrayWnd"));
|
||||
if (_taskbar == null) return Rectangle.Empty;
|
||||
}
|
||||
|
||||
Rectangle taskbarRect = _taskbar.BoundingRectangle;
|
||||
|
||||
// 绝对右边界:托盘
|
||||
int barrierRight = taskbarRect.Right;
|
||||
var tray = _taskbar.FindFirstDescendant(cf => cf.ByAutomationId("SystemTrayIcon")); // Win11
|
||||
if (tray == null) tray = _taskbar.FindFirstDescendant(cf => cf.ByClassName("TrayNotifyWnd")); // Win10
|
||||
if (tray != null) barrierRight = tray.BoundingRectangle.Left;
|
||||
|
||||
// 绝对左边界:任务栏左边缘 或 小组件(Win11)
|
||||
int barrierLeft = taskbarRect.Left;
|
||||
var widgets = _taskbar.FindFirstDescendant(cf => cf.ByAutomationId("WidgetsButton"));
|
||||
|
||||
// 只有当小组件确实在最左侧时 (Win11默认),它才构成左边界
|
||||
// 如果用户把任务栏设为靠左对齐,小组件会在开始按钮右边,这时候不把它当做左边界
|
||||
if (widgets != null && widgets.BoundingRectangle.Left < taskbarRect.Left + 100)
|
||||
{
|
||||
barrierLeft = (int)widgets.BoundingRectangle.Right;
|
||||
}
|
||||
|
||||
|
||||
// 寻找 中间内容区域 (Start + Search + Apps) 的 左右极值
|
||||
int contentMinLeft = barrierRight;
|
||||
int contentMaxRight = barrierLeft;
|
||||
|
||||
// 定义所有中间元素
|
||||
string[] systemButtonIds = new[] {
|
||||
"StartButton", "SearchButton", "TaskViewButton", "ChatButton"
|
||||
};
|
||||
|
||||
// 系统按钮
|
||||
foreach (var id in systemButtonIds)
|
||||
{
|
||||
var btn = _taskbar.FindFirstDescendant(cf => cf.ByAutomationId(id));
|
||||
if (btn != null)
|
||||
{
|
||||
var rect = btn.BoundingRectangle;
|
||||
// 排除不可见的
|
||||
if (rect.Width <= 0) continue;
|
||||
|
||||
// 更新极值
|
||||
if (rect.Left < contentMinLeft) contentMinLeft = (int)rect.Left;
|
||||
if (rect.Right > contentMaxRight) contentMaxRight = (int)rect.Right;
|
||||
}
|
||||
}
|
||||
|
||||
// App 图标
|
||||
var appIcons = _taskbar.FindAllDescendants(cf => cf.ByClassName("Taskbar.TaskListButtonAutomationPeer"));
|
||||
foreach (var icon in appIcons)
|
||||
{
|
||||
var rect = icon.BoundingRectangle;
|
||||
if (rect.Width <= 0) continue;
|
||||
|
||||
if (rect.Left < contentMinLeft) contentMinLeft = (int)rect.Left;
|
||||
if (rect.Right > contentMaxRight) contentMaxRight = (int)rect.Right;
|
||||
}
|
||||
|
||||
// 如果完全没找到内容,重置为中间
|
||||
if (contentMinLeft == barrierRight) contentMinLeft = taskbarRect.Left;
|
||||
if (contentMaxRight == barrierLeft) contentMaxRight = taskbarRect.Left;
|
||||
|
||||
int finalLeft, finalRight;
|
||||
int padding = 10;
|
||||
|
||||
if (placement == TaskbarPlacement.Left)
|
||||
{
|
||||
// 【小组件】... [空隙] ...【开始按钮】
|
||||
// 如果是 Win10 或 Win11左对齐,contentMinLeft 几乎等于 barrierLeft,空隙为0
|
||||
finalLeft = barrierLeft + padding;
|
||||
finalRight = contentMinLeft - padding;
|
||||
}
|
||||
else // Right
|
||||
{
|
||||
// 【最后一个图标】... [空隙] ...【托盘】
|
||||
finalLeft = contentMaxRight + padding;
|
||||
finalRight = barrierRight - padding;
|
||||
}
|
||||
|
||||
int width = finalRight - finalLeft;
|
||||
|
||||
if (width < 20) return Rectangle.Empty;
|
||||
|
||||
return new Rectangle(finalLeft, taskbarRect.Top, width, taskbarRect.Height);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"Calc Rect Error: {ex.Message}");
|
||||
return Rectangle.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_isDisposed) return;
|
||||
_isDisposed = true;
|
||||
|
||||
_debounceTimer?.Dispose();
|
||||
|
||||
_structureHandler?.Dispose();
|
||||
_propertyHandler?.Dispose();
|
||||
|
||||
_automation?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,8 +23,8 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
private static List<object> _activeWindows = [];
|
||||
private static List<object> _workAreas = [];
|
||||
|
||||
private static readonly Dictionary<HWND, WindowStyle> _defaultWindowStyle = [];
|
||||
private static readonly Dictionary<HWND, ExtendedWindowStyle> _defaultExtendedWindowStyle = [];
|
||||
private static WindowStyle? _defaultWindowStyle;
|
||||
private static ExtendedWindowStyle? _defaultExtendedWindowStyle;
|
||||
|
||||
public static void HideWindow(this Window window)
|
||||
{
|
||||
@@ -81,9 +81,9 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
{
|
||||
return frameworkElement.XamlRoot.ContentIslandEnvironment.AppWindowId.GetWindowHandle();
|
||||
}
|
||||
else if (obj != null)
|
||||
else if (obj is Window window)
|
||||
{
|
||||
return WindowNative.GetWindowHandle(obj);
|
||||
return WindowNative.GetWindowHandle(window);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -141,17 +141,19 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
TrackWindow(window);
|
||||
var castedWindow = (Window)window;
|
||||
|
||||
if (typeof(T) != typeof(SystemTrayWindow))
|
||||
castedWindow.Restore();
|
||||
castedWindow.Activate();
|
||||
|
||||
if (typeof(T) == typeof(SystemTrayWindow))
|
||||
{
|
||||
castedWindow.Restore();
|
||||
castedWindow.Activate();
|
||||
_defaultWindowStyle = castedWindow.GetWindowStyle();
|
||||
_defaultExtendedWindowStyle = castedWindow.GetExtendedWindowStyle();
|
||||
castedWindow.HideWindow();
|
||||
}
|
||||
|
||||
if (typeof(T) == typeof(NowPlayingWindow))
|
||||
{
|
||||
var hwnd = WindowNative.GetWindowHandle(castedWindow);
|
||||
_defaultWindowStyle.Add(hwnd, castedWindow.GetWindowStyle());
|
||||
_defaultExtendedWindowStyle.Add(hwnd, castedWindow.GetExtendedWindowStyle());
|
||||
|
||||
var lyricsWindow = (NowPlayingWindow)window;
|
||||
lyricsWindow.InitStatus();
|
||||
@@ -225,10 +227,6 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
if (_activeWindows.Contains(sender))
|
||||
{
|
||||
_activeWindows.Remove(sender);
|
||||
|
||||
var hwnd = WindowNative.GetWindowHandle(sender);
|
||||
_defaultWindowStyle.Remove(hwnd);
|
||||
_defaultExtendedWindowStyle.Remove(hwnd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,9 +254,7 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
|
||||
public static void SetIsClickThrough(this Window window, bool enable)
|
||||
{
|
||||
IntPtr hwnd = WindowNative.GetWindowHandle(window);
|
||||
|
||||
if (_defaultExtendedWindowStyle.TryGetValue(hwnd, out var style))
|
||||
if (_defaultExtendedWindowStyle is ExtendedWindowStyle style)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
@@ -273,9 +269,7 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
|
||||
public static void SetIsBorderless(this Window window, bool enable)
|
||||
{
|
||||
var hwnd = WindowNative.GetWindowHandle(window);
|
||||
|
||||
if (_defaultWindowStyle.TryGetValue(hwnd, out var style))
|
||||
if (_defaultWindowStyle is WindowStyle style)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
@@ -288,23 +282,27 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetIsFullscreen(this Window window, bool enable)
|
||||
public static bool SetIsFullscreen(this Window window, bool enable, bool defaultExtendsContentIntoTitleBar = true)
|
||||
{
|
||||
if (window.AppWindow == null) return;
|
||||
if (window.AppWindow == null) return false;
|
||||
|
||||
if (enable)
|
||||
{
|
||||
window.ExtendsContentIntoTitleBar = false;
|
||||
window.AppWindow.SetPresenter(AppWindowPresenterKind.FullScreen);
|
||||
}
|
||||
else
|
||||
{
|
||||
window.ExtendsContentIntoTitleBar = defaultExtendsContentIntoTitleBar;
|
||||
window.AppWindow.SetPresenter(AppWindowPresenterKind.Overlapped);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void SetIsMaximized(this Window window, bool enable)
|
||||
public static bool SetIsMaximized(this Window window, bool enable)
|
||||
{
|
||||
if (window.AppWindow == null) return;
|
||||
if (window.AppWindow == null) return false;
|
||||
|
||||
if (enable)
|
||||
{
|
||||
@@ -314,10 +312,14 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
{
|
||||
window.Restore();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void SetIsShowInSwitchers(this Window window, bool enable)
|
||||
{
|
||||
if (window.AppWindow == null) return;
|
||||
|
||||
window.AppWindow.IsShownInSwitchers = enable;
|
||||
}
|
||||
|
||||
@@ -333,6 +335,8 @@ namespace BetterLyrics.WinUI3.Hooks
|
||||
|
||||
public static void MoveAndResize(this Window window, Rect rect)
|
||||
{
|
||||
if (window.AppWindow == null) return;
|
||||
|
||||
window.AppWindow.Move(new Windows.Graphics.PointInt32((int)rect.X, (int)rect.Y));
|
||||
window.AppWindow.Resize(new Windows.Graphics.SizeInt32((int)rect.Width, (int)rect.Height));
|
||||
}
|
||||
|
||||
@@ -22,6 +22,11 @@ namespace BetterLyrics.WinUI3.Models
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsAlwaysOnTopPolling { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsShownInSwitchers { get; set; } = true;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsLocked { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsAlwaysHideUnlockButton { get; set; } = false;
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsPinToTaskbar { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial TaskbarPlacement TaskbarPlacement { get; set; } = TaskbarPlacement.Right;
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsMaximized { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsFullscreen { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsLayoutOrientation LyricsLayoutOrientation { get; set; } = LyricsLayoutOrientation.Horizontal;
|
||||
@@ -48,15 +53,74 @@ namespace BetterLyrics.WinUI3.Models
|
||||
|
||||
public LyricsWindowStatus()
|
||||
{
|
||||
|
||||
LyricsStyleSettings.PropertyChanged += LyricsStyleSettings_PropertyChanged;
|
||||
LyricsEffectSettings.PropertyChanged += LyricsEffectSettings_PropertyChanged;
|
||||
LyricsBackgroundSettings.PropertyChanged += LyricsBackgroundSettings_PropertyChanged;
|
||||
AlbumArtLayoutSettings.PropertyChanged += AlbumArtLayoutSettings_PropertyChanged;
|
||||
AlbumArtAreaEffectSettings.PropertyChanged += AlbumArtAreaEffectSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
public LyricsWindowStatus(Window? targetWindow = null)
|
||||
public LyricsWindowStatus(Window? targetWindow = null) : this()
|
||||
{
|
||||
UpdateMonitorNameAndBounds(targetWindow);
|
||||
UpdateDemoWindowAndMonitorBounds();
|
||||
}
|
||||
|
||||
partial void OnLyricsStyleSettingsChanged(LyricsStyleSettings oldValue, LyricsStyleSettings newValue)
|
||||
{
|
||||
oldValue.PropertyChanged -= LyricsStyleSettings_PropertyChanged;
|
||||
newValue.PropertyChanged += LyricsStyleSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
private void LyricsStyleSettings_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(nameof(LyricsStyleSettings));
|
||||
}
|
||||
|
||||
partial void OnLyricsEffectSettingsChanged(LyricsEffectSettings oldValue, LyricsEffectSettings newValue)
|
||||
{
|
||||
oldValue.PropertyChanged -= LyricsEffectSettings_PropertyChanged;
|
||||
newValue.PropertyChanged += LyricsEffectSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
private void LyricsEffectSettings_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(nameof(LyricsEffectSettings));
|
||||
}
|
||||
|
||||
partial void OnLyricsBackgroundSettingsChanged(LyricsBackgroundSettings oldValue, LyricsBackgroundSettings newValue)
|
||||
{
|
||||
oldValue.PropertyChanged -= LyricsBackgroundSettings_PropertyChanged;
|
||||
newValue.PropertyChanged += LyricsBackgroundSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
private void LyricsBackgroundSettings_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(nameof(LyricsBackgroundSettings));
|
||||
}
|
||||
|
||||
partial void OnAlbumArtLayoutSettingsChanged(AlbumArtAreaStyleSettings oldValue, AlbumArtAreaStyleSettings newValue)
|
||||
{
|
||||
oldValue.PropertyChanged -= AlbumArtLayoutSettings_PropertyChanged;
|
||||
newValue.PropertyChanged += AlbumArtLayoutSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
private void AlbumArtLayoutSettings_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(nameof(AlbumArtLayoutSettings));
|
||||
}
|
||||
|
||||
partial void OnAlbumArtAreaEffectSettingsChanged(AlbumArtAreaEffectSettings oldValue, AlbumArtAreaEffectSettings newValue)
|
||||
{
|
||||
oldValue.PropertyChanged -= AlbumArtAreaEffectSettings_PropertyChanged;
|
||||
newValue.PropertyChanged += AlbumArtAreaEffectSettings_PropertyChanged;
|
||||
}
|
||||
|
||||
private void AlbumArtAreaEffectSettings_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(nameof(AlbumArtAreaEffectSettings));
|
||||
}
|
||||
|
||||
partial void OnWindowBoundsChanged(Rect value)
|
||||
{
|
||||
UpdateMonitorNameAndBounds();
|
||||
@@ -137,6 +201,11 @@ namespace BetterLyrics.WinUI3.Models
|
||||
IsAlwaysOnTopPolling = this.IsAlwaysOnTopPolling,
|
||||
IsShownInSwitchers = this.IsShownInSwitchers,
|
||||
IsLocked = this.IsLocked,
|
||||
IsAlwaysHideUnlockButton = this.IsAlwaysHideUnlockButton,
|
||||
|
||||
IsPinToTaskbar = this.IsPinToTaskbar,
|
||||
TaskbarPlacement = this.TaskbarPlacement,
|
||||
|
||||
IsMaximized = this.IsMaximized,
|
||||
IsFullscreen = this.IsFullscreen,
|
||||
|
||||
|
||||
@@ -12,6 +12,11 @@ namespace BetterLyrics.WinUI3.Models.Settings
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsPureColorOverlayEnabled { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int PureColorOverlayOpacity { get; set; } = 100; // 100 % = 1.0
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsCoverOverlayEnabled { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int CoverOverlayOpacity { get; set; } = 100; // 100 % = 1.0
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int CoverOverlaySpeed { get; set; } = 50;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int CoverOverlayBlurAmount { get; set; } = 100;
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsFluidOverlayEnabled { get; set; } = true;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int FluidOverlayOpacity { get; set; } = 100;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial PaletteGeneratorType PaletteGeneratorType { get; set; } = PaletteGeneratorType.MedianCut;
|
||||
@@ -39,14 +44,25 @@ namespace BetterLyrics.WinUI3.Models.Settings
|
||||
IsPureColorOverlayEnabled = this.IsPureColorOverlayEnabled,
|
||||
PureColorOverlayOpacity = this.PureColorOverlayOpacity,
|
||||
|
||||
IsCoverOverlayEnabled = this.IsCoverOverlayEnabled,
|
||||
CoverOverlayOpacity = this.CoverOverlayOpacity,
|
||||
CoverOverlaySpeed = this.CoverOverlaySpeed,
|
||||
CoverOverlayBlurAmount = this.CoverOverlayBlurAmount,
|
||||
|
||||
IsFluidOverlayEnabled = this.IsFluidOverlayEnabled,
|
||||
FluidOverlayOpacity = this.FluidOverlayOpacity,
|
||||
PaletteGeneratorType = this.PaletteGeneratorType,
|
||||
|
||||
IsSpectrumOverlayEnabled = this.IsSpectrumOverlayEnabled,
|
||||
SpectrumPlacement = this.SpectrumPlacement,
|
||||
SpectrumStyle = this.SpectrumStyle,
|
||||
SpectrumCount = this.SpectrumCount,
|
||||
|
||||
IsSnowFlakeOverlayEnabled = this.IsSnowFlakeOverlayEnabled,
|
||||
SnowFlakeOverlayAmount = this.SnowFlakeOverlayAmount,
|
||||
SnowFlakeOverlaySpeed = this.SnowFlakeOverlaySpeed,
|
||||
|
||||
IsFogOverlayEnabled = this.IsFogOverlayEnabled,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ namespace BetterLyrics.WinUI3.Models.Settings
|
||||
LyricsGlowEffectLongSyllableDuration = this.LyricsGlowEffectLongSyllableDuration,
|
||||
IsLyricsGlowEffectAmountAutoAdjust = this.IsLyricsGlowEffectAmountAutoAdjust,
|
||||
LyricsGlowEffectAmount = this.LyricsGlowEffectAmount,
|
||||
LyricsGlowEffectScope = this.LyricsGlowEffectScope,
|
||||
|
||||
IsLyricsScaleEffectEnabled = this.IsLyricsScaleEffectEnabled,
|
||||
LyricsScaleEffectLongSyllableDuration = this.LyricsScaleEffectLongSyllableDuration,
|
||||
|
||||
@@ -34,8 +34,8 @@ namespace BetterLyrics.WinUI3.Models.Settings
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial double LyricsLineSpacingFactor { get; set; } = 0.5;
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsCJKFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsWesternFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsCJKFontFamily { get; set; } = "Arial";
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsWesternFontFamily { get; set; } = "Arial";
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int PlayingLineTopOffset { get; set; } = 50; // 50 %
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace BetterLyrics.WinUI3.Models.Settings
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool AutoPlay { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsWindowStatus LyricsWindowStatus { get; set; } = new();
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool ExitOnWindowClosed { get; set; } = false;
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool StopOnWindowClosed { get; set; } = false;
|
||||
|
||||
public MusicGallerySettings() { }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
using BetterLyrics.WinUI3.Enums;
|
||||
using BetterLyrics.WinUI3.Helper;
|
||||
using Microsoft.Graphics.Canvas;
|
||||
using Microsoft.Graphics.Canvas.Effects;
|
||||
using Microsoft.Graphics.Canvas.UI.Xaml;
|
||||
using System;
|
||||
using System.Numerics;
|
||||
using Windows.Foundation;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Renderer
|
||||
{
|
||||
public partial class CoverBackgroundRenderer : IDisposable
|
||||
{
|
||||
private CanvasBitmap? _currentBitmap;
|
||||
private CanvasBitmap? _previousBitmap;
|
||||
|
||||
private CanvasRenderTarget? _currentTargetCache;
|
||||
private CanvasRenderTarget? _previousTargetCache;
|
||||
|
||||
private Size _lastScreenSize;
|
||||
private bool _lastWasRotating = false;
|
||||
|
||||
private readonly ValueTransition<double> _crossfadeTransition;
|
||||
private float _rotationAngle = 0f;
|
||||
|
||||
public bool IsEnabled { get; set; } = false;
|
||||
public int Opacity { get; set; } = 100;
|
||||
|
||||
private bool _needsCacheUpdate = false;
|
||||
|
||||
private int _blurAmount = 100;
|
||||
public int BlurAmount
|
||||
{
|
||||
get => _blurAmount;
|
||||
set
|
||||
{
|
||||
if (_blurAmount != value)
|
||||
{
|
||||
_blurAmount = value;
|
||||
_needsCacheUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int _speed = 100;
|
||||
public int Speed
|
||||
{
|
||||
get => _speed;
|
||||
set
|
||||
{
|
||||
if (_speed != value)
|
||||
{
|
||||
_speed = value;
|
||||
_needsCacheUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public CoverBackgroundRenderer()
|
||||
{
|
||||
_crossfadeTransition = new ValueTransition<double>(1.0, 0.7, easingType: EasingType.Linear);
|
||||
}
|
||||
|
||||
public void SetCoverBitmap(CanvasBitmap? newBitmap)
|
||||
{
|
||||
if (_currentBitmap == newBitmap) return;
|
||||
|
||||
_previousBitmap = _currentBitmap;
|
||||
_previousTargetCache = _currentTargetCache;
|
||||
_currentTargetCache = null;
|
||||
|
||||
_currentBitmap = newBitmap;
|
||||
|
||||
if (_currentBitmap == null)
|
||||
{
|
||||
_crossfadeTransition.StartTransition(1.0, jumpTo: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_previousBitmap == null)
|
||||
{
|
||||
_crossfadeTransition.StartTransition(1.0, jumpTo: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
_crossfadeTransition.Reset(0.0);
|
||||
_crossfadeTransition.StartTransition(1.0);
|
||||
}
|
||||
}
|
||||
|
||||
_needsCacheUpdate = true;
|
||||
}
|
||||
|
||||
public void Update(TimeSpan deltaTime)
|
||||
{
|
||||
if (!IsEnabled) return;
|
||||
|
||||
_crossfadeTransition.Update(deltaTime);
|
||||
|
||||
if (Speed > 0)
|
||||
{
|
||||
float baseSpeed = 0.6f;
|
||||
float currentSpeed = (Speed / 100.0f) * baseSpeed;
|
||||
_rotationAngle += currentSpeed * (float)deltaTime.TotalSeconds;
|
||||
_rotationAngle %= (float)(2 * Math.PI);
|
||||
}
|
||||
|
||||
if (_crossfadeTransition.Value >= 1.0 && _previousBitmap != null)
|
||||
{
|
||||
_previousBitmap = null;
|
||||
_previousTargetCache?.Dispose();
|
||||
_previousTargetCache = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Draw(ICanvasAnimatedControl control, CanvasDrawingSession ds)
|
||||
{
|
||||
if (!IsEnabled || Opacity <= 0) return;
|
||||
|
||||
if (_lastScreenSize != control.Size)
|
||||
{
|
||||
_lastScreenSize = control.Size;
|
||||
_needsCacheUpdate = true;
|
||||
}
|
||||
|
||||
bool isRotating = Speed > 0;
|
||||
if (_lastWasRotating != isRotating)
|
||||
{
|
||||
_lastWasRotating = isRotating;
|
||||
_needsCacheUpdate = true;
|
||||
}
|
||||
|
||||
EnsureCachedLayer(control, _currentBitmap, ref _currentTargetCache);
|
||||
|
||||
float baseAlpha = Opacity / 100.0f;
|
||||
float angle = isRotating ? _rotationAngle : 0f;
|
||||
double fadeProgress = _crossfadeTransition.Value;
|
||||
bool isCrossfading = fadeProgress < 1.0 && _previousTargetCache != null;
|
||||
|
||||
Vector2 screenCenter = new Vector2((float)control.Size.Width / 2f, (float)control.Size.Height / 2f);
|
||||
|
||||
if (isCrossfading)
|
||||
{
|
||||
DrawCachedLayer(ds, _previousTargetCache, screenCenter, angle, baseAlpha);
|
||||
|
||||
float newLayerAlpha = baseAlpha * (float)fadeProgress;
|
||||
DrawCachedLayer(ds, _currentTargetCache, screenCenter, angle, newLayerAlpha);
|
||||
}
|
||||
else if (_currentTargetCache != null)
|
||||
{
|
||||
DrawCachedLayer(ds, _currentTargetCache, screenCenter, angle, baseAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureCachedLayer(ICanvasResourceCreator resourceCreator, CanvasBitmap? sourceBitmap, ref CanvasRenderTarget? targetCache)
|
||||
{
|
||||
if (sourceBitmap == null)
|
||||
{
|
||||
targetCache?.Dispose();
|
||||
targetCache = null;
|
||||
return;
|
||||
}
|
||||
|
||||
bool deviceMismatch = targetCache != null && targetCache.Device != resourceCreator.Device;
|
||||
|
||||
if (_needsCacheUpdate || targetCache == null || deviceMismatch)
|
||||
{
|
||||
targetCache?.Dispose();
|
||||
|
||||
float imgW = sourceBitmap.SizeInPixels.Width;
|
||||
float imgH = sourceBitmap.SizeInPixels.Height;
|
||||
Size screenSize = _lastScreenSize;
|
||||
|
||||
float scale;
|
||||
if (_lastWasRotating) // Speed > 0
|
||||
{
|
||||
float screenDiagonal = (float)Math.Sqrt(screenSize.Width * screenSize.Width + screenSize.Height * screenSize.Height);
|
||||
scale = Math.Max(screenDiagonal / imgW, screenDiagonal / imgH);
|
||||
}
|
||||
else
|
||||
{
|
||||
float scaleX = (float)screenSize.Width / imgW;
|
||||
float scaleY = (float)screenSize.Height / imgH;
|
||||
scale = Math.Max(scaleX, scaleY);
|
||||
}
|
||||
|
||||
float targetW = imgW * scale;
|
||||
float targetH = imgH * scale;
|
||||
|
||||
targetCache = new CanvasRenderTarget(resourceCreator, targetW, targetH, sourceBitmap.Dpi);
|
||||
|
||||
using (var ds = targetCache.CreateDrawingSession())
|
||||
{
|
||||
ds.Clear(Windows.UI.Color.FromArgb(0, 0, 0, 0));
|
||||
|
||||
using (var transformEffect = new Transform2DEffect())
|
||||
using (var blurEffect = new GaussianBlurEffect())
|
||||
{
|
||||
transformEffect.Source = sourceBitmap;
|
||||
transformEffect.TransformMatrix = Matrix3x2.CreateScale(scale);
|
||||
transformEffect.InterpolationMode = CanvasImageInterpolation.Linear;
|
||||
|
||||
blurEffect.Source = transformEffect;
|
||||
blurEffect.BlurAmount = BlurAmount;
|
||||
blurEffect.BorderMode = EffectBorderMode.Hard;
|
||||
|
||||
ds.DrawImage(blurEffect);
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceBitmap == _currentBitmap)
|
||||
{
|
||||
_needsCacheUpdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawCachedLayer(CanvasDrawingSession ds, CanvasRenderTarget? cachedTexture, Vector2 screenCenter, float rotationRadians, float alpha)
|
||||
{
|
||||
if (cachedTexture == null) return;
|
||||
|
||||
Vector2 textureCenter = new Vector2((float)cachedTexture.Size.Width / 2f, (float)cachedTexture.Size.Height / 2f);
|
||||
|
||||
Matrix3x2 transform =
|
||||
Matrix3x2.CreateTranslation(-textureCenter) * Matrix3x2.CreateRotation(rotationRadians) * Matrix3x2.CreateTranslation(screenCenter);
|
||||
|
||||
Matrix3x2 previousTransform = ds.Transform;
|
||||
|
||||
ds.Transform = transform * previousTransform;
|
||||
ds.DrawImage(cachedTexture, 0, 0, new Rect(0, 0, cachedTexture.Size.Width, cachedTexture.Size.Height), alpha);
|
||||
|
||||
ds.Transform = previousTransform;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_currentBitmap?.Dispose();
|
||||
_previousBitmap?.Dispose();
|
||||
|
||||
_currentTargetCache?.Dispose();
|
||||
_previousTargetCache?.Dispose();
|
||||
|
||||
_currentBitmap = null;
|
||||
_previousBitmap = null;
|
||||
_currentTargetCache = null;
|
||||
_previousTargetCache = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,7 +135,8 @@ namespace BetterLyrics.WinUI3.Renderer
|
||||
var effectSettings = windowStatus.LyricsEffectSettings;
|
||||
var styleSettings = windowStatus.LyricsStyleSettings;
|
||||
|
||||
var rotationY = currentPlayingLine.OriginalPosition.WithX(effectSettings.FanLyricsAngle < 0 ? (float)lyricsWidth : 0);
|
||||
var rotationX = effectSettings.FanLyricsAngle < 0 ? lyricsWidth : 0;
|
||||
rotationX += lyricsWidth / 2 * (effectSettings.FanLyricsAngle < 0 ? 1 : -1);
|
||||
|
||||
for (int i = startVisibleIndex; i <= endVisibleIndex; i++)
|
||||
{
|
||||
@@ -145,14 +146,19 @@ namespace BetterLyrics.WinUI3.Renderer
|
||||
if (line.OriginalCanvasTextLayout == null) continue;
|
||||
if (line.OriginalCanvasTextLayout.LayoutBounds.Width <= 0) continue;
|
||||
|
||||
double xOffset = lyricsX;
|
||||
double yOffset = line.YOffsetTransition.Value + userScrollOffset + lyricsY + lyricsHeight * playingLineTopOffsetFactor;
|
||||
|
||||
var transform =
|
||||
Matrix3x2.CreateScale((float)line.ScaleTransition.Value, line.CenterPosition) *
|
||||
Matrix3x2.CreateRotation((float)line.AngleTransition.Value, rotationY) *
|
||||
Matrix3x2.CreateTranslation((float)lyricsX, (float)yOffset);
|
||||
ds.Transform = Matrix3x2.CreateScale((float)line.ScaleTransition.Value, line.CenterPosition);
|
||||
|
||||
ds.Transform = transform;
|
||||
if (effectSettings.IsFanLyricsEnabled)
|
||||
{
|
||||
xOffset += Math.Abs(line.AngleTransition.Value) / (Math.PI / 2) * lyricsWidth / 2 * (effectSettings.FanLyricsAngle < 0 ? 1 : -1);
|
||||
var rotationY = line.CenterPosition.Y;
|
||||
ds.Transform *= Matrix3x2.CreateRotation((float)line.AngleTransition.Value, new Vector2((float)rotationX, rotationY));
|
||||
}
|
||||
|
||||
ds.Transform *= Matrix3x2.CreateTranslation((float)xOffset, (float)yOffset);
|
||||
|
||||
using (var textOnlyLayer = RenderBaseTextLayer(control, line, styleSettings.LyricsFontStrokeWidth, strokeColor, line.ColorTransition.Value))
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@ using Microsoft.UI.Xaml.Media.Imaging;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Graphics.Imaging;
|
||||
using Windows.Storage.Streams;
|
||||
using Windows.UI;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
@@ -29,6 +29,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
LyricsData? CurrentLyricsData { get; }
|
||||
|
||||
BitmapImage? AlbumArtBitmapImage { get; }
|
||||
IRandomAccessStream? AlbumArtBitmapStream { get; }
|
||||
|
||||
AlbumArtThemeColors CalculateAlbumArtThemeColors(LyricsWindowStatus lyricsWindowStatus, Color backdropAccentColor);
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Vanara.PInvoke;
|
||||
using Windows.Graphics.Imaging;
|
||||
using Windows.Storage.Streams;
|
||||
using Windows.UI;
|
||||
@@ -22,15 +21,16 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
public partial class MediaSessionsService : IMediaSessionsService
|
||||
{
|
||||
private readonly LatestOnlyTaskRunner _albumArtRefreshRunner = new();
|
||||
|
||||
|
||||
private List<Color> _lightAccentColorsMedianCut = Enumerable.Repeat(Colors.Black, 4).ToList();
|
||||
private List<Color> _darkAccentColorsMedianCut = Enumerable.Repeat(Colors.Black, 4).ToList();
|
||||
private List<Color> _lightAccentColorsOctTree = Enumerable.Repeat(Colors.Black, 4).ToList();
|
||||
private List<Color> _darkAccentColorsOctTree = Enumerable.Repeat(Colors.Black, 4).ToList();
|
||||
|
||||
private BitmapDecoder? _albumArtBitmapDecoder = null;
|
||||
|
||||
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial BitmapImage? AlbumArtBitmapImage { get; set; }
|
||||
[ObservableProperty][NotifyPropertyChangedRecipients] public partial IRandomAccessStream? AlbumArtBitmapStream { get; set; }
|
||||
|
||||
private void UpdateAlbumArt()
|
||||
{
|
||||
@@ -63,16 +63,16 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
_albumArtBitmapDecoder = await ImageHelper.GetBitmapDecoder(buffer);
|
||||
if (token.IsCancellationRequested) return;
|
||||
|
||||
_lightAccentColorsMedianCut =
|
||||
_lightAccentColorsMedianCut =
|
||||
(await ImageHelper.GetAccentColorsAsync(_albumArtBitmapDecoder, 4, PaletteGeneratorType.MedianCut, false))
|
||||
.Palette.Select(Helper.ColorHelper.FromVector3).ToList();
|
||||
_darkAccentColorsMedianCut =
|
||||
_darkAccentColorsMedianCut =
|
||||
(await ImageHelper.GetAccentColorsAsync(_albumArtBitmapDecoder, 4, PaletteGeneratorType.MedianCut, true))
|
||||
.Palette.Select(Helper.ColorHelper.FromVector3).ToList();
|
||||
_lightAccentColorsOctTree =
|
||||
_lightAccentColorsOctTree =
|
||||
(await ImageHelper.GetAccentColorsAsync(_albumArtBitmapDecoder, 4, PaletteGeneratorType.OctTree, false))
|
||||
.Palette.Select(Helper.ColorHelper.FromVector3).ToList();
|
||||
_darkAccentColorsOctTree =
|
||||
_darkAccentColorsOctTree =
|
||||
(await ImageHelper.GetAccentColorsAsync(_albumArtBitmapDecoder, 4, PaletteGeneratorType.OctTree, true))
|
||||
.Palette.Select(Helper.ColorHelper.FromVector3).ToList();
|
||||
|
||||
@@ -81,6 +81,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
if (token.IsCancellationRequested) return;
|
||||
|
||||
AlbumArtBitmapImage = bitmapImage;
|
||||
AlbumArtBitmapStream = ImageHelper.ToIRandomAccessStream(buffer);
|
||||
}
|
||||
|
||||
public AlbumArtThemeColors CalculateAlbumArtThemeColors(LyricsWindowStatus lyricsWindowStatus, Color backdropAccentColor)
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
<value>Contributors</value>
|
||||
</data>
|
||||
<data name="SetingsPageDeps.Text" xml:space="preserve">
|
||||
<value>Dependent package</value>
|
||||
<value>Code Reference</value>
|
||||
</data>
|
||||
<data name="SetingsPageDonation.Text" xml:space="preserve">
|
||||
<value>Donation</value>
|
||||
@@ -555,9 +555,15 @@
|
||||
<data name="SetingsPageInstructions.Text" xml:space="preserve">
|
||||
<value>Instructions</value>
|
||||
</data>
|
||||
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
|
||||
<value>Special Thanks</value>
|
||||
</data>
|
||||
<data name="SetingsPageThanks.Text" xml:space="preserve">
|
||||
<value>If you like this project, please consider supporting it by donating. Your support will help keep the project alive and encourage further development.</value>
|
||||
</data>
|
||||
<data name="SetingsPageUIUXRef.Text" xml:space="preserve">
|
||||
<value>UI/UX Design Reference</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[Experimental] Depth effect</value>
|
||||
</data>
|
||||
@@ -624,6 +630,9 @@
|
||||
<data name="SettingsPageAlignment.Header" xml:space="preserve">
|
||||
<value>Alignment</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlwaysHideUnlockButton.Header" xml:space="preserve">
|
||||
<value>Always hide unlock button</value>
|
||||
</data>
|
||||
<data name="SettingsPageAmllTtmlDbBaseUrl.Header" xml:space="preserve">
|
||||
<value>Base URL</value>
|
||||
</data>
|
||||
@@ -675,6 +684,9 @@
|
||||
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
|
||||
<value>Lyrics background</value>
|
||||
</data>
|
||||
<data name="SettingsPageBlurAmount.Header" xml:space="preserve">
|
||||
<value>Blur amount</value>
|
||||
</data>
|
||||
<data name="SettingsPageBorderless.Header" xml:space="preserve">
|
||||
<value>Borderless window</value>
|
||||
</data>
|
||||
@@ -1297,7 +1309,7 @@
|
||||
<value>The path cannot be found on your computer</value>
|
||||
</data>
|
||||
<data name="SettingsPagePatrons.Text" xml:space="preserve">
|
||||
<value>Special Thanks</value>
|
||||
<value>Sponsor</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>Lyric annotation</value>
|
||||
@@ -1305,6 +1317,9 @@
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>Phonetic symbols</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>Pin to taskbar</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinyin.Content" xml:space="preserve">
|
||||
<value>Pinyin of Mandarin</value>
|
||||
</data>
|
||||
@@ -1497,6 +1512,9 @@
|
||||
<data name="SettingsPageStartup.Text" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>Stop playing when music library is closed</value>
|
||||
</data>
|
||||
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
|
||||
<value>Stroke color</value>
|
||||
</data>
|
||||
@@ -1506,6 +1524,12 @@
|
||||
<data name="SettingsPageTargetLanguage.Header" xml:space="preserve">
|
||||
<value>Target language</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarMode.Text" xml:space="preserve">
|
||||
<value>Taskbar mode</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
|
||||
<value>Taskbar fixed position</value>
|
||||
</data>
|
||||
<data name="SettingsPageTC.Content" xml:space="preserve">
|
||||
<value>繁體中文</value>
|
||||
</data>
|
||||
@@ -1563,6 +1587,9 @@
|
||||
<data name="SettingsPageTransparent.Content" xml:space="preserve">
|
||||
<value>Transparent</value>
|
||||
</data>
|
||||
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
|
||||
<value>And buy users who support BetterLyrics</value>
|
||||
</data>
|
||||
<data name="SettingsPageVersion.Text" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
@@ -1620,6 +1647,9 @@
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>Lyrics window switcher</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>Taskbar mode</value>
|
||||
</data>
|
||||
<data name="TermsOfService.Content" xml:space="preserve">
|
||||
<value>Terms of service</value>
|
||||
</data>
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
<value>投稿者</value>
|
||||
</data>
|
||||
<data name="SetingsPageDeps.Text" xml:space="preserve">
|
||||
<value>依存パッケージ</value>
|
||||
<value>コードリファレンス</value>
|
||||
</data>
|
||||
<data name="SetingsPageDonation.Text" xml:space="preserve">
|
||||
<value>寄付</value>
|
||||
@@ -555,9 +555,15 @@
|
||||
<data name="SetingsPageInstructions.Text" xml:space="preserve">
|
||||
<value>手順</value>
|
||||
</data>
|
||||
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
|
||||
<value>スペシャルサンクス</value>
|
||||
</data>
|
||||
<data name="SetingsPageThanks.Text" xml:space="preserve">
|
||||
<value>このプロジェクトが気に入っている場合は、寄付してサポートすることを検討してください。あなたのサポートは、プロジェクトを生かし続け、さらなる開発を促進するのに役立ちます。</value>
|
||||
</data>
|
||||
<data name="SetingsPageUIUXRef.Text" xml:space="preserve">
|
||||
<value>UI/UXデザインリファレンス</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[実験的] 奥行き効果</value>
|
||||
</data>
|
||||
@@ -624,6 +630,9 @@
|
||||
<data name="SettingsPageAlignment.Header" xml:space="preserve">
|
||||
<value>アライメント</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlwaysHideUnlockButton.Header" xml:space="preserve">
|
||||
<value>ロック解除ボタンは常に隠しておきましょう</value>
|
||||
</data>
|
||||
<data name="SettingsPageAmllTtmlDbBaseUrl.Header" xml:space="preserve">
|
||||
<value>ベースURL</value>
|
||||
</data>
|
||||
@@ -675,6 +684,9 @@
|
||||
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
|
||||
<value>歌詞の背景</value>
|
||||
</data>
|
||||
<data name="SettingsPageBlurAmount.Header" xml:space="preserve">
|
||||
<value>あいまい</value>
|
||||
</data>
|
||||
<data name="SettingsPageBorderless.Header" xml:space="preserve">
|
||||
<value>ボーダーレスウィンドウ</value>
|
||||
</data>
|
||||
@@ -1297,7 +1309,7 @@
|
||||
<value>パスはコンピューターでは見つかりません</value>
|
||||
</data>
|
||||
<data name="SettingsPagePatrons.Text" xml:space="preserve">
|
||||
<value>スペシャルサンクス</value>
|
||||
<value>後援しました</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>リリックアノテーション</value>
|
||||
@@ -1305,6 +1317,9 @@
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>発音</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>タスクバーに移動</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinyin.Content" xml:space="preserve">
|
||||
<value>マンダリンのピンイン</value>
|
||||
</data>
|
||||
@@ -1497,6 +1512,9 @@
|
||||
<data name="SettingsPageStartup.Text" xml:space="preserve">
|
||||
<value>起動</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>音楽ライブラリが閉じられたら、再生を停止してください</value>
|
||||
</data>
|
||||
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
|
||||
<value>ストロークカラー</value>
|
||||
</data>
|
||||
@@ -1506,6 +1524,12 @@
|
||||
<data name="SettingsPageTargetLanguage.Header" xml:space="preserve">
|
||||
<value>ターゲット言語</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarMode.Text" xml:space="preserve">
|
||||
<value>タスクバーモード</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
|
||||
<value>タスクバーの位置が固定されました</value>
|
||||
</data>
|
||||
<data name="SettingsPageTC.Content" xml:space="preserve">
|
||||
<value>繁體中文</value>
|
||||
</data>
|
||||
@@ -1563,6 +1587,9 @@
|
||||
<data name="SettingsPageTransparent.Content" xml:space="preserve">
|
||||
<value>透明</value>
|
||||
</data>
|
||||
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
|
||||
<value>そして、BetterLyricsをサポートするユーザーを購入しましょう</value>
|
||||
</data>
|
||||
<data name="SettingsPageVersion.Text" xml:space="preserve">
|
||||
<value>バージョン</value>
|
||||
</data>
|
||||
@@ -1620,6 +1647,9 @@
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>歌詞ウィンドウスイッチャー</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>タスクバーモード</value>
|
||||
</data>
|
||||
<data name="TermsOfService.Content" xml:space="preserve">
|
||||
<value>利用規約</value>
|
||||
</data>
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
<value>기여자</value>
|
||||
</data>
|
||||
<data name="SetingsPageDeps.Text" xml:space="preserve">
|
||||
<value>종속 패키지</value>
|
||||
<value>코드 참조</value>
|
||||
</data>
|
||||
<data name="SetingsPageDonation.Text" xml:space="preserve">
|
||||
<value>기부</value>
|
||||
@@ -555,9 +555,15 @@
|
||||
<data name="SetingsPageInstructions.Text" xml:space="preserve">
|
||||
<value>지침</value>
|
||||
</data>
|
||||
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
|
||||
<value>특별 감사 인사</value>
|
||||
</data>
|
||||
<data name="SetingsPageThanks.Text" xml:space="preserve">
|
||||
<value>이 프로젝트가 마음에 들면 기부하여 지원을 고려하십시오. 귀하의 지원은 프로젝트를 계속 유지하고 추가 개발을 장려하는 데 도움이 될 것입니다.</value>
|
||||
</data>
|
||||
<data name="SetingsPageUIUXRef.Text" xml:space="preserve">
|
||||
<value>UI/UX 디자인 참조</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[실험] 깊이 효과</value>
|
||||
</data>
|
||||
@@ -624,6 +630,9 @@
|
||||
<data name="SettingsPageAlignment.Header" xml:space="preserve">
|
||||
<value>조정</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlwaysHideUnlockButton.Header" xml:space="preserve">
|
||||
<value>항상 잠금 해제 버튼을 숨깁니다</value>
|
||||
</data>
|
||||
<data name="SettingsPageAmllTtmlDbBaseUrl.Header" xml:space="preserve">
|
||||
<value>기본 URL</value>
|
||||
</data>
|
||||
@@ -675,6 +684,9 @@
|
||||
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
|
||||
<value>가사 배경</value>
|
||||
</data>
|
||||
<data name="SettingsPageBlurAmount.Header" xml:space="preserve">
|
||||
<value>모호함</value>
|
||||
</data>
|
||||
<data name="SettingsPageBorderless.Header" xml:space="preserve">
|
||||
<value>창문</value>
|
||||
</data>
|
||||
@@ -1297,7 +1309,7 @@
|
||||
<value>경로는 컴퓨터에서 찾을 수 없습니다</value>
|
||||
</data>
|
||||
<data name="SettingsPagePatrons.Text" xml:space="preserve">
|
||||
<value>특별 감사 인사</value>
|
||||
<value>스폰서</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>가사 주석</value>
|
||||
@@ -1305,6 +1317,9 @@
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>발성</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>작업 표시줄에 고정</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinyin.Content" xml:space="preserve">
|
||||
<value>만다린의 피니 인</value>
|
||||
</data>
|
||||
@@ -1497,6 +1512,9 @@
|
||||
<data name="SettingsPageStartup.Text" xml:space="preserve">
|
||||
<value>시작</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>음악 라이브러리가 닫히면 재생을 중지하십시오</value>
|
||||
</data>
|
||||
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
|
||||
<value>윤곽선 색상</value>
|
||||
</data>
|
||||
@@ -1506,6 +1524,12 @@
|
||||
<data name="SettingsPageTargetLanguage.Header" xml:space="preserve">
|
||||
<value>대상 언어</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarMode.Text" xml:space="preserve">
|
||||
<value>작업 표시줄</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
|
||||
<value>작업 표시줄 고정 위치</value>
|
||||
</data>
|
||||
<data name="SettingsPageTC.Content" xml:space="preserve">
|
||||
<value>繁體中文</value>
|
||||
</data>
|
||||
@@ -1563,6 +1587,9 @@
|
||||
<data name="SettingsPageTransparent.Content" xml:space="preserve">
|
||||
<value>투명한</value>
|
||||
</data>
|
||||
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
|
||||
<value>그리고 BetterLyrics를 지원하는 사용자를 구입하세요</value>
|
||||
</data>
|
||||
<data name="SettingsPageVersion.Text" xml:space="preserve">
|
||||
<value>버전</value>
|
||||
</data>
|
||||
@@ -1620,6 +1647,9 @@
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>가사 창 전환기</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>작업 표시줄</value>
|
||||
</data>
|
||||
<data name="TermsOfService.Content" xml:space="preserve">
|
||||
<value>서비스 약관</value>
|
||||
</data>
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
<value>贡献者</value>
|
||||
</data>
|
||||
<data name="SetingsPageDeps.Text" xml:space="preserve">
|
||||
<value>依赖包</value>
|
||||
<value>代码参考</value>
|
||||
</data>
|
||||
<data name="SetingsPageDonation.Text" xml:space="preserve">
|
||||
<value>捐贈</value>
|
||||
@@ -555,9 +555,15 @@
|
||||
<data name="SetingsPageInstructions.Text" xml:space="preserve">
|
||||
<value>操作指南</value>
|
||||
</data>
|
||||
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
|
||||
<value>特别鸣谢</value>
|
||||
</data>
|
||||
<data name="SetingsPageThanks.Text" xml:space="preserve">
|
||||
<value>如果您喜欢这个项目,请考虑通过捐赠来支持它。您的支持将有助于保持项目的生命并鼓励进一步的发展。</value>
|
||||
</data>
|
||||
<data name="SetingsPageUIUXRef.Text" xml:space="preserve">
|
||||
<value>UI/UX 设计参考</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[实验性] 纵深效果</value>
|
||||
</data>
|
||||
@@ -624,6 +630,9 @@
|
||||
<data name="SettingsPageAlignment.Header" xml:space="preserve">
|
||||
<value>对齐方式</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlwaysHideUnlockButton.Header" xml:space="preserve">
|
||||
<value>总是隐藏解锁按钮</value>
|
||||
</data>
|
||||
<data name="SettingsPageAmllTtmlDbBaseUrl.Header" xml:space="preserve">
|
||||
<value>基本 URL</value>
|
||||
</data>
|
||||
@@ -675,6 +684,9 @@
|
||||
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
|
||||
<value>歌词背景</value>
|
||||
</data>
|
||||
<data name="SettingsPageBlurAmount.Header" xml:space="preserve">
|
||||
<value>模糊度</value>
|
||||
</data>
|
||||
<data name="SettingsPageBorderless.Header" xml:space="preserve">
|
||||
<value>无边框窗口</value>
|
||||
</data>
|
||||
@@ -1297,7 +1309,7 @@
|
||||
<value>无法在您的计算机中找到该路径</value>
|
||||
</data>
|
||||
<data name="SettingsPagePatrons.Text" xml:space="preserve">
|
||||
<value>特别鸣谢</value>
|
||||
<value>赞助</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>歌词注音</value>
|
||||
@@ -1305,6 +1317,9 @@
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>注音</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>固定到任务栏</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinyin.Content" xml:space="preserve">
|
||||
<value>普通话拼音</value>
|
||||
</data>
|
||||
@@ -1497,6 +1512,9 @@
|
||||
<data name="SettingsPageStartup.Text" xml:space="preserve">
|
||||
<value>启动</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>关闭音乐库时停止播放</value>
|
||||
</data>
|
||||
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
|
||||
<value>描边颜色</value>
|
||||
</data>
|
||||
@@ -1506,6 +1524,12 @@
|
||||
<data name="SettingsPageTargetLanguage.Header" xml:space="preserve">
|
||||
<value>目标语言</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarMode.Text" xml:space="preserve">
|
||||
<value>任务栏模式</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
|
||||
<value>任务栏固定位置</value>
|
||||
</data>
|
||||
<data name="SettingsPageTC.Content" xml:space="preserve">
|
||||
<value>繁體中文</value>
|
||||
</data>
|
||||
@@ -1563,6 +1587,9 @@
|
||||
<data name="SettingsPageTransparent.Content" xml:space="preserve">
|
||||
<value>透明</value>
|
||||
</data>
|
||||
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
|
||||
<value>以及购买支持 BetterLyrics 的用户</value>
|
||||
</data>
|
||||
<data name="SettingsPageVersion.Text" xml:space="preserve">
|
||||
<value>版本号</value>
|
||||
</data>
|
||||
@@ -1620,6 +1647,9 @@
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>歌词窗口切换器</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>任务栏模式</value>
|
||||
</data>
|
||||
<data name="TermsOfService.Content" xml:space="preserve">
|
||||
<value>服务条款</value>
|
||||
</data>
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
<value>貢獻者</value>
|
||||
</data>
|
||||
<data name="SetingsPageDeps.Text" xml:space="preserve">
|
||||
<value>依賴包</value>
|
||||
<value>代碼參考</value>
|
||||
</data>
|
||||
<data name="SetingsPageDonation.Text" xml:space="preserve">
|
||||
<value>捐贈</value>
|
||||
@@ -555,9 +555,15 @@
|
||||
<data name="SetingsPageInstructions.Text" xml:space="preserve">
|
||||
<value>說明</value>
|
||||
</data>
|
||||
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
|
||||
<value>特别鸣谢</value>
|
||||
</data>
|
||||
<data name="SetingsPageThanks.Text" xml:space="preserve">
|
||||
<value>如果您喜歡這個項目,請考慮通過捐贈來支持它。您的支持將有助於保持項目的生命並鼓勵進一步的發展。</value>
|
||||
</data>
|
||||
<data name="SetingsPageUIUXRef.Text" xml:space="preserve">
|
||||
<value>UI/UX 設計參考</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[實驗性] 縱深效果</value>
|
||||
</data>
|
||||
@@ -624,6 +630,9 @@
|
||||
<data name="SettingsPageAlignment.Header" xml:space="preserve">
|
||||
<value>對齊方式</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlwaysHideUnlockButton.Header" xml:space="preserve">
|
||||
<value>總是隱藏解鎖按鈕</value>
|
||||
</data>
|
||||
<data name="SettingsPageAmllTtmlDbBaseUrl.Header" xml:space="preserve">
|
||||
<value>基本網址</value>
|
||||
</data>
|
||||
@@ -675,6 +684,9 @@
|
||||
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
|
||||
<value>歌詞背景</value>
|
||||
</data>
|
||||
<data name="SettingsPageBlurAmount.Header" xml:space="preserve">
|
||||
<value>模糊度</value>
|
||||
</data>
|
||||
<data name="SettingsPageBorderless.Header" xml:space="preserve">
|
||||
<value>無邊框窗口</value>
|
||||
</data>
|
||||
@@ -1297,7 +1309,7 @@
|
||||
<value>無法在您的電腦中找到該路徑</value>
|
||||
</data>
|
||||
<data name="SettingsPagePatrons.Text" xml:space="preserve">
|
||||
<value>特別鳴謝</value>
|
||||
<value>贊助</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>歌詞注音</value>
|
||||
@@ -1305,6 +1317,9 @@
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>注音</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>釘選到任務列</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinyin.Content" xml:space="preserve">
|
||||
<value>普通話拼音</value>
|
||||
</data>
|
||||
@@ -1497,6 +1512,9 @@
|
||||
<data name="SettingsPageStartup.Text" xml:space="preserve">
|
||||
<value>啟動</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>關閉音樂庫時停止播放</value>
|
||||
</data>
|
||||
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
|
||||
<value>描邊顏色</value>
|
||||
</data>
|
||||
@@ -1506,6 +1524,12 @@
|
||||
<data name="SettingsPageTargetLanguage.Header" xml:space="preserve">
|
||||
<value>目標語言</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarMode.Text" xml:space="preserve">
|
||||
<value>任務列模式</value>
|
||||
</data>
|
||||
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
|
||||
<value>工作列固定位置</value>
|
||||
</data>
|
||||
<data name="SettingsPageTC.Content" xml:space="preserve">
|
||||
<value>繁體中文</value>
|
||||
</data>
|
||||
@@ -1563,6 +1587,9 @@
|
||||
<data name="SettingsPageTransparent.Content" xml:space="preserve">
|
||||
<value>透明</value>
|
||||
</data>
|
||||
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
|
||||
<value>以及購買支援BetterLyrics 的用戶</value>
|
||||
</data>
|
||||
<data name="SettingsPageVersion.Text" xml:space="preserve">
|
||||
<value>版本號</value>
|
||||
</data>
|
||||
@@ -1620,6 +1647,9 @@
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>歌詞視窗切換器</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>任務列模式</value>
|
||||
</data>
|
||||
<data name="TermsOfService.Content" xml:space="preserve">
|
||||
<value>服務條款</value>
|
||||
</data>
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
using BetterLyrics.WinUI3.Helper.BetterLyrics.WinUI3.Helper;
|
||||
using BetterLyrics.WinUI3.Hooks;
|
||||
using BetterLyrics.WinUI3.Models.Settings;
|
||||
using BetterLyrics.WinUI3.Services.ResourceService;
|
||||
using BetterLyrics.WinUI3.Services.SettingsService;
|
||||
using BetterLyrics.WinUI3.Views;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
@@ -10,8 +9,6 @@ using CommunityToolkit.Mvvm.Input;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Services.Store;
|
||||
using Windows.System;
|
||||
|
||||
namespace BetterLyrics.WinUI3.ViewModels
|
||||
{
|
||||
|
||||
@@ -69,6 +69,12 @@ namespace BetterLyrics.WinUI3.ViewModels
|
||||
AppSettings.WindowBoundsRecords.Add(LyricsWindowStatusExtensions.NarrowMode());
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void CreateTaskbarLyricsWindowStatus()
|
||||
{
|
||||
AppSettings.WindowBoundsRecords.Add(LyricsWindowStatusExtensions.TaskbarMode());
|
||||
}
|
||||
|
||||
public void OpenConfigPanel()
|
||||
{
|
||||
IsConfigPanelOpened = true;
|
||||
|
||||
@@ -178,7 +178,10 @@ namespace BetterLyrics.WinUI3.Views
|
||||
private void Page_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel.CancelRefreshSongs();
|
||||
ViewModel.StopTrackCommand.Execute(null);
|
||||
if (ViewModel.AppSettings.MusicGallerySettings.StopOnWindowClosed)
|
||||
{
|
||||
ViewModel.StopTrackCommand.Execute(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void PlaylistFavButton_Click(object sender, RoutedEventArgs e)
|
||||
|
||||
@@ -11,7 +11,6 @@ using Microsoft.UI.Windowing;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Media.Imaging;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Graphics.Imaging;
|
||||
|
||||
// To learn more about WinUI, the WinUI project structure,
|
||||
// and more about our project templates, see: http://aka.ms/winui-project-info.
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
xmlns:behaviors="using:CommunityToolkit.WinUI.Behaviors"
|
||||
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:dev="using:DevWinUI"
|
||||
xmlns:local="using:BetterLyrics.WinUI3.Views"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:media="using:CommunityToolkit.WinUI.Media"
|
||||
@@ -14,6 +15,7 @@
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid x:Name="RootGrid" SizeChanged="RootGrid_SizeChanged">
|
||||
|
||||
<Grid
|
||||
x:Name="PlaceholderGrid"
|
||||
Width="1"
|
||||
@@ -27,7 +29,7 @@
|
||||
<Grid
|
||||
x:Name="TopCommandGrid"
|
||||
VerticalAlignment="Top"
|
||||
Background="{ThemeResource AcrylicInAppFillColorDefaultBrush}"
|
||||
Background="{ThemeResource LayerOnMicaBaseAltFillColorDefaultBrush}"
|
||||
Opacity="{x:Bind ViewModel.TopCommandGridOpacity, Mode=OneWay}"
|
||||
PointerEntered="TopCommandGrid_PointerEntered"
|
||||
PointerExited="TopCommandGrid_PointerExited">
|
||||
|
||||
@@ -17,9 +17,7 @@ using Microsoft.UI.Windowing;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Input;
|
||||
using Microsoft.UI.Xaml.Media.Imaging;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Foundation;
|
||||
using Windows.Graphics.Imaging;
|
||||
using Windows.UI;
|
||||
using WinRT.Interop;
|
||||
|
||||
@@ -34,10 +32,13 @@ namespace BetterLyrics.WinUI3.Views
|
||||
IRecipient<PropertyChangedMessage<ElementTheme>>,
|
||||
IRecipient<PropertyChangedMessage<BitmapImage?>>,
|
||||
IRecipient<PropertyChangedMessage<LyricsFontColorType>>,
|
||||
IRecipient<PropertyChangedMessage<Color>>
|
||||
IRecipient<PropertyChangedMessage<Color>>,
|
||||
IRecipient<PropertyChangedMessage<TaskbarPlacement>>
|
||||
{
|
||||
private ForegroundWindowHook? _fgWindowWatcher = null;
|
||||
private OverlayInputHelper? _overlayInputHelper = null;
|
||||
private OverlayInputHelper? _overlayInputHelper;
|
||||
private TaskbarHook? _taskbarHook;
|
||||
|
||||
private DispatcherQueueTimer? _fgWindowWatcherTimer = null;
|
||||
|
||||
private Color _backdropAccentColor = Colors.Transparent;
|
||||
@@ -62,13 +63,16 @@ namespace BetterLyrics.WinUI3.Views
|
||||
AppWindow.Changed += AppWindow_Changed;
|
||||
AppWindow.Closing += AppWindow_Closing;
|
||||
|
||||
SystemBackdrop = SystemBackdropHelper.CreateSystemBackdrop(BackdropType.Transparent);
|
||||
|
||||
WeakReferenceMessenger.Default.RegisterAll(this);
|
||||
|
||||
UpdateAlbumArtThemeColors();
|
||||
}
|
||||
|
||||
private void OnTaskbarFreeBoundsChanged(Events.TaskbarFreeBoundsChangedEventArgs obj)
|
||||
{
|
||||
this.MoveAndResize(obj.TaskbarFreeBounds);
|
||||
}
|
||||
|
||||
public void InitStatus()
|
||||
{
|
||||
LyricsWindowStatus.UpdateMonitorBounds();
|
||||
@@ -82,6 +86,8 @@ namespace BetterLyrics.WinUI3.Views
|
||||
OnIsLockedChanged();
|
||||
OnAutoShowOrHideWindowChanged();
|
||||
OnTitleBarAreaChanged();
|
||||
OnIsPinToTaskbarChanged();
|
||||
OnIsAlwaysHideUnlockButtonChanged();
|
||||
|
||||
LyricsWindowStatus.UpdateDemoWindowAndMonitorBounds();
|
||||
}
|
||||
@@ -150,6 +156,11 @@ namespace BetterLyrics.WinUI3.Views
|
||||
LyricsWindowStatus.IsLocked = true;
|
||||
this.MoveAndResize(LyricsWindowStatus.GetWindowBoundsWhenWorkArea());
|
||||
}
|
||||
else
|
||||
{
|
||||
// ǿ<>ƴ<EFBFBD><C6B4><EFBFBD>һ<EFBFBD>θ<EFBFBD><CEB8>£<EFBFBD>ˢ<EFBFBD>½<EFBFBD><C2BD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>״̬
|
||||
OnIsLockedChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnIsShownInSwitchersChanged()
|
||||
@@ -165,8 +176,7 @@ namespace BetterLyrics.WinUI3.Views
|
||||
|
||||
private void OnIsLockedChanged()
|
||||
{
|
||||
this.SetIsLocked(LyricsWindowStatus.IsLocked);
|
||||
if (LyricsWindowStatus.IsLocked)
|
||||
if (LyricsWindowStatus.IsLocked && !LyricsWindowStatus.IsWorkArea)
|
||||
{
|
||||
LockToggleButtonContainer.Visibility = Visibility.Visible;
|
||||
StartOverlayInputHelper();
|
||||
@@ -177,24 +187,45 @@ namespace BetterLyrics.WinUI3.Views
|
||||
UnlockButton.Opacity = 0;
|
||||
StopOverlayInputHelper();
|
||||
}
|
||||
this.SetIsLocked(LyricsWindowStatus.IsLocked);
|
||||
}
|
||||
|
||||
private void OnIsPinToTaskbarChanged()
|
||||
{
|
||||
_taskbarHook?.Dispose();
|
||||
_taskbarHook = null;
|
||||
|
||||
if (LyricsWindowStatus.IsPinToTaskbar)
|
||||
{
|
||||
_taskbarHook = new(LyricsWindowStatus.TaskbarPlacement, OnTaskbarFreeBoundsChanged);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnIsAlwaysHideUnlockButtonChanged()
|
||||
{
|
||||
UnlockButton.Visibility = LyricsWindowStatus.IsAlwaysHideUnlockButton ? Visibility.Collapsed : Visibility.Visible;
|
||||
}
|
||||
|
||||
private void OnIsFullscreenChanged()
|
||||
{
|
||||
this.SetIsFullscreen(LyricsWindowStatus.IsFullscreen);
|
||||
EnterFullscreenFontIcon.Opacity = LyricsWindowStatus.IsFullscreen ? 0 : 1;
|
||||
ExitFullscreenFontIcon.Opacity = LyricsWindowStatus.IsFullscreen ? 1 : 0;
|
||||
MaximizeButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
AOTButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
MinimizeButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
LockButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
if (this.SetIsFullscreen(LyricsWindowStatus.IsFullscreen))
|
||||
{
|
||||
EnterFullscreenFontIcon.Opacity = LyricsWindowStatus.IsFullscreen ? 0 : 1;
|
||||
ExitFullscreenFontIcon.Opacity = LyricsWindowStatus.IsFullscreen ? 1 : 0;
|
||||
MaximizeButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
AOTButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
MinimizeButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
LockButton.Visibility = LyricsWindowStatus.IsFullscreen ? Visibility.Collapsed : Visibility.Visible;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnIsMaximizedChanged()
|
||||
{
|
||||
this.SetIsMaximized(LyricsWindowStatus.IsMaximized);
|
||||
EnterMaximizeFontIcon.Opacity = LyricsWindowStatus.IsMaximized ? 0 : 1;
|
||||
ExitMaximizeFontIcon.Opacity = LyricsWindowStatus.IsMaximized ? 1 : 0;
|
||||
if (this.SetIsMaximized(LyricsWindowStatus.IsMaximized))
|
||||
{
|
||||
EnterMaximizeFontIcon.Opacity = LyricsWindowStatus.IsMaximized ? 0 : 1;
|
||||
ExitMaximizeFontIcon.Opacity = LyricsWindowStatus.IsMaximized ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAutoShowOrHideWindowChanged()
|
||||
@@ -361,6 +392,8 @@ namespace BetterLyrics.WinUI3.Views
|
||||
|
||||
private void StartOverlayInputHelper()
|
||||
{
|
||||
if (_overlayInputHelper != null) return;
|
||||
|
||||
_overlayInputHelper = new(this);
|
||||
_overlayInputHelper.Register(RootGrid);
|
||||
_overlayInputHelper.Register(LockToggleButtonContainer);
|
||||
@@ -473,6 +506,14 @@ namespace BetterLyrics.WinUI3.Views
|
||||
{
|
||||
OnIsAdaptToEnvironmentChanged();
|
||||
}
|
||||
else if (message.PropertyName == nameof(LyricsWindowStatus.IsPinToTaskbar))
|
||||
{
|
||||
OnIsPinToTaskbarChanged();
|
||||
}
|
||||
else if (message.PropertyName == nameof(LyricsWindowStatus.IsAlwaysHideUnlockButton))
|
||||
{
|
||||
OnIsAlwaysHideUnlockButtonChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -580,5 +621,15 @@ namespace BetterLyrics.WinUI3.Views
|
||||
}
|
||||
}
|
||||
|
||||
public void Receive(PropertyChangedMessage<TaskbarPlacement> message)
|
||||
{
|
||||
if (message.Sender == LyricsWindowStatus)
|
||||
{
|
||||
if (message.PropertyName == nameof(LyricsWindowStatus.TaskbarPlacement))
|
||||
{
|
||||
_taskbarHook?.UpdatePlacement(LyricsWindowStatus.TaskbarPlacement);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ public sealed partial class SystemTrayWindow : Window, IRecipient<PropertyChange
|
||||
records.Add(LyricsWindowStatusExtensions.DockedMode(this));
|
||||
records.Add(LyricsWindowStatusExtensions.NarrowMode(this));
|
||||
records.Add(LyricsWindowStatusExtensions.FullscreenMode(this));
|
||||
records.Add(LyricsWindowStatusExtensions.TaskbarMode(this));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,13 +20,18 @@ BetterLyrics
|
||||
|
||||
<div align=center>
|
||||
|
||||
   
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://github.com/jayfunc/BetterLyrics/stargazers)
|
||||
[](https://deepwiki.com/jayfunc/BetterLyrics)
|
||||
[](https://zread.ai/jayfunc/BetterLyrics)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -147,6 +152,8 @@ BetterLyrics
|
||||
|
||||
</details>
|
||||
|
||||
本项目的持续发展离不开大家的支持。**[查看完整鸣谢名单](SPONSORS.md)**
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 GNU 通用公共许可证 v3.0 授权。详情请参阅 [LICENSE](https://github.com/jayfunc/BetterLyrics/blob/dev/LICENSE) 文件。
|
||||
|
||||
@@ -20,13 +20,18 @@ BetterLyrics
|
||||
|
||||
<div align=center>
|
||||
|
||||
   
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://github.com/jayfunc/BetterLyrics/stargazers)
|
||||
[](https://deepwiki.com/jayfunc/BetterLyrics)
|
||||
[](https://zread.ai/jayfunc/BetterLyrics)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -153,6 +158,8 @@ You can donate via:
|
||||
|
||||
</details>
|
||||
|
||||
This project is made possible by the generous support of our users. **[View the full Hall of Fame](SPONSORS.md)**
|
||||
|
||||
## 📄 License
|
||||
|
||||
This project is licensed under the GNU General Public License v3.0. See the [LICENSE](https://github.com/jayfunc/BetterLyrics/blob/dev/LICENSE) file for details.
|
||||
|
||||
22
SPONSORS.md
Normal file
22
SPONSORS.md
Normal file
@@ -0,0 +1,22 @@
|
||||
Special thanks to the following people for their support!
|
||||
|
||||
特别感谢以下朋友的支持!
|
||||
|
||||
| Date / 日期 | Name / 昵称 |
|
||||
| :--- | :--- |
|
||||
| Dec 13, 2025 | \<Anonymous\> |
|
||||
| Dec 3, 2025 | YE |
|
||||
| Dec 2, 2025 | \<Anonymous\> |
|
||||
| Nov 23, 2025 | \*\*玄 |
|
||||
| Nov 21, 2025 | \*\*智 |
|
||||
| Nov 17, 2025 | \*鹤 |
|
||||
| Nov 2, 2025 | 借过 |
|
||||
| Aug 28, 2025 | \*\*华 |
|
||||
|
||||
> *List is updated manually. If you donated but don't see your name here, please contact me.*
|
||||
>
|
||||
> *名单手动更新。如果您已捐赠但未在此看到您的名字,请联系我。*
|
||||
|
||||
I would also like to express my sincere gratitude to **all users who purchased the app from the Store**. Your support is the driving force behind this project!
|
||||
|
||||
同时,向 **所有在商店购买应用的用户** 表达最诚挚的感谢。你们的支持是本项目不断前行的动力!
|
||||
@@ -3,34 +3,37 @@
|
||||
"IsDefault": false,
|
||||
"MonitorDeviceName": "\\\\.\\DISPLAY1",
|
||||
"IsWorkArea": false,
|
||||
"IsBorderless": true,
|
||||
"IsAlwaysOnTop": true,
|
||||
"IsAlwaysOnTopPolling": true,
|
||||
"IsShownInSwitchers": false,
|
||||
"IsClickThrough": true,
|
||||
"IsLocked": true,
|
||||
"IsPinToTaskbar": true,
|
||||
"TaskbarPlacement": 1,
|
||||
"IsMaximized": false,
|
||||
"IsFullscreen": false,
|
||||
"LyricsLayoutOrientation": 0,
|
||||
"LyricsDisplayType": 1,
|
||||
"WindowBounds": {
|
||||
"X": 0,
|
||||
"Y": 1020,
|
||||
"Width": 600,
|
||||
"Height": 64,
|
||||
"Left": 0,
|
||||
"Top": 1020,
|
||||
"Right": 600,
|
||||
"Bottom": 1084,
|
||||
"X": 100,
|
||||
"Y": 100,
|
||||
"Width": 800,
|
||||
"Height": 500,
|
||||
"Left": 100,
|
||||
"Top": 100,
|
||||
"Right": 900,
|
||||
"Bottom": 600,
|
||||
"IsEmpty": false
|
||||
},
|
||||
"DockHeight": 64,
|
||||
"DemoWindowBounds": {
|
||||
"X": 0,
|
||||
"Y": 102,
|
||||
"Width": 60,
|
||||
"Height": 6.400000095367432,
|
||||
"Left": 0,
|
||||
"Top": 102,
|
||||
"Right": 60,
|
||||
"Bottom": 108.4000015258789,
|
||||
"X": 10,
|
||||
"Y": 10,
|
||||
"Width": 80,
|
||||
"Height": 50,
|
||||
"Left": 10,
|
||||
"Top": 10,
|
||||
"Right": 90,
|
||||
"Bottom": 60,
|
||||
"IsEmpty": false
|
||||
},
|
||||
"MonitorBounds": {
|
||||
@@ -57,12 +60,14 @@
|
||||
},
|
||||
"DockPlacement": 0,
|
||||
"LyricsStyleSettings": {
|
||||
"IsDynamicLyricsFontSize": false,
|
||||
"IsDynamicLyricsFontSize": true,
|
||||
"PhoneticLyricsFontSize": 12,
|
||||
"OriginalLyricsFontSize": 16,
|
||||
"OriginalLyricsFontSize": 24,
|
||||
"TranslatedLyricsFontSize": 12,
|
||||
"LyricsAlignmentType": 0,
|
||||
"LyricsBgFontOpacity": 30,
|
||||
"PhoneticLyricsOpacity": 60,
|
||||
"OriginalLyricsOpacity": 30,
|
||||
"TranslatedLyricsOpacity": 60,
|
||||
"LyricsAlignmentType": 1,
|
||||
"LyricsFontStrokeWidth": 0,
|
||||
"LyricsCustomBgFontColor": {
|
||||
"A": 255,
|
||||
@@ -87,33 +92,31 @@
|
||||
"LyricsStrokeFontColorType": 1,
|
||||
"LyricsFontWeight": 7,
|
||||
"LyricsLineSpacingFactor": 0.5,
|
||||
"LyricsTranslationSeparator": "\n",
|
||||
"LyricsCJKFontFamily": "Arial",
|
||||
"LyricsWesternFontFamily": "Arial",
|
||||
"PlayingLineTopOffset": 50,
|
||||
"IsActive": false
|
||||
},
|
||||
"LyricsEffectSettings": {
|
||||
"LyricsBlurAmount": 5,
|
||||
"IsLyricsLineFadeEnabled": true,
|
||||
"IsLyricsBlurEffectEnabled": true,
|
||||
"IsLyricsGlowEffectEnabled": true,
|
||||
"LyricsGlowEffectScope": 0,
|
||||
"LyricsGlowEffectLongSyllableDuration": 700,
|
||||
"IsLyricsGlowEffectAmountAutoAdjust": true,
|
||||
"LyricsGlowEffectAmount": 8,
|
||||
"IsLyricsShadowEnabled": false,
|
||||
"LyricsShadowScope": 1,
|
||||
"LyricsShadowAmount": 8,
|
||||
"OriginalLyricsHighlightScope": 1,
|
||||
"PhoneticLyricsHighlightAmount": 60,
|
||||
"OriginalLyricsHighlightAmount": 100,
|
||||
"TranslatedLyricsHighlightAmount": 60,
|
||||
"IsLyricsScaleEffectEnabled": true,
|
||||
"LyricsScaleEffectLongSyllableDuration": 700,
|
||||
"IsLyricsScaleEffectAmountAutoAdjust": true,
|
||||
"LyricsScaleEffectAmount": 115,
|
||||
"IsLyricsFloatAnimationEnabled": true,
|
||||
"LyricsFloatAmount": 1,
|
||||
"IsLyricsFloatAnimationAmountAutoAdjust": true,
|
||||
"LyricsFloatAnimationAmount": 8,
|
||||
"LyricsScrollEasingType": 3,
|
||||
"LyricsScrollDuration": 500,
|
||||
"LyricsScrollTopDuration": 500,
|
||||
"LyricsScrollBottomDuration": 500,
|
||||
"LyricsScrollTopDelay": 0,
|
||||
"LyricsScrollBottomDelay": 0,
|
||||
"LyricsVerticalEdgeOpacity": 0,
|
||||
"IsFanLyricsEnabled": false,
|
||||
"FanLyricsAngle": 30,
|
||||
"Is3DLyricsEnabled": false,
|
||||
@@ -127,21 +130,23 @@
|
||||
"LyricsBackgroundTheme": 2,
|
||||
"IsPureColorOverlayEnabled": false,
|
||||
"PureColorOverlayOpacity": 100,
|
||||
"IsCoverOverlayEnabled": false,
|
||||
"CoverOverlayBlurAmount": 100,
|
||||
"CoverOverlayOpacity": 100,
|
||||
"CoverOverlaySpeed": 50,
|
||||
"CoverAcrylicEffectAmount": 0,
|
||||
"IsFluidOverlayEnabled": false,
|
||||
"FluidOverlayOpacity": 100,
|
||||
"PaletteGeneratorType": 0,
|
||||
"IsSpectrumOverlayEnabled": false,
|
||||
"SpectrumPlacement": 1,
|
||||
"SpectrumStyle": 1,
|
||||
"SpectrumCount": 128,
|
||||
"IsSnowFlakeOverlayEnabled": false,
|
||||
"SnowFlakeOverlayAmount": 50,
|
||||
"SnowFlakeOverlayAmount": 10,
|
||||
"SnowFlakeOverlaySpeed": 1,
|
||||
"IsFogOverlayEnabled": false,
|
||||
"IsActive": false
|
||||
},
|
||||
"AlbumArtLayoutSettings": {
|
||||
"SongInfoAlignmentType": 0,
|
||||
"IsAutoCoverImageHeight": true,
|
||||
"CoverImageHeight": 128,
|
||||
"CoverImageRadius": 12,
|
||||
"CoverImageShadowAmount": 12,
|
||||
"IsAutoSongInfoFontSize": true,
|
||||
@@ -149,17 +154,15 @@
|
||||
"ShowTitle": true,
|
||||
"ShowArtists": true,
|
||||
"ShowAlbum": false,
|
||||
"AlbumArtSize": 64,
|
||||
"AutoAlbumArtSize": true,
|
||||
"IsActive": false
|
||||
},
|
||||
"AlbumArtAreaEffectSettings": {
|
||||
"ImageSwitchType": 1,
|
||||
"IsActive": false
|
||||
},
|
||||
"IsAdaptToEnvironment": true,
|
||||
"EnvironmentSampleMode": 3,
|
||||
"AutoShowOrHideWindow": false,
|
||||
"TitleBarArea": 1,
|
||||
"WindowX": 0,
|
||||
"WindowY": 1020,
|
||||
"WindowWidth": 600,
|
||||
"WindowHeight": 64,
|
||||
"IsActive": false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user