From d195c29f799bea7d3523869ead467d769dd2a3e5 Mon Sep 17 00:00:00 2001 From: gramps Date: Wed, 4 Nov 2026 17:17:57 -0800 Subject: [PATCH] fix(text): group controls and filter font families Put size and color on one row, place emphasis labels before their toggles, and split the remaining font families into handwriting, symbols, and international groups while omitting legacy dingbat fonts. Text-layer properties follow the existing hierarchical layout and palette conventions. --- Controls/LeftPanel.xaml | 67 ++++++++++++++++--------- ViewModels/MainViewModel.TextOverlay.cs | 59 ++++++++++++++++++++-- ytLive.Tests/TextLayerDropdownTests.cs | 20 +++++++- 3 files changed, 115 insertions(+), 31 deletions(-) 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();