diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
index ffff3cf..433b203 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
@@ -27,8 +27,9 @@
+
-
+
@@ -200,6 +201,16 @@
Always
+
+
+ MSBuild:Compile
+
+
+
+
+ MSBuild:Compile
+
+
MSBuild:Compile
@@ -241,7 +252,7 @@
-
+
MSBuild:Compile
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml
new file mode 100644
index 0000000..cdd338a
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml.cs
new file mode 100644
index 0000000..2858a0a
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/FontFamilyAutoSuggestBox.xaml.cs
@@ -0,0 +1,95 @@
+using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Models.Settings;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Navigation;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace BetterLyrics.WinUI3.Controls
+{
+ public sealed partial class FontFamilyAutoSuggestBox : UserControl
+ {
+ private List SystemFontNames { get; set; } = [.. FontHelper.SystemFontFamilies];
+
+ public FontFamilyAutoSuggestBox()
+ {
+ InitializeComponent();
+ }
+
+ public static readonly DependencyProperty SelectedFontFamilyProperty =
+ DependencyProperty.Register(nameof(SelectedFontFamily), typeof(string), typeof(FontFamilyAutoSuggestBox), new PropertyMetadata(default));
+
+ public string SelectedFontFamily
+ {
+ get => (string)GetValue(SelectedFontFamilyProperty);
+ set => SetValue(SelectedFontFamilyProperty, value);
+ }
+
+
+ private void AutoSuggestBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
+ {
+ SelectedFontFamily = args.SelectedItem.ToString() ?? "";
+ }
+
+ private void UpdateAutoSuggestBoxItemsSource()
+ {
+ var suitableItems = new List();
+ var splitText = AutoSuggestBox.Text.ToLower().Split(" ");
+ foreach (var fontFamily in SystemFontNames)
+ {
+ var found = splitText.All((key) =>
+ {
+ return fontFamily.ToLower().Contains(key);
+ });
+ if (found)
+ {
+ suitableItems.Add(fontFamily);
+ }
+ }
+ if (suitableItems.Count == 0)
+ {
+ suitableItems.Add("N/A");
+ }
+ AutoSuggestBox.ItemsSource = suitableItems.Order();
+ }
+
+ private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
+ {
+ // Since selecting an item will also change the text,
+ // only listen to changes caused by user entering text.
+ if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
+ {
+ UpdateAutoSuggestBoxItemsSource();
+ }
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ SystemFontNames = [.. FontHelper.SystemFontFamilies];
+ }
+
+ private void AutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)
+ {
+ UpdateAutoSuggestBoxItemsSource();
+ }
+
+ private void AutoSuggestBox_LostFocus(object sender, RoutedEventArgs e)
+ {
+ AutoSuggestBox.Text = SelectedFontFamily;
+ }
+ }
+}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml
similarity index 53%
rename from BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml
rename to BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml
index ce42632..97e71b1 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml
@@ -1,6 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+ Unit="%"
+ Value="{x:Bind LyricsEffectSettings.PhoneticLyricsHighlightAmount, Mode=TwoWay}" />
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ Unit="%"
+ Value="{x:Bind LyricsEffectSettings.OriginalLyricsHighlightAmount, Mode=TwoWay}" />
+
+
+
+
+
@@ -426,11 +233,7 @@
-
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml.cs
similarity index 59%
rename from BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml.cs
rename to BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml.cs
index b6f8d08..75ef360 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSettingsControl.xaml.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsEffectSettingsControl.xaml.cs
@@ -21,27 +21,15 @@ using Windows.Foundation.Collections;
namespace BetterLyrics.WinUI3.Controls
{
- public sealed partial class LyricsSettingsControl : UserControl
+ public sealed partial class LyricsEffectSettingsControl : UserControl
{
- public ObservableCollection SystemFontNames { get; set; } = [.. FontHelper.SystemFontFamilies];
-
- public LyricsSettingsControl()
+ public LyricsEffectSettingsControl()
{
InitializeComponent();
}
- public static readonly DependencyProperty LyricsStyleSettingsProperty =
- DependencyProperty.Register(nameof(LyricsStyleSettings), typeof(LyricsStyleSettings), typeof(LyricsSettingsControl), new PropertyMetadata(default));
-
- public LyricsStyleSettings LyricsStyleSettings
- {
- get => (LyricsStyleSettings)GetValue(LyricsStyleSettingsProperty);
- set => SetValue(LyricsStyleSettingsProperty, value);
- }
-
-
public static readonly DependencyProperty LyricsEffectSettingsProperty =
- DependencyProperty.Register(nameof(LyricsEffectSettings), typeof(LyricsEffectSettings), typeof(LyricsSettingsControl), new PropertyMetadata(default));
+ DependencyProperty.Register(nameof(LyricsEffectSettings), typeof(LyricsEffectSettings), typeof(LyricsEffectSettingsControl), new PropertyMetadata(default));
public LyricsEffectSettings LyricsEffectSettings
{
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml
new file mode 100644
index 0000000..66313b7
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml.cs
new file mode 100644
index 0000000..82eb766
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsStyleSettingsControl.xaml.cs
@@ -0,0 +1,40 @@
+using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Models.Settings;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Navigation;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace BetterLyrics.WinUI3.Controls
+{
+ public sealed partial class LyricsStyleSettingsControl : UserControl
+ {
+ public LyricsStyleSettingsControl()
+ {
+ InitializeComponent();
+ }
+
+ public static readonly DependencyProperty LyricsStyleSettingsProperty =
+ DependencyProperty.Register(nameof(LyricsStyleSettings), typeof(LyricsStyleSettings), typeof(LyricsStyleSettingsControl), new PropertyMetadata(default));
+
+ public LyricsStyleSettings LyricsStyleSettings
+ {
+ get => (LyricsStyleSettings)GetValue(LyricsStyleSettingsProperty);
+ set => SetValue(LyricsStyleSettingsProperty, value);
+ }
+ }
+}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml
index c91a03f..78f1ecf 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsWindowSettingsControl.xaml
@@ -268,9 +268,14 @@
-
-
-
+
+
+
+
+
+
+
+
@@ -349,13 +354,23 @@
-
+
-
+
+
+
+
+
+
+
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml
index f2a80aa..c185cca 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml
@@ -306,10 +306,7 @@
-
+
@@ -320,7 +317,7 @@
-
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/CanvasHelper.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/CanvasHelper.cs
index b701d50..0bddd5e 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/CanvasHelper.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/CanvasHelper.cs
@@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Models;
using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Brushes;
using Microsoft.Graphics.Canvas.Effects;
+using Microsoft.Graphics.Canvas.Geometry;
using Microsoft.Graphics.Canvas.Text;
using Microsoft.Graphics.Canvas.UI.Xaml;
using Microsoft.UI;
@@ -72,19 +73,38 @@ namespace BetterLyrics.WinUI3.Helper
{
CanvasCommandList list = new(control);
using var ds = list.CreateDrawingSession();
+
+ // 描边
if (strokeWidth > 0)
{
- if (lyricsLine.TextGeometry == null)
+ if (lyricsLine.PhoneticCanvasGeometry != null)
{
- return list;
+ ds.DrawGeometry(lyricsLine.PhoneticCanvasGeometry, lyricsLine.PhoneticPosition, strokeColor, strokeWidth);
+ }
+ if (lyricsLine.OriginalCanvasGeometry != null)
+ {
+ ds.DrawGeometry(lyricsLine.OriginalCanvasGeometry, lyricsLine.OriginalPosition, strokeColor, strokeWidth);
+ }
+ if (lyricsLine.TranslatedCanvasGeometry != null)
+ {
+ ds.DrawGeometry(lyricsLine.TranslatedCanvasGeometry, lyricsLine.TranslatedPosition, strokeColor, strokeWidth);
}
- ds.DrawGeometry(lyricsLine.TextGeometry, lyricsLine.Position, strokeColor, strokeWidth); // 描边
}
- if (lyricsLine.CanvasTextLayout == null)
+
+ // 绘制文本(填充)
+ if (lyricsLine.PhoneticCanvasTextLayout != null)
{
- return list;
+ ds.DrawTextLayout(lyricsLine.PhoneticCanvasTextLayout, lyricsLine.PhoneticPosition, fontColor);
}
- ds.DrawTextLayout(lyricsLine.CanvasTextLayout, lyricsLine.Position, fontColor); // 绘制文本(填充)
+ if (lyricsLine.OriginalCanvasTextLayout != null)
+ {
+ ds.DrawTextLayout(lyricsLine.OriginalCanvasTextLayout, lyricsLine.OriginalPosition, fontColor);
+ }
+ if (lyricsLine.TranslatedCanvasTextLayout != null)
+ {
+ ds.DrawTextLayout(lyricsLine.TranslatedCanvasTextLayout, lyricsLine.TranslatedPosition, fontColor);
+ }
+
return list;
}
@@ -113,12 +133,12 @@ namespace BetterLyrics.WinUI3.Helper
var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession();
- if (lyricsLine.CanvasTextLayout == null)
+ if (lyricsLine.OriginalCanvasTextLayout == null)
{
return mask;
}
- var highlightRegion = lyricsLine.CanvasTextLayout.GetCharacterRegions(charStartIndex, charLength).FirstOrDefault();
+ var highlightRegion = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(charStartIndex, charLength).FirstOrDefault();
double highlightTotalWidth = (double)highlightRegion.LayoutBounds.Width;
// Draw the highlight for the current character
@@ -129,20 +149,20 @@ namespace BetterLyrics.WinUI3.Helper
// Rects
var highlightRect = new Rect(
highlightRegion.LayoutBounds.X,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
highlightWidth,
highlightRegion.LayoutBounds.Height
);
var fadeInRect = new Rect(
highlightRect.Right - fadingWidth,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth,
highlightRegion.LayoutBounds.Height
);
var fadeOutRect = new Rect(
highlightRect.Right,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth,
highlightRegion.LayoutBounds.Height
);
@@ -171,15 +191,15 @@ namespace BetterLyrics.WinUI3.Helper
{
var mask = new CanvasCommandList(control);
- if (lyricsLine.CanvasTextLayout == null)
+ if (lyricsLine.OriginalCanvasTextLayout == null)
{
return mask;
}
using var ds = mask.CreateDrawingSession();
- var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(0, charStartIndex);
- var highlightRegion = lyricsLine.CanvasTextLayout
+ var regions = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(0, charStartIndex);
+ var highlightRegion = lyricsLine.OriginalCanvasTextLayout
.GetCharacterRegions(charStartIndex, charLength)
.FirstOrDefault();
if (regions.Length > 0)
@@ -190,7 +210,7 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j];
var rect = new Rect(
region.LayoutBounds.X,
- region.LayoutBounds.Y + lyricsLine.Position.Y,
+ region.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
region.LayoutBounds.Width,
region.LayoutBounds.Height
);
@@ -207,14 +227,14 @@ namespace BetterLyrics.WinUI3.Helper
// Rects
var highlightRect = new Rect(
highlightRegion.LayoutBounds.X,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
highlightWidth,
highlightRegion.LayoutBounds.Height
);
var fadeInRect = new Rect(
highlightRect.Right - fadingWidth,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth,
highlightRegion.LayoutBounds.Height
);
@@ -225,7 +245,7 @@ namespace BetterLyrics.WinUI3.Helper
{
var fadeOutRect = new Rect(
highlightRect.Right,
- highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y,
+ highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth,
highlightRegion.LayoutBounds.Height
);
@@ -246,12 +266,12 @@ namespace BetterLyrics.WinUI3.Helper
var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession();
- if (lyricsLine.CanvasTextLayout == null)
+ if (lyricsLine.OriginalCanvasTextLayout == null)
{
return mask;
}
- var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(0, lyricsLine.OriginalText.Length);
+ var regions = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(0, lyricsLine.OriginalText.Length);
if (regions.Length > 0)
{
for (int j = 0; j < regions.Length; j++)
@@ -259,7 +279,7 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j];
var rect = new Rect(
region.LayoutBounds.X,
- region.LayoutBounds.Y + lyricsLine.Position.Y,
+ region.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
region.LayoutBounds.Width,
region.LayoutBounds.Height
);
@@ -270,17 +290,17 @@ namespace BetterLyrics.WinUI3.Helper
return mask;
}
- public static CanvasCommandList CreateTranslationHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine)
+ public static CanvasCommandList CreatePhoneticHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine)
{
var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession();
- if (lyricsLine.CanvasTextLayout == null)
+ if (lyricsLine.PhoneticCanvasTextLayout == null)
{
return mask;
}
- var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(lyricsLine.OriginalText.Length, lyricsLine.DisplayedText.Length - lyricsLine.OriginalText.Length);
+ var regions = lyricsLine.PhoneticCanvasTextLayout.GetCharacterRegions(0, lyricsLine.PhoneticText.Length);
if (regions.Length > 0)
{
for (int j = 0; j < regions.Length; j++)
@@ -288,7 +308,36 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j];
var rect = new Rect(
region.LayoutBounds.X,
- region.LayoutBounds.Y + lyricsLine.Position.Y,
+ region.LayoutBounds.Y + lyricsLine.PhoneticPosition.Y,
+ region.LayoutBounds.Width,
+ region.LayoutBounds.Height
+ );
+ ds.FillRectangle(rect, Colors.White);
+ }
+ }
+
+ return mask;
+ }
+
+ public static CanvasCommandList CreateTranslatedHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine)
+ {
+ var mask = new CanvasCommandList(control);
+ using var ds = mask.CreateDrawingSession();
+
+ if (lyricsLine.TranslatedCanvasTextLayout == null)
+ {
+ return mask;
+ }
+
+ var regions = lyricsLine.TranslatedCanvasTextLayout.GetCharacterRegions(0, lyricsLine.TranslatedText.Length);
+ if (regions.Length > 0)
+ {
+ for (int j = 0; j < regions.Length; j++)
+ {
+ var region = regions[j];
+ var rect = new Rect(
+ region.LayoutBounds.X,
+ region.LayoutBounds.Y + lyricsLine.TranslatedPosition.Y,
region.LayoutBounds.Width,
region.LayoutBounds.Height
);
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs
index 574e442..511572a 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs
@@ -18,6 +18,8 @@ namespace BetterLyrics.WinUI3.Helper
{
private List _lyricsDataArr = [];
+ public LyricsData? LibreTranslationLyricsData => _lyricsDataArr.LastOrDefault();
+
public List Parse(string? raw, int? durationMs)
{
durationMs ??= (int)TimeSpan.FromMinutes(99).TotalMilliseconds;
@@ -48,7 +50,7 @@ namespace BetterLyrics.WinUI3.Helper
}
}
FillRomanizationLyricsData();
- _lyricsDataArr.Add(new LyricsData()); // 为机翻预留
+ _lyricsDataArr.Add(new LyricsData()); // 为 LibreTranslation 预留
return _lyricsDataArr;
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsData.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsData.cs
index e8f6542..83e12c3 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsData.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsData.cs
@@ -32,7 +32,23 @@ namespace BetterLyrics.WinUI3.Models
LyricsLines = lyricsLines;
}
- public void SetDisplayedTextAlongWith(LyricsData translationData, string separator, int toleranceMs = 0)
+ public void ClearTranslatedText()
+ {
+ foreach (var line in LyricsLines)
+ {
+ line.TranslatedText = "";
+ }
+ }
+
+ public void ClearPhoneticText()
+ {
+ foreach (var line in LyricsLines)
+ {
+ line.PhoneticText = "";
+ }
+ }
+
+ public void SetTranslatedText(LyricsData translationData, string separator, int toleranceMs = 0)
{
foreach (var line in LyricsLines)
{
@@ -42,17 +58,39 @@ namespace BetterLyrics.WinUI3.Models
if (transLine != null)
{
- line.DisplayedText = $"{line.OriginalText}{separator}{transLine.OriginalText}";
+ // 此处 transLine.OriginalText 指翻译中的“原文”属性
+ line.TranslatedText = transLine.OriginalText;
}
else
{
- // 没有匹配的翻译,翻译部分留空
- line.DisplayedText = $"{line.OriginalText}";
+ // 没有匹配的翻译
+ line.TranslatedText = "";
}
}
}
- public void SetDisplayedTextAlongWith(string translation, string separator)
+ public void SetPhoneticText(LyricsData phoneticData, string separator, int toleranceMs = 0)
+ {
+ foreach (var line in LyricsLines)
+ {
+ // 在音译歌词中查找与当前行开始时间最接近且在容忍范围内的行
+ var transLine = phoneticData.LyricsLines
+ .FirstOrDefault(t => Math.Abs(t.StartMs - line.StartMs) <= toleranceMs);
+
+ if (transLine != null)
+ {
+ // 此处 transLine.OriginalText 指音译中的“原文”属性
+ line.PhoneticText = transLine.OriginalText;
+ }
+ else
+ {
+ // 没有匹配的音译
+ line.PhoneticText = "";
+ }
+ }
+ }
+
+ public void SetTranslation(string translation, string separator)
{
List translationArr = translation.Split(StringHelper.NewLine).ToList();
int i = 0;
@@ -60,24 +98,16 @@ namespace BetterLyrics.WinUI3.Models
{
if (i >= translationArr.Count)
{
- line.DisplayedText = line.OriginalText; // No translation available, keep original text
+ line.TranslatedText = ""; // No translation available, keep empty
}
else
{
- line.DisplayedText = $"{line.OriginalText}{separator}{translationArr[i]}";
+ line.TranslatedText = translationArr[i];
}
i++;
}
}
- public void SetDisplayedTextInOriginalText()
- {
- foreach (var line in LyricsLines)
- {
- line.DisplayedText = line.OriginalText;
- }
- }
-
public LyricsData CreateLyricsDataFrom(string translation)
{
var result = new LyricsData(LyricsLines.Select(line => new LyricsLine
@@ -120,8 +150,9 @@ namespace BetterLyrics.WinUI3.Models
{
StartMs = 0,
EndMs = (int)TimeSpan.FromMinutes(99).TotalMilliseconds,
+ PhoneticText = "",
OriginalText = "● ● ●",
- DisplayedText = "● ● ●",
+ TranslatedText = "",
LyricsChars = [],
},
]);
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsLine.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsLine.cs
index 7f567dc..412d131 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsLine.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsLine.cs
@@ -2,6 +2,7 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Services;
using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.Geometry;
@@ -53,10 +54,23 @@ namespace BetterLyrics.WinUI3.Models
easingType: EasingType.EaseInOutQuad
);
- public CanvasTextLayout? CanvasTextLayout { get; private set; }
+ public CanvasTextLayout? OriginalCanvasTextLayout { get; private set; }
+ public CanvasTextLayout? TranslatedCanvasTextLayout { get; private set; }
+ public CanvasTextLayout? PhoneticCanvasTextLayout { get; private set; }
public Vector2 CenterPosition { get; private set; }
- public Vector2 Position { get; set; }
+ ///
+ /// 原文位置
+ ///
+ public Vector2 OriginalPosition { get; set; }
+ ///
+ /// 译文位置
+ ///
+ public Vector2 TranslatedPosition { get; set; }
+ ///
+ /// 注音位置
+ ///
+ public Vector2 PhoneticPosition { get; set; }
public List LyricsChars { get; set; } = [];
@@ -64,54 +78,134 @@ namespace BetterLyrics.WinUI3.Models
public int? EndMs { get; set; }
public int StartMs { get; set; }
- public string DisplayedText { get; set; } = "";
+ ///
+ /// 原文
+ ///
public string OriginalText { get; set; } = "";
+ ///
+ /// 译文
+ ///
+ public string TranslatedText { get; set; } = "";
+ ///
+ /// 注音
+ ///
+ public string PhoneticText { get; set; } = "";
- public CanvasGeometry? TextGeometry { get; private set; }
+ public CanvasGeometry? OriginalCanvasGeometry { get; private set; }
+ public CanvasGeometry? TranslatedCanvasGeometry { get; private set; }
+ public CanvasGeometry? PhoneticCanvasGeometry { get; private set; }
public void UpdateCenterPosition(double maxWidth, TextAlignmentType type)
{
- if (CanvasTextLayout == null)
+ if (OriginalCanvasTextLayout == null)
{
return;
}
- double centerY = Position.Y + (double)CanvasTextLayout.LayoutBounds.Height;
+
+ double centerY = OriginalPosition.Y + (OriginalCanvasTextLayout?.LayoutBounds.Height ?? 0) / 2;
+
CenterPosition = type switch
{
- TextAlignmentType.Left => new Vector2(Position.X, (float)centerY),
- TextAlignmentType.Center => new Vector2((float)(Position.X + maxWidth / 2.0), (float)centerY),
- TextAlignmentType.Right => new Vector2((float)(Position.X + maxWidth), (float)centerY),
+ TextAlignmentType.Left => new Vector2(OriginalPosition.X, (float)centerY),
+ TextAlignmentType.Center => new Vector2((float)(OriginalPosition.X + maxWidth / 2.0), (float)centerY),
+ TextAlignmentType.Right => new Vector2((float)(OriginalPosition.X + maxWidth), (float)centerY),
_ => throw new System.ArgumentOutOfRangeException(nameof(type), type, null),
};
}
public void DisposeTextLayout()
{
- CanvasTextLayout?.Dispose();
- CanvasTextLayout = null;
+ PhoneticCanvasTextLayout?.Dispose();
+ PhoneticCanvasTextLayout = null;
+
+ OriginalCanvasTextLayout?.Dispose();
+ OriginalCanvasTextLayout = null;
+
+ TranslatedCanvasTextLayout?.Dispose();
+ TranslatedCanvasTextLayout = null;
}
- public void RecreateTextLayout(ICanvasAnimatedControl control, CanvasTextFormat textFormat, double maxWidth, double maxHeight, TextAlignmentType type)
+ public void RecreateTextLayout(
+ ICanvasAnimatedControl control,
+ bool createPhonetic, bool createTranslated,
+ int phoneticTextFontSize, int originalTextFontSize, int translatedTextFontSize,
+ LyricsFontWeight originalTextFontWeight,
+ string fontFamilyCJK, string fontFamilyWestern,
+ double maxWidth, double maxHeight, TextAlignmentType type)
{
DisposeTextLayout();
- CanvasTextLayout = new CanvasTextLayout(control, DisplayedText, textFormat, (float)maxWidth, (float)maxHeight);
- CanvasTextLayout.HorizontalAlignment = type.ToCanvasHorizontalAlignment();
+
+ if (createPhonetic && PhoneticText != "")
+ {
+ PhoneticCanvasTextLayout = new CanvasTextLayout(control, PhoneticText, new CanvasTextFormat
+ {
+ HorizontalAlignment = CanvasHorizontalAlignment.Left,
+ VerticalAlignment = CanvasVerticalAlignment.Top,
+ FontSize = phoneticTextFontSize,
+ FontFamily = LanguageHelper.IsCJK(PhoneticText) ? fontFamilyCJK : fontFamilyWestern,
+ }, (float)maxWidth, (float)maxHeight)
+ {
+ HorizontalAlignment = type.ToCanvasHorizontalAlignment(),
+ };
+ }
+
+ OriginalCanvasTextLayout = new CanvasTextLayout(control, OriginalText, new CanvasTextFormat
+ {
+ HorizontalAlignment = CanvasHorizontalAlignment.Left,
+ VerticalAlignment = CanvasVerticalAlignment.Top,
+ FontSize = originalTextFontSize,
+ FontWeight = originalTextFontWeight.ToFontWeight(),
+ FontFamily = LanguageHelper.IsCJK(OriginalText) ? fontFamilyCJK : fontFamilyWestern,
+ }, (float)maxWidth, (float)maxHeight)
+ {
+ HorizontalAlignment = type.ToCanvasHorizontalAlignment()
+ };
+
+ if (createTranslated && TranslatedText != "")
+ {
+ TranslatedCanvasTextLayout = new CanvasTextLayout(control, TranslatedText, new CanvasTextFormat
+ {
+ HorizontalAlignment = CanvasHorizontalAlignment.Left,
+ VerticalAlignment = CanvasVerticalAlignment.Top,
+ FontSize = translatedTextFontSize,
+ FontFamily = LanguageHelper.IsCJK(TranslatedText) ? fontFamilyCJK : fontFamilyWestern,
+ }, (float)maxWidth, (float)maxHeight)
+ {
+ HorizontalAlignment = type.ToCanvasHorizontalAlignment()
+ };
+ }
}
public void DisposeTextGeometry()
{
- TextGeometry?.Dispose();
- TextGeometry = null;
+ PhoneticCanvasGeometry?.Dispose();
+ PhoneticCanvasGeometry = null;
+
+ OriginalCanvasGeometry?.Dispose();
+ OriginalCanvasGeometry = null;
+
+ TranslatedCanvasGeometry?.Dispose();
+ TranslatedCanvasGeometry = null;
}
public void RecreateTextGeometry()
{
DisposeTextGeometry();
- if (CanvasTextLayout == null)
+
+ if (PhoneticCanvasTextLayout != null)
{
- return;
+ PhoneticCanvasGeometry = CanvasGeometry.CreateText(PhoneticCanvasTextLayout);
+ }
+
+ if (OriginalCanvasTextLayout != null)
+ {
+ OriginalCanvasGeometry = CanvasGeometry.CreateText(OriginalCanvasTextLayout);
+ }
+
+ if (TranslatedCanvasTextLayout != null)
+ {
+ TranslatedCanvasGeometry = CanvasGeometry.CreateText(TranslatedCanvasTextLayout);
}
- TextGeometry = CanvasGeometry.CreateText(CanvasTextLayout);
}
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsWindowStatus.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsWindowStatus.cs
index d589d7a..e2ff56f 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsWindowStatus.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/LyricsWindowStatus.cs
@@ -203,7 +203,7 @@ namespace BetterLyrics.WinUI3.Models
EnvironmentSampleMode = WindowPixelSampleMode.WindowEdge,
LyricsStyleSettings = new()
{
- LyricsFontSize = 20,
+ OriginalLyricsFontSize = 20,
LyricsAlignmentType = TextAlignmentType.Center,
},
LyricsBackgroundSettings = new LyricsBackgroundSettings
@@ -230,7 +230,7 @@ namespace BetterLyrics.WinUI3.Models
LyricsStyleSettings = new LyricsStyleSettings
{
LyricsAlignmentType = TextAlignmentType.Center,
- LyricsFontSize = 18,
+ OriginalLyricsFontSize = 18,
},
LyricsBackgroundSettings = new LyricsBackgroundSettings
{
@@ -253,7 +253,7 @@ namespace BetterLyrics.WinUI3.Models
LyricsLayoutOrientation = Enums.LyricsLayoutOrientation.Vertical,
LyricsStyleSettings = new LyricsStyleSettings
{
- LyricsFontSize = 72,
+ OriginalLyricsFontSize = 72,
LyricsAlignmentType = Enums.TextAlignmentType.Center,
},
AlbumArtLayoutSettings = new AlbumArtLayoutSettings
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsEffectSettings.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsEffectSettings.cs
index 82f8148..21f6905 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsEffectSettings.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsEffectSettings.cs
@@ -22,11 +22,11 @@ namespace BetterLyrics.WinUI3.Models.Settings
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType LyricsShadowScope { get; set; } = LineRenderingType.LineStartToCurrentChar;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsShadowAmount { get; set; } = 8;
- [ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType LyricsHighlightScope { get; set; } = LineRenderingType.LineStartToCurrentChar;
- [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsHighlightAmount { get; set; } = 100; // 100% 是上界
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType OriginalLyricsHighlightScope { get; set; } = LineRenderingType.LineStartToCurrentChar;
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int PhoneticLyricsHighlightAmount { get; set; } = 60; // 100% 是上界
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int OriginalLyricsHighlightAmount { get; set; } = 100; // 100% 是上界
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int TranslatedLyricsHighlightAmount { get; set; } = 60; // 100% 是上界
- [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsTranslationHighlightAmount { get; set; } = 60; // 100% 是上界
-
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsLyricsFloatAnimationEnabled { get; set; } = true;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFloatAmount { get; set; } = 1;
@@ -68,9 +68,10 @@ namespace BetterLyrics.WinUI3.Models.Settings
IsLyricsShadowEnabled = this.IsLyricsShadowEnabled,
LyricsShadowScope = this.LyricsShadowScope,
LyricsShadowAmount = this.LyricsShadowAmount,
- LyricsHighlightScope = this.LyricsHighlightScope,
- LyricsHighlightAmount = this.LyricsHighlightAmount,
- LyricsTranslationHighlightAmount = this.LyricsTranslationHighlightAmount,
+ OriginalLyricsHighlightScope = this.OriginalLyricsHighlightScope,
+ PhoneticLyricsHighlightAmount = this.PhoneticLyricsHighlightAmount,
+ OriginalLyricsHighlightAmount = this.OriginalLyricsHighlightAmount,
+ TranslatedLyricsHighlightAmount = this.TranslatedLyricsHighlightAmount,
IsLyricsFloatAnimationEnabled = this.IsLyricsFloatAnimationEnabled,
LyricsFloatAmount = this.LyricsFloatAmount,
LyricsScrollTopDelay = this.LyricsScrollTopDelay,
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsStyleSettings.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsStyleSettings.cs
index af2f055..99e44d5 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsStyleSettings.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsStyleSettings.cs
@@ -14,7 +14,9 @@ namespace BetterLyrics.WinUI3.Models.Settings
public partial class LyricsStyleSettings : ObservableRecipient, ICloneable
{
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsDynamicLyricsFontSize { get; set; } = true;
- [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFontSize { get; set; } = 24;
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int PhoneticLyricsFontSize { get; set; } = 12;
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int OriginalLyricsFontSize { get; set; } = 24;
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial int TranslatedLyricsFontSize { get; set; } = 12;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial TextAlignmentType LyricsAlignmentType { get; set; } = TextAlignmentType.Left;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsBgFontOpacity { get; set; } = 30; // 30% opacity
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFontStrokeWidth { get; set; } = 0;
@@ -27,23 +29,19 @@ namespace BetterLyrics.WinUI3.Models.Settings
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsFontWeight LyricsFontWeight { get; set; } = LyricsFontWeight.Bold;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial double LyricsLineSpacingFactor { get; set; } = 0.5;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsTranslationSeparator { get; set; } = StringHelper.NewLine;
- [ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsCJKFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
+ [ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsWesternFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
public LyricsStyleSettings() { }
- public LyricsStyleSettings(int lyricsFontSize, TextAlignmentType lyricsAlignmentType, int lyricsFontStrokeWidth)
- {
- LyricsFontSize = lyricsFontSize;
- LyricsAlignmentType = lyricsAlignmentType;
- LyricsFontStrokeWidth = lyricsFontStrokeWidth;
- }
-
public object Clone()
{
return new LyricsStyleSettings
{
IsDynamicLyricsFontSize = this.IsDynamicLyricsFontSize,
- LyricsFontSize = this.LyricsFontSize,
+ PhoneticLyricsFontSize = this.PhoneticLyricsFontSize,
+ OriginalLyricsFontSize = this.OriginalLyricsFontSize,
+ TranslatedLyricsFontSize = this.TranslatedLyricsFontSize,
LyricsAlignmentType = this.LyricsAlignmentType,
LyricsBgFontOpacity = this.LyricsBgFontOpacity,
LyricsFontStrokeWidth = this.LyricsFontStrokeWidth,
@@ -56,7 +54,8 @@ namespace BetterLyrics.WinUI3.Models.Settings
LyricsFontWeight = this.LyricsFontWeight,
LyricsLineSpacingFactor = this.LyricsLineSpacingFactor,
LyricsTranslationSeparator = this.LyricsTranslationSeparator,
- LyricsFontFamily = this.LyricsFontFamily
+ LyricsCJKFontFamily = this.LyricsCJKFontFamily,
+ LyricsWesternFontFamily = this.LyricsWesternFontFamily,
};
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.LyricsUpdater.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.LyricsUpdater.cs
index fcfa3e9..ad345e1 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.LyricsUpdater.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.LyricsUpdater.cs
@@ -36,27 +36,22 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
private async Task RefreshTranslationAsync(CancellationToken token)
{
TranslationSearchProvider = null;
- _lyricsDataArr.ElementAtOrDefault(0)?.SetDisplayedTextInOriginalText();
+ _lyricsDataArr.ElementAtOrDefault(0)?.ClearTranslatedText();
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
IsTranslating = true;
- if (_settingsService.AppSettings.TranslationSettings.IsTranslationEnabled)
- {
- await SetDisplayedAlongWithTranslationsAsync(token);
- if (token.IsCancellationRequested) return;
- }
- else
- {
- _logger.LogInformation("Translation is disabled, showing original lyrics only.");
- _lyricsDataArr.ElementAtOrDefault(0)?.SetDisplayedTextInOriginalText();
- _langIndex = 0;
- }
+ await SetPhoneticTextAsync(token);
+ await SetTranslatedTextAsync(token);
+ if (token.IsCancellationRequested) return;
+
IsTranslating = false;
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
}
- private async Task SetDisplayedAlongWithTranslationsAsync(CancellationToken token)
+ private async Task SetTranslatedTextAsync(CancellationToken token)
{
+ if (!_settingsService.AppSettings.TranslationSettings.IsTranslationEnabled) return;
+
_logger.LogInformation("Showing translation for lyrics...");
string targetLangCode = _settingsService.AppSettings.TranslationSettings.SelectedTargetLanguageCode;
_logger.LogInformation("Target language code: {TargetLangCode}", targetLangCode);
@@ -66,30 +61,11 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
string? originalLangCode = LanguageHelper.DetectLanguageCode(originalText);
_logger.LogInformation("Original language code: {OriginalLangCode}", originalLangCode ?? "null");
- if (originalLangCode == "zh" && _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled)
- {
- switch (_settingsService.AppSettings.TranslationSettings.ChineseRomanization)
- {
- case ChineseRomanization.Pinyin:
- targetLangCode = "pinyin";
- break;
- case ChineseRomanization.Jyutping:
- targetLangCode = "jyutping";
- break;
- default:
- break;
- }
- }
- else if (originalLangCode == "ja" && _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled)
- {
- targetLangCode = "romaji";
- }
-
if (originalLangCode == targetLangCode)
{
_logger.LogInformation("Original lyrics already in target language: {TargetLangCode}", targetLangCode);
- _lyricsDataArr[0].SetDisplayedTextInOriginalText();
+ _lyricsDataArr[0].ClearTranslatedText();
}
else
{
@@ -100,12 +76,12 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
_logger.LogInformation("Found translation in lyrics data at index {FoundIndex}", found);
if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly)
{
- _lyricsDataArr[found].SetDisplayedTextInOriginalText();
+ _lyricsDataArr[found].ClearTranslatedText();
_langIndex = found;
}
else
{
- _lyricsDataArr[0].SetDisplayedTextAlongWith(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50);
+ _lyricsDataArr[0].SetTranslatedText(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50);
_langIndex = 0;
TranslationSearchProvider = LyricsSearchProvider.ToTranslationSearchProvider();
}
@@ -123,12 +99,12 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly)
{
_lyricsDataArr[^1] = _lyricsDataArr[0].CreateLyricsDataFrom(translated);
- _lyricsDataArr[^1].SetDisplayedTextInOriginalText();
+ _lyricsDataArr[^1].ClearTranslatedText();
_langIndex = _lyricsDataArr.Count - 1;
}
else
{
- _lyricsDataArr[0].SetDisplayedTextAlongWith(translated, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator);
+ _lyricsDataArr[0].SetTranslation(translated, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator);
_langIndex = 0;
}
TranslationSearchProvider = Enums.TranslationSearchProvider.LibreTranslate;
@@ -141,6 +117,52 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
}
}
+ private async Task SetPhoneticTextAsync(CancellationToken token)
+ {
+ _logger.LogInformation("Showing phonetic text for lyrics...");
+ string targetPhoneticCode = "";
+ _logger.LogInformation("Target phonetic code: {TargetPhonetic}", targetPhoneticCode);
+ string? originalText = _lyricsDataArr.FirstOrDefault()?.WrappedOriginalText;
+ if (originalText == null) return;
+
+ string? originalLangCode = LanguageHelper.DetectLanguageCode(originalText);
+ _logger.LogInformation("Original language code: {OriginalLangCode}", originalLangCode ?? "null");
+
+ if (originalLangCode == "zh" && _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled)
+ {
+ switch (_settingsService.AppSettings.TranslationSettings.ChineseRomanization)
+ {
+ case ChineseRomanization.Pinyin:
+ targetPhoneticCode = "pinyin";
+ break;
+ case ChineseRomanization.Jyutping:
+ targetPhoneticCode = "jyutping";
+ break;
+ default:
+ break;
+ }
+ }
+ else if (originalLangCode == "ja" && _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled)
+ {
+ targetPhoneticCode = "romaji";
+ }
+
+ if (targetPhoneticCode == "")
+ {
+ _lyricsDataArr[0].ClearPhoneticText();
+ }
+
+ // Try get phonetic text from itself first
+ int found = _translateService.SearchTranslatedLyricsItself(_lyricsDataArr, targetPhoneticCode);
+ if (found >= 0)
+ {
+ _logger.LogInformation("Found translation in lyrics data at index {FoundIndex}", found);
+ _lyricsDataArr[0].SetPhoneticText(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50);
+ _langIndex = 0;
+ }
+
+ }
+
private async Task RefreshLyricsAsync(CancellationToken token)
{
_logger.LogInformation("Refreshing lyrics...");
@@ -180,8 +202,8 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
_logger.LogInformation("Parsed lyrics: {MultiLangLyricsCount} languages", _lyricsDataArr.Count);
- // This ensures that original lyrics are always shown while waiting for translations
- _lyricsDataArr[0].SetDisplayedTextInOriginalText();
+ // This ensures that translation is always reset while waiting for translations
+ _lyricsDataArr[0].ClearTranslatedText();
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
ApplyChinesePreference();
UpdateTranslations();
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
index 5975be0..ba1572b 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
@@ -571,6 +571,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Convert Chinese to Traditional Chinese
+
+ CJK Unified Ideograph
+
Click-through
@@ -718,6 +721,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Follow system
+
+ Font color
+
Keep the lyrics window on top by polling
@@ -814,9 +820,6 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
LX Music Server
-
- Lyrics style and effect
-
Alignment
@@ -824,7 +827,7 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Lyrics background
- Font color (Non-current playback area)
+ Non-current playback area
Font opacity (Non-current playback area)
@@ -860,7 +863,7 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Extra Light
- Font color (Current playback area)
+ Current playback area
Adaptive to lyrics background (Colored)
@@ -898,6 +901,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Glow effect
+
+ Highlight
+
Original highlight range
@@ -946,9 +952,6 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Shadows
-
- Lyrics stroke color
-
Lyrics style
@@ -1027,6 +1030,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Open in file explorer
+
+ Original text
+
Color picker style
@@ -1042,6 +1048,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
The path cannot be found on your computer
+
+ Phonetic text
+
Pinyin of Mandarin
@@ -1180,6 +1189,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Standard mode
+
+ Stroke color
+
Default
@@ -1213,6 +1225,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Switch in and cut out shortcut keys
+
+ Translated text
+
Lyrics translation
@@ -1228,6 +1243,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Version
+
+ Latin alphabet
+
Width
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
index d959bda..722dc39 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
@@ -571,6 +571,9 @@
中国人を伝統的な中国人に変換します
+
+ CJK統一漢字
+
クリックスルー
@@ -718,6 +721,9 @@
システムをフォローします
+
+ フォントの色
+
ポーリングで歌詞ウィンドウを一番上に保ちましょう
@@ -814,9 +820,6 @@
LX Music Server
-
- 歌詞のスタイルと効果
-
アライメント
@@ -824,7 +827,7 @@
歌詞の背景
- フォントカラー(非電流再生エリア)
+ 非電流再生エリア
フォントの不透明度(非電流再生エリア)
@@ -860,7 +863,7 @@
余分な光
- フォントカラー(現在の再生エリア)
+ 現在の再生エリア
歌詞の背景に適応する(色付き)
@@ -898,6 +901,9 @@
グロー効果
+
+ ハイライト
+
オリジナルのハイライト範囲
@@ -946,9 +952,6 @@
影だ
-
- 歌詞ストロークカラー
-
歌詞スタイル
@@ -1027,6 +1030,9 @@
ファイルエクスプローラーで開きます
+
+ 原文
+
カラーピックスタイル
@@ -1042,6 +1048,9 @@
パスはコンピューターでは見つかりません
+
+ 発音
+
マンダリンのピンイン
@@ -1180,6 +1189,9 @@
標準モード
+
+ ストロークカラー
+
デフォルト
@@ -1213,6 +1225,9 @@
ショートカットキーを切り込んで切り取ります
+
+ 译文
+
歌詞翻訳
@@ -1228,6 +1243,9 @@
バージョン
+
+ 英字
+
幅
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
index e1aedee..7794726 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
@@ -571,6 +571,9 @@
중국어를 전통적인 중국어로 전환합니다
+
+ 한중일 통합 이데오그래프
+
클릭률
@@ -718,6 +721,9 @@
시스템을 따르십시오
+
+ 폰트 색상
+
투표를 통해 가사 창을 맨 위에 두세요
@@ -814,9 +820,6 @@
LX 음악 서버
-
- 가사 스타일과 효과
-
조정
@@ -824,7 +827,7 @@
가사 배경
- 글꼴 색상 (비 전류 재생 영역)
+ 비 전류 재생 영역
글꼴 불투명 (비 전류 재생 영역)
@@ -860,7 +863,7 @@
여분의 빛
- 글꼴 색상 (현재 재생 영역)
+ 현재 재생 영역
가사 배경 (색상)에 적응
@@ -898,6 +901,9 @@
글로우 효과
+
+ 하이라이트
+
원래 하이라이트 범위
@@ -946,9 +952,6 @@
그림자
-
- 가사 스트로크 컬러
-
가사 스타일
@@ -1027,6 +1030,9 @@
파일 탐색기에서 열립니다
+
+ 원본
+
색상 선택 스타일
@@ -1042,6 +1048,9 @@
경로는 컴퓨터에서 찾을 수 없습니다
+
+ 발성
+
만다린의 피니 인
@@ -1180,6 +1189,9 @@
표준 모드
+
+ 윤곽선 색상
+
기본
@@ -1213,6 +1225,9 @@
바로 가기 키를 자르고 잘라냅니다
+
+ 번역
+
가사 번역
@@ -1228,6 +1243,9 @@
버전
+
+ 라틴 알파벳
+
너비
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
index bcf74b2..341b9c4 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
@@ -571,6 +571,9 @@
中文转换为繁体
+
+ 中日韩统一表意文字
+
点击穿透
@@ -718,6 +721,9 @@
跟随系统
+
+ 字体颜色
+
通过轮询方式使歌词窗口保持置于顶层状态
@@ -814,9 +820,6 @@
LX 音乐服务器
-
- 歌词样式与动效
-
对齐方式
@@ -824,7 +827,7 @@
歌词背景
- 字体颜色(非当前播放区域)
+ 非当前播放区域
字体不透明度(非当前播放区域)
@@ -860,7 +863,7 @@
超细
- 字体颜色(当前播放区域)
+ 当前播放区域
适应歌词背景(彩色)
@@ -898,6 +901,9 @@
辉光效果
+
+ 高亮
+
原文高亮显示范围
@@ -946,9 +952,6 @@
阴影
-
- 歌词描边颜色
-
歌词样式
@@ -1027,6 +1030,9 @@
在文件资源管理器中打开
+
+ 原文
+
取色风格
@@ -1042,6 +1048,9 @@
无法在您的计算机中找到该路径
+
+ 注音
+
普通话拼音
@@ -1180,6 +1189,9 @@
标准模式
+
+ 描边颜色
+
默认
@@ -1213,6 +1225,9 @@
切入与切出快捷键
+
+ 译文
+
歌词翻译
@@ -1228,6 +1243,9 @@
版本号
+
+ 拉丁字母
+
宽度
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
index 50a142b..d3efc07 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
@@ -571,6 +571,9 @@
中文轉換為繁體
+
+ 中日韓統一表意文字
+
點擊穿透
@@ -718,6 +721,9 @@
跟隨系統
+
+ 字體顏色
+
透過輪詢方式使歌詞視窗保持置於頂層狀態
@@ -814,9 +820,6 @@
LX 音樂服務器
-
- 歌詞樣式與動效
-
對齊方式
@@ -824,7 +827,7 @@
歌詞背景
- 字體顏色(非當前播放區域)
+ 非當前播放區域
字體不透明度(非目前播放區域)
@@ -860,7 +863,7 @@
超細
- 字體顏色(當前播放區域)
+ 當前播放區域
適應歌詞背景(彩色)
@@ -898,6 +901,9 @@
輝光效果
+
+ 高亮
+
原文高亮顯示範圍
@@ -946,9 +952,6 @@
陰影
-
- 歌詞描邊顏色
-
歌詞樣式
@@ -1027,6 +1030,9 @@
在檔案總管中開啟
+
+ 原文
+
取色風格
@@ -1042,6 +1048,9 @@
無法在您的電腦中找到該路徑
+
+ 注音
+
普通話拼音
@@ -1180,6 +1189,9 @@
標準模式
+
+ 描邊顏色
+
預設
@@ -1213,6 +1225,9 @@
切入與切出快捷鍵
+
+ 譯文
+
歌詞翻譯
@@ -1228,6 +1243,9 @@
版本號
+
+ 拉丁字母
+
寬度
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs
index dd6b47d..36c3584 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs
@@ -54,13 +54,11 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.Is3DLyricsEnabled)
{
- using var perspectiveEffect = new Transform3DEffect
+ combinedDs.DrawImage(new Transform3DEffect
{
Source = blurredLyrics,
TransformMatrix = _lyrics3DMatrix
- };
-
- combinedDs.DrawImage(perspectiveEffect);
+ });
}
else
{
@@ -321,7 +319,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
var line = _currentLyricsData?.LyricsLines.ElementAtOrDefault(i);
if (line == null) continue;
- var textLayout = line.CanvasTextLayout;
+ var textLayout = line.OriginalCanvasTextLayout;
if (textLayout == null) continue;
double layoutWidth = (double)textLayout.LayoutBounds.Width;
@@ -335,15 +333,16 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
ds.Transform =
Matrix3x2.CreateScale((float)line.ScaleTransition.Value, line.CenterPosition)
* Matrix3x2.CreateRotation((float)line.AngleTransition.Value,
- currentPlayingLine.Position.WithX(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.FanLyricsAngle < 0 ? (float)_maxLyricsWidth : 0))
+ currentPlayingLine.OriginalPosition.WithX(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.FanLyricsAngle < 0 ? (float)_maxLyricsWidth : 0))
* Matrix3x2.CreateTranslation((float)_lyricsXTransition.Value, (float)yOffset);
using var combined = new CanvasCommandList(control);
using var combinedDs = combined.CreateDrawingSession();
// 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次)
- using var backgroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
+ using var backgroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _bgFontColor);
+
using var backgroundEffect = CanvasHelper.CreateBackgroundEffect(line, backgroundFontEffect, _lyricsOpacityTransition.Value);
combinedDs.DrawImage(backgroundEffect);
@@ -357,17 +356,24 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsLineFadeEnabled);
using var lineMask = CanvasHelper.CreateLineMask(control, line);
- using var foregroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
+ using var foregroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _fgFontColor);
using var effectLayer = new CanvasCommandList(control);
using var effectLayerDs = effectLayer.CreateDrawingSession();
- if (line.OriginalText != line.DisplayedText && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsTranslationHighlightAmount != 0)
+ if (line.PhoneticText != "" && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.PhoneticLyricsHighlightAmount != 0)
{
- using var translationHighlightMask = CanvasHelper.CreateTranslationHighlightMask(control, line);
- using var foregroundTranslationHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, translationHighlightMask,
- _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsTranslationHighlightAmount / 100.0);
- effectLayerDs.DrawImage(foregroundTranslationHighlightEffect);
+ using var phoneticHighlightMask = CanvasHelper.CreatePhoneticHighlightMask(control, line);
+ using var foregroundPhoneticHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, phoneticHighlightMask,
+ _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.PhoneticLyricsHighlightAmount / 100.0);
+ effectLayerDs.DrawImage(foregroundPhoneticHighlightEffect);
+ }
+ if (line.TranslatedText != "" && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.TranslatedLyricsHighlightAmount != 0)
+ {
+ using var translatedHighlightMask = CanvasHelper.CreateTranslatedHighlightMask(control, line);
+ using var foregroundTranslatedHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, translatedHighlightMask,
+ _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.TranslatedLyricsHighlightAmount / 100.0);
+ effectLayerDs.DrawImage(foregroundTranslatedHighlightEffect);
}
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsShadowEnabled)
{
@@ -385,12 +391,12 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsGlowEffectAmount);
effectLayerDs.DrawImage(foregroundBlurEffect);
}
- if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightAmount != 0)
+ if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightAmount != 0)
{
var highlightEffectMask = CanvasHelper.GetAlphaMask(control, charMask, lineStartToCharMask, lineMask,
- _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightScope);
+ _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightScope);
using var foregroundHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, highlightEffectMask,
- _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightAmount / 100.0);
+ _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightAmount / 100.0);
effectLayerDs.DrawImage(foregroundHighlightEffect);
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs
index 0af559f..91fad1f 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs
@@ -234,7 +234,15 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
}
else if (message.Sender is LyricsStyleSettings)
{
- if (message.PropertyName == nameof(LyricsStyleSettings.LyricsFontSize))
+ if (message.PropertyName == nameof(LyricsStyleSettings.PhoneticLyricsFontSize))
+ {
+ _isLayoutChanged = true;
+ }
+ else if (message.PropertyName == nameof(LyricsStyleSettings.OriginalLyricsFontSize))
+ {
+ _isLayoutChanged = true;
+ }
+ else if (message.PropertyName == nameof(LyricsStyleSettings.TranslatedLyricsFontSize))
{
_isLayoutChanged = true;
}
@@ -268,7 +276,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{
_isLayoutChanged = true;
}
- else if (message.PropertyName == nameof(LyricsEffectSettings.LyricsHighlightScope))
+ else if (message.PropertyName == nameof(LyricsEffectSettings.OriginalLyricsHighlightScope))
{
_isLayoutChanged = true;
}
@@ -372,7 +380,14 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{
if (message.Sender is LyricsStyleSettings)
{
- if (message.PropertyName == nameof(LyricsStyleSettings.LyricsFontFamily))
+ if (message.PropertyName == nameof(LyricsStyleSettings.LyricsCJKFontFamily))
+ {
+ _isLayoutChanged = true;
+ }
+ }
+ if (message.Sender is LyricsStyleSettings)
+ {
+ if (message.PropertyName == nameof(LyricsStyleSettings.LyricsWesternFontFamily))
{
_isLayoutChanged = true;
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs
index 20b5280..d3b05c5 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs
@@ -2,6 +2,7 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
+using BetterLyrics.WinUI3.Services;
using CommunityToolkit.WinUI;
using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects;
@@ -444,6 +445,13 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_canvasYScrollTransition.Update(_elapsedTime);
}
+ private string AutoSelectFontFamily(string text)
+ {
+ return LanguageHelper.IsCJK(text)
+ ? _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsCJKFontFamily
+ : _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsWesternFontFamily;
+ }
+
private void ReLayout(ICanvasAnimatedControl control)
{
if (control == null)
@@ -451,14 +459,23 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.IsDynamicLyricsFontSize)
{
- _lyricsTextFormat.FontSize = (float)Math.Clamp(Math.Min(_canvasHeight, _canvasWidth) / 15, 12, 96);
+ _originalLyricsFontSize = (int)Math.Clamp(Math.Min(_canvasHeight, _canvasWidth) / 15, 12, 96);
+ _translatedLyricsFontSize = _phoneticLyricsFontSize = (int)(_originalLyricsFontSize * 0.6);
}
else
{
- _lyricsTextFormat.FontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontSize;
+ _phoneticLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.PhoneticLyricsFontSize;
+ _originalLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.OriginalLyricsFontSize;
+ _translatedLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.TranslatedLyricsFontSize;
+ }
+
+ _originalLyricsFontWeight = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontWeight;
+
+ if (SongInfo != null)
+ {
+ _titleTextFormat.FontFamily = AutoSelectFontFamily(SongInfo.Title);
+ _artistTextFormat.FontFamily = AutoSelectFontFamily(SongInfo.Artist);
}
- _lyricsTextFormat.FontWeight = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontWeight.ToFontWeight();
- _lyricsTextFormat.FontFamily = _artistTextFormat.FontFamily = _titleTextFormat.FontFamily = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontFamily;
_canvasYScrollTransition.SetDuration(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollDuration / 1000.0);
_canvasYScrollTransition.SetEasingType(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollEasingType);
@@ -475,16 +492,70 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
continue;
}
- line.Position = new Vector2(0, (float)y);
- line.RecreateTextLayout(control, _lyricsTextFormat, _maxLyricsWidth, _canvasHeight, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
- line.UpdateCenterPosition(_maxLyricsWidth, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
-
+ line.RecreateTextLayout(control,
+ _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled || _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled,
+ _settingsService.AppSettings.TranslationSettings.IsTranslationEnabled,
+ _phoneticLyricsFontSize, _originalLyricsFontSize, _translatedLyricsFontSize,
+ _originalLyricsFontWeight,
+ _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsCJKFontFamily, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsWesternFontFamily,
+ _maxLyricsWidth, _canvasHeight, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
line.RecreateTextGeometry();
- y +=
- (double)line.CanvasTextLayout!.LayoutBounds.Height
- / line.CanvasTextLayout.LineCount
- * (line.CanvasTextLayout.LineCount + _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsLineSpacingFactor);
+ // 设定注音文本布局坐标
+ line.PhoneticPosition = new Vector2(0, (float)y);
+
+ // Y += 注音文本布局高度
+ if (line.PhoneticCanvasTextLayout != null)
+ {
+ y += line.PhoneticCanvasTextLayout.LayoutBounds.Height;
+ }
+
+ // Y += 自定义 倍注音文本行高
+ if (line.PhoneticCanvasTextLayout != null)
+ {
+ y +=
+ (double)line.PhoneticCanvasTextLayout.LayoutBounds.Height
+ / line.PhoneticCanvasTextLayout.LineCount
+ * 0.1;
+ }
+
+ // 设定原文文本布局坐标
+ line.OriginalPosition = new Vector2(0, (float)y);
+
+ // Y += 原文文本布局高度
+ if (line.OriginalCanvasTextLayout != null)
+ {
+ y += (double)line.OriginalCanvasTextLayout.LayoutBounds.Height;
+ }
+
+ if (line.TranslatedCanvasTextLayout != null)
+ {
+ // Y += 自定义 倍翻译文本行高
+ y +=
+ (double)line.TranslatedCanvasTextLayout.LayoutBounds.Height
+ / line.TranslatedCanvasTextLayout.LineCount
+ * 0.1;
+ }
+
+ // 设定翻译文本布局坐标
+ line.TranslatedPosition = new Vector2(0, (float)y);
+
+ // Y += 翻译文本布局高度
+ if (line.TranslatedCanvasTextLayout != null)
+ {
+ y += line.TranslatedCanvasTextLayout.LayoutBounds.Height;
+ }
+
+ // Y += 用户自定义倍数原文文本布局高度
+ if (line.OriginalCanvasTextLayout != null)
+ {
+ y += (double)line.OriginalCanvasTextLayout.LayoutBounds.Height
+ / line.OriginalCanvasTextLayout.LineCount
+ * _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsLineSpacingFactor;
+ }
+
+ line.UpdateCenterPosition(_maxLyricsWidth, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
+
}
}
@@ -500,11 +571,15 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (currentPlayingLine == null) return;
- var playingTextLayout = currentPlayingLine?.CanvasTextLayout;
+ var playingTextLayout = currentPlayingLine?.OriginalCanvasTextLayout;
if (playingTextLayout == null) return;
- double? targetYScrollOffset = -currentPlayingLine!.Position.Y + _currentLyricsData?.LyricsLines[0].Position.Y - playingTextLayout.LayoutBounds.Height / 2.0;
+ //double? targetYScrollOffset = -currentPlayingLine!.OriginalPosition.Y + _currentLyricsData?.LyricsLines[0].OriginalPosition.Y - playingTextLayout.LayoutBounds.Height / 2.0;
+ double? targetYScrollOffset =
+ -currentPlayingLine!.OriginalPosition.Y
+ + _currentLyricsData?.LyricsLines[0].OriginalPosition.Y
+ - (currentPlayingLine.TranslatedPosition.Y + (currentPlayingLine.TranslatedCanvasTextLayout?.LayoutBounds.Height ?? 0) - currentPlayingLine.PhoneticPosition.Y) / 2.0;
if (!targetYScrollOffset.HasValue) return;
@@ -540,9 +615,9 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{
int mid = (left + right) / 2;
var line = lines[mid];
- var layout = line.CanvasTextLayout;
+ var layout = line.OriginalCanvasTextLayout;
if (layout == null) break;
- double value = offset + line.Position.Y + (double)layout.LayoutBounds.Height;
+ double value = offset + line.OriginalPosition.Y + (double)layout.LayoutBounds.Height;
if (value >= 0)
{
result = mid;
@@ -563,9 +638,9 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{
int mid = (left + right) / 2;
var line = lines[mid];
- var layout = line.CanvasTextLayout;
+ var layout = line.OriginalCanvasTextLayout;
if (layout == null) break;
- double value = offset + line.Position.Y + (double)layout.LayoutBounds.Height;
+ double value = offset + line.OriginalPosition.Y + (double)layout.LayoutBounds.Height;
if (value >= canvasHeight)
{
result = mid;
@@ -703,7 +778,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{
int lineCountDelta = i - _playingLineIndex;
int absoluteLineCountDelta = Math.Abs(lineCountDelta);
- double distanceFromPlayingLine = Math.Abs(line.Position.Y - currentPlayingLine.Position.Y);
+ double distanceFromPlayingLine = Math.Abs(line.OriginalPosition.Y - currentPlayingLine.OriginalPosition.Y);
double distanceFactor = Math.Clamp(distanceFromPlayingLine / (_canvasHeight / 2), 0, 1);
line.AngleTransition.StartTransition(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsFanLyricsEnabled
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs
index 5c15522..0124070 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.cs
@@ -134,12 +134,12 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
private int _timelineSyncThreshold = 0;
- private CanvasTextFormat _lyricsTextFormat = new()
- {
- HorizontalAlignment = CanvasHorizontalAlignment.Left,
- VerticalAlignment = CanvasVerticalAlignment.Top,
- FontSize = 12,
- };
+ private int _phoneticLyricsFontSize = 18;
+ private int _originalLyricsFontSize = 36;
+ private int _translatedLyricsFontSize = 18;
+
+ private LyricsFontWeight _originalLyricsFontWeight = LyricsFontWeight.Bold;
+
private CanvasTextFormat _titleTextFormat = new()
{
FontSize = 18,
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml
index 197a0f7..812c945 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml
@@ -33,8 +33,8 @@
@@ -321,7 +321,8 @@
Margin="0,0,0,2"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind ViewModel.TimelineSliderThumbLyricsLine.StartMs, Converter={StaticResource MillisecondsToFormattedTimeConverter}, Mode=OneWay}" />
-
+
+