diff --git a/Controls/LeftPanel.xaml b/Controls/LeftPanel.xaml
index 4c20cc5..57311cc 100644
--- a/Controls/LeftPanel.xaml
+++ b/Controls/LeftPanel.xaml
@@ -326,7 +326,7 @@
VerticalScrollBarVisibility="Auto" MinHeight="72" MaxHeight="120" Margin="10,0,0,8"
AutomationProperties.Name="Text layer content"/>
-
+
-
-
-
-
-
-
+
+
+
+
-
+
-
+ Style="{StaticResource YtComboBox}" Width="100" Margin="4,0,0,0"
+ ToolTip="Choose a text color" AutomationProperties.Name="Text layer color palette"/>
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ExcludedLegacyFontFamilies = new(StringComparer.OrdinalIgnoreCase)
+ {
+ "Bookshelf Symbol 7", "Marlett", "Symbol", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3",
+ };
private static readonly string[] SystemTextFontFamilies = Fonts.SystemFontFamilies
.Select(font => font.Source)
+ .Where(font => !ExcludedLegacyFontFamilies.Contains(font))
.Distinct(StringComparer.OrdinalIgnoreCase)
.OrderBy(name => name, StringComparer.CurrentCultureIgnoreCase)
.ToArray();
@@ -26,7 +31,7 @@ public partial class MainViewModel
private string _selectedTextFontType = "Sans Serif";
public IReadOnlyList TextFontTypeOptions { get; } =
- new[] { "Sans Serif", "Serif", "Monospace", "Display", "Other" };
+ new[] { "Sans Serif", "Serif", "Monospace", "Display", "Handwriting", "Symbols", "International", "Other" };
public string SelectedTextFontType
{
@@ -104,18 +109,33 @@ public partial class MainViewModel
|| font.Contains("Terminal", StringComparison.OrdinalIgnoreCase))
return "Monospace";
+ if (SymbolFonts.Contains(font, StringComparer.OrdinalIgnoreCase)
+ || SymbolFontTokens.Any(token => font.Contains(token, StringComparison.OrdinalIgnoreCase)))
+ return "Symbols";
+
+ if (font.Contains("Script", StringComparison.OrdinalIgnoreCase)
+ || font.Contains("Hand", StringComparison.OrdinalIgnoreCase)
+ || font.Contains("Print", StringComparison.OrdinalIgnoreCase)
+ || HandwritingFonts.Contains(font, StringComparer.OrdinalIgnoreCase))
+ return "Handwriting";
+
+ if (InternationalFonts.Contains(font, StringComparer.OrdinalIgnoreCase)
+ || InternationalFontTokens.Any(token => font.Contains(token, StringComparison.OrdinalIgnoreCase)))
+ return "International";
+
if (SerifFonts.Contains(font, StringComparer.OrdinalIgnoreCase)
|| (font.Contains("Serif", StringComparison.OrdinalIgnoreCase)
&& !font.Contains("Sans", StringComparison.OrdinalIgnoreCase)))
return "Serif";
if (font.Contains("Display", StringComparison.OrdinalIgnoreCase)
- || font.Contains("Script", StringComparison.OrdinalIgnoreCase)
|| DisplayFonts.Contains(font, StringComparer.OrdinalIgnoreCase))
return "Display";
if (font.Contains("Sans", StringComparison.OrdinalIgnoreCase)
- || SansSerifFonts.Contains(font, StringComparer.OrdinalIgnoreCase))
+ || SansSerifFonts.Contains(font, StringComparer.OrdinalIgnoreCase)
+ || font.StartsWith("Segoe UI", StringComparison.OrdinalIgnoreCase)
+ || font.StartsWith("Arial", StringComparison.OrdinalIgnoreCase))
return "Sans Serif";
return "Other";
@@ -130,7 +150,38 @@ public partial class MainViewModel
private static readonly string[] DisplayFonts =
{
"Algerian", "Broadway", "Chiller", "Comic Sans MS", "Cooper Black", "Impact", "Jokerman",
- "Magneto", "Papyrus", "Showcard Gothic", "Stencil",
+ "Magneto", "Showcard Gothic", "Stencil",
+ };
+
+ private static readonly string[] HandwritingFonts =
+ {
+ "Bradley Hand ITC", "Brush Script MT", "Edwardian Script ITC", "French Script MT",
+ "Freestyle Script", "Kunstler Script", "Lucida Handwriting", "Mistral", "Monotype Corsiva",
+ "Papyrus", "Pristina", "Segoe Print", "Segoe Script", "Viner Hand ITC", "Vladimir Script",
+ };
+
+ private static readonly string[] SymbolFonts =
+ {
+ "Segoe MDL2 Assets", "Segoe Fluent Icons", "Segoe UI Symbol", "Segoe UI Emoji",
+ };
+
+ private static readonly string[] SymbolFontTokens =
+ {
+ "Emoji", "Icon", "Symbol", "Wingding", "Webding", "Dingbat",
+ };
+
+ private static readonly string[] InternationalFonts =
+ {
+ "Batang", "DengXian", "Dotum", "Ebrima", "FangSong", "Gulim", "Hiragino", "KaiTi",
+ "Leelawadee", "Malgun Gothic", "Meiryo", "MingLiU", "Mongolian", "MS Gothic", "Nirmala UI",
+ "NSimSun", "PMingLiU", "SimSun", "Yu Gothic", "Yu Mincho",
+ };
+
+ private static readonly string[] InternationalFontTokens =
+ {
+ "Arabic", "Armenian", "Bengali", "Canadian Aboriginal", "Cherokee", "Devanagari", "Ethiopic",
+ "Georgian", "Gujarati", "Gurmukhi", "Hebrew", "Javanese", "Kannada", "Khmer", "Lao",
+ "Myanmar", "Oriya", "Sinhala", "Syriac", "Tamil", "Telugu", "Thai",
};
private static readonly string[] SansSerifFonts =
diff --git a/ytLive.Tests/TextLayerDropdownTests.cs b/ytLive.Tests/TextLayerDropdownTests.cs
index 98e878c..d32d94b 100644
--- a/ytLive.Tests/TextLayerDropdownTests.cs
+++ b/ytLive.Tests/TextLayerDropdownTests.cs
@@ -3,6 +3,7 @@ using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
using Microsoft.Data.Sqlite;
using Xunit;
using ytLive.Controls;
@@ -51,6 +52,7 @@ public sealed class TextLayerDropdownTests
var color = (ComboBox)panel.FindName("TextLayerColorPicker")!;
var horizontal = (ComboBox)panel.FindName("TextLayerHorizontalAlignmentPicker")!;
var vertical = (ComboBox)panel.FindName("TextLayerVerticalAlignmentPicker")!;
+ var boldToggle = (ToggleButton)panel.FindName("TextBoldToggle")!;
Assert.Equal("Sans Serif", fontType.SelectedItem);
Assert.Equal("Sans Serif", fontType.Text);
@@ -67,10 +69,24 @@ public sealed class TextLayerDropdownTests
Assert.Same(Application.Current.Resources["YtComboBox"], color.Style);
Assert.Same(panel.Resources["BorderColorTemplates"], color.ItemTemplateSelector);
- Assert.Equal(10, ((FrameworkElement)fontType.Parent).Margin.Left);
- Assert.Equal(10, ((FrameworkElement)color.Parent).Margin.Left);
+ Assert.Same(size.Parent, colorField.Parent);
+ Assert.Same(size.Parent, color.Parent);
+ Assert.Equal(10, ((FrameworkElement)panel.FindName("TextTypographyOptions")!).Margin.Left);
+ Assert.Equal(10, ((FrameworkElement)panel.FindName("TextEmphasisOptions")!).Margin.Left);
Assert.Equal(10, ((FrameworkElement)horizontal.Parent).Margin.Left);
Assert.Equal(10, ((FrameworkElement)vertical.Parent).Margin.Left);
+ var boldRow = (DockPanel)boldToggle.Parent;
+ Assert.True(boldRow.Children.IndexOf(boldRow.Children[0]) < boldRow.Children.IndexOf(boldToggle));
+ Assert.Equal("Bold", ((TextBlock)boldRow.Children[0]).Text);
+
+ fontType.SelectedItem = "Symbols";
+ window.UpdateLayout();
+ Assert.DoesNotContain(vm.TextFontFamilies, item => item is "Webdings" or "Wingdings" or "Wingdings 2" or "Wingdings 3");
+ Assert.Equal("Segoe UI", source.TextFontFamily);
+
+ fontType.SelectedItem = "Sans Serif";
+ window.UpdateLayout();
+ Assert.Equal("Segoe UI", font.SelectedItem);
fontType.SelectedItem = "Serif";
window.UpdateLayout();