From 7658f21d7ca990e5274caef9757370dbb9129b9b Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 4 Mar 2025 15:07:37 -0700 Subject: [PATCH] Fix tags font color in dark mode --- .../Dialogs/EditTemplateDialog.axaml | 4 +- .../Dialogs/EditTemplateDialog.axaml.cs | 288 +++++++++--------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml index cd5a9ba6..9b29ec9e 100644 --- a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml +++ b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml @@ -51,7 +51,7 @@ - + @@ -59,7 +59,7 @@ - diff --git a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs index 12d145a1..3a7010b4 100644 --- a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs @@ -1,8 +1,8 @@ using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.Documents; -using Avalonia.Markup.Xaml; using Avalonia.Media; +using Avalonia.Styling; using Dinah.Core; using LibationFileManager; using ReactiveUI; @@ -11,175 +11,175 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -namespace LibationAvalonia.Dialogs +namespace LibationAvalonia.Dialogs; + +public partial class EditTemplateDialog : DialogWindow { - public partial class EditTemplateDialog : DialogWindow + private EditTemplateViewModel _viewModel; + + public EditTemplateDialog() { - private EditTemplateViewModel _viewModel; + InitializeComponent(); - public EditTemplateDialog() + if (Design.IsDesignMode) { - InitializeComponent(); - - if (Design.IsDesignMode) - { - _ = Configuration.Instance.LibationFiles; - var editor = TemplateEditor.CreateFilenameEditor(Configuration.Instance.Books, Configuration.Instance.FileTemplate); - _viewModel = new(Configuration.Instance, editor); - _viewModel.ResetTextBox(editor.EditingTemplate.TemplateText); - Title = $"Edit {editor.TemplateName}"; - DataContext = _viewModel; - } - } - - public EditTemplateDialog(ITemplateEditor templateEditor) : this() - { - ArgumentValidator.EnsureNotNull(templateEditor, nameof(templateEditor)); - - _viewModel = new EditTemplateViewModel(Configuration.Instance, templateEditor); - _viewModel.ResetTextBox(templateEditor.EditingTemplate.TemplateText); - Title = $"Edit {templateEditor.TemplateName}"; + _ = Configuration.Instance.LibationFiles; + RequestedThemeVariant = ThemeVariant.Dark; + var editor = TemplateEditor.CreateFilenameEditor(Configuration.Instance.Books, Configuration.Instance.FileTemplate); + _viewModel = new(Configuration.Instance, editor); + _viewModel.ResetTextBox(editor.EditingTemplate.TemplateText); + Title = $"Edit {editor.TemplateName}"; DataContext = _viewModel; } + } + + public EditTemplateDialog(ITemplateEditor templateEditor) : this() + { + ArgumentValidator.EnsureNotNull(templateEditor, nameof(templateEditor)); + + _viewModel = new EditTemplateViewModel(Configuration.Instance, templateEditor); + _viewModel.ResetTextBox(templateEditor.EditingTemplate.TemplateText); + Title = $"Edit {templateEditor.TemplateName}"; + DataContext = _viewModel; + } - public void EditTemplateViewModel_DoubleTapped(object sender, Avalonia.Input.TappedEventArgs e) + public void EditTemplateViewModel_DoubleTapped(object sender, Avalonia.Input.TappedEventArgs e) + { + var dataGrid = sender as DataGrid; + + var item = (dataGrid.SelectedItem as Tuple).Item3; + if (string.IsNullOrWhiteSpace(item)) return; + + var text = userEditTbox.Text; + + userEditTbox.Text = text.Insert(Math.Min(Math.Max(0, userEditTbox.CaretIndex), text.Length), item); + userEditTbox.CaretIndex += item.Length; + } + + protected override async Task SaveAndCloseAsync() + { + if (!await _viewModel.Validate()) + return; + + await base.SaveAndCloseAsync(); + } + + public async void SaveButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) + => await SaveAndCloseAsync(); + + private class EditTemplateViewModel : ViewModels.ViewModelBase + { + private readonly Configuration config; + public InlineCollection Inlines { get; } = new(); + public ITemplateEditor TemplateEditor { get; } + public EditTemplateViewModel(Configuration configuration, ITemplateEditor templates) { - var dataGrid = sender as DataGrid; + config = configuration; + TemplateEditor = templates; + Description = templates.TemplateDescription; + ListItems + = new AvaloniaList>( + TemplateEditor + .EditingTemplate + .TagsRegistered + .Cast() + .Select( + t => new Tuple( + $"<{t.TagName}>", + t.Description, + t.DefaultValue) + ) + ); - var item = (dataGrid.SelectedItem as Tuple).Item3; - if (string.IsNullOrWhiteSpace(item)) return; - - var text = userEditTbox.Text; - - userEditTbox.Text = text.Insert(Math.Min(Math.Max(0, userEditTbox.CaretIndex), text.Length), item); - userEditTbox.CaretIndex += item.Length; } - protected override async Task SaveAndCloseAsync() + // hold the work-in-progress value. not guaranteed to be valid + private string _userTemplateText; + public string UserTemplateText { - if (!await _viewModel.Validate()) - return; - - await base.SaveAndCloseAsync(); - } - - public async void SaveButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) - => await SaveAndCloseAsync(); - - private class EditTemplateViewModel : ViewModels.ViewModelBase - { - private readonly Configuration config; - public InlineCollection Inlines { get; } = new(); - public ITemplateEditor TemplateEditor { get; } - public EditTemplateViewModel(Configuration configuration, ITemplateEditor templates) + get => _userTemplateText; + set { - config = configuration; - TemplateEditor = templates; - Description = templates.TemplateDescription; - ListItems - = new AvaloniaList>( + this.RaiseAndSetIfChanged(ref _userTemplateText, value); + templateTb_TextChanged(); + } + } + + private string _warningText; + public string WarningText { get => _warningText; set => this.RaiseAndSetIfChanged(ref _warningText, value); } + + public string Description { get; } + + public AvaloniaList> ListItems { get; set; } + + public void ResetTextBox(string value) => UserTemplateText = value; + public void ResetToDefault() => ResetTextBox(TemplateEditor.DefaultTemplate); + + public async Task Validate() + { + if (TemplateEditor.EditingTemplate.IsValid) + return true; + + var errors + = TemplateEditor + .EditingTemplate + .Errors + .Select(err => $"- {err}") + .Aggregate((a, b) => $"{a}\r\n{b}"); + await MessageBox.Show($"This template text is not valid. Errors:\r\n{errors}", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + private void templateTb_TextChanged() + { + TemplateEditor.SetTemplateText(UserTemplateText); + + const char ZERO_WIDTH_SPACE = '\u200B'; + var sing = $"{Path.DirectorySeparatorChar}"; + + // result: can wrap long paths. eg: + // |-- LINE WRAP BOUNDARIES --| + // \books\author with a very <= normal line break on space between words + // long name\narrator narrator + // \title <= line break on the zero-with space we added before slashes + string slashWrap(string val) => val.Replace(sing, $"{ZERO_WIDTH_SPACE}{sing}"); + + WarningText + = !TemplateEditor.EditingTemplate.HasWarnings + ? "" + : "Warning:\r\n" + TemplateEditor .EditingTemplate - .TagsRegistered - .Cast() - .Select( - t => new Tuple( - $"<{t.TagName}>", - t.Description, - t.DefaultValue) - ) - ); + .Warnings + .Select(err => $"- {err}") + .Aggregate((a, b) => $"{a}\r\n{b}"); - } + var bold = FontWeight.Bold; + var reg = FontWeight.Normal; - // hold the work-in-progress value. not guaranteed to be valid - private string _userTemplateText; - public string UserTemplateText + Inlines.Clear(); + + if (!TemplateEditor.IsFilePath) { - get => _userTemplateText; - set - { - this.RaiseAndSetIfChanged(ref _userTemplateText, value); - templateTb_TextChanged(); - } + Inlines.Add(new Run(TemplateEditor.GetName()) { FontWeight = bold }); + return; } - private string _warningText; - public string WarningText { get => _warningText; set => this.RaiseAndSetIfChanged(ref _warningText, value); } + var folder = TemplateEditor.GetFolderName(); + var file = TemplateEditor.GetFileName(); + var ext = config.DecryptToLossy ? "mp3" : "m4b"; - public string Description { get; } + Inlines.Add(new Run(slashWrap(TemplateEditor.BaseDirectory.PathWithoutPrefix)) { FontWeight = reg }); + Inlines.Add(new Run(sing) { FontWeight = reg }); - public AvaloniaList> ListItems { get; set; } + Inlines.Add(new Run(slashWrap(folder)) { FontWeight = TemplateEditor.IsFolder ? bold : reg }); - public void ResetTextBox(string value) => UserTemplateText = value; - public void ResetToDefault() => ResetTextBox(TemplateEditor.DefaultTemplate); + Inlines.Add(new Run(sing)); - public async Task Validate() - { - if (TemplateEditor.EditingTemplate.IsValid) - return true; + Inlines.Add(new Run(slashWrap(file)) { FontWeight = TemplateEditor.IsFolder ? reg : bold }); - var errors - = TemplateEditor - .EditingTemplate - .Errors - .Select(err => $"- {err}") - .Aggregate((a, b) => $"{a}\r\n{b}"); - await MessageBox.Show($"This template text is not valid. Errors:\r\n{errors}", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error); - return false; - } - - private void templateTb_TextChanged() - { - TemplateEditor.SetTemplateText(UserTemplateText); - - const char ZERO_WIDTH_SPACE = '\u200B'; - var sing = $"{Path.DirectorySeparatorChar}"; - - // result: can wrap long paths. eg: - // |-- LINE WRAP BOUNDARIES --| - // \books\author with a very <= normal line break on space between words - // long name\narrator narrator - // \title <= line break on the zero-with space we added before slashes - string slashWrap(string val) => val.Replace(sing, $"{ZERO_WIDTH_SPACE}{sing}"); - - WarningText - = !TemplateEditor.EditingTemplate.HasWarnings - ? "" - : "Warning:\r\n" + - TemplateEditor - .EditingTemplate - .Warnings - .Select(err => $"- {err}") - .Aggregate((a, b) => $"{a}\r\n{b}"); - - var bold = FontWeight.Bold; - var reg = FontWeight.Normal; - - Inlines.Clear(); - - if (!TemplateEditor.IsFilePath) - { - Inlines.Add(new Run(TemplateEditor.GetName()) { FontWeight = bold }); - return; - } - - var folder = TemplateEditor.GetFolderName(); - var file = TemplateEditor.GetFileName(); - var ext = config.DecryptToLossy ? "mp3" : "m4b"; - - Inlines.Add(new Run(slashWrap(TemplateEditor.BaseDirectory.PathWithoutPrefix)) { FontWeight = reg }); - Inlines.Add(new Run(sing) { FontWeight = reg }); - - Inlines.Add(new Run(slashWrap(folder)) { FontWeight = TemplateEditor.IsFolder ? bold : reg }); - - Inlines.Add(new Run(sing)); - - Inlines.Add(new Run(slashWrap(file)) { FontWeight = TemplateEditor.IsFolder ? reg : bold }); - - Inlines.Add(new Run($".{ext}")); - } + Inlines.Add(new Run($".{ext}")); } } }