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();