From 6a451c846da0a4dd9418a91d0240882cf4e72ad8 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Sun, 12 Apr 2026 10:25:21 +0800 Subject: [PATCH] feat: add FrameCell widget --- .../Frontend/Converters/CellColorConverter.cs | 63 +++++++++++++++++++ .../StringifiedDeltaTimeConverter.cs | 4 +- .../Validators.cs => Validators/Validator.cs} | 2 +- .../ValidatorAdapter.cs | 2 +- .../Frontend/ViewModels/NewFileDialog.cs | 8 +-- .../Frontend/Views/MainWindow.xaml | 6 +- .../Frontend/Widgets/FrameCell.xaml | 13 ++++ .../Frontend/Widgets/FrameCell.xaml.cs | 44 +++++++++++++ 8 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 BallanceTasEditor/BallanceTasEditor/Frontend/Converters/CellColorConverter.cs rename BallanceTasEditor/BallanceTasEditor/Frontend/{Validator/Validators.cs => Validators/Validator.cs} (96%) rename BallanceTasEditor/BallanceTasEditor/Frontend/{Validator => Validators}/ValidatorAdapter.cs (95%) create mode 100644 BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml create mode 100644 BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml.cs diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/CellColorConverter.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/CellColorConverter.cs new file mode 100644 index 0000000..cd333e0 --- /dev/null +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/CellColorConverter.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media; + +namespace BallanceTasEditor.Frontend.Converters { + + [ValueConversion(typeof(bool), typeof(Brush))] + public class CellIsSelectedToColorConverter : IValueConverter { + public static readonly CellIsSelectedToColorConverter Instance = new CellIsSelectedToColorConverter(); + + private static readonly SolidColorBrush SELECTED_BRUSH = new(Color.FromRgb(255, 152, 0)); + private static readonly SolidColorBrush DESELECTED_BRUSH = new(Color.FromRgb(158, 158, 158)); + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + var isSelected = value as bool?; + if (isSelected is null) { + return Binding.DoNothing; + } else { + if (isSelected.Value) { + return SELECTED_BRUSH; + } else { + return DESELECTED_BRUSH; + } + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + return Binding.DoNothing; + } + } + + [ValueConversion(typeof(bool), typeof(Brush))] + public class CellIsSetToColorConverter : IValueConverter { + public static readonly CellIsSetToColorConverter Instance = new CellIsSetToColorConverter(); + + private static readonly SolidColorBrush SET_BRUSH = new(Color.FromRgb(30, 144, 255)); + private static readonly SolidColorBrush UNSET_BRUSH = new(Color.FromRgb(255, 255, 255)); + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + var isSet = value as bool?; + if (isSet is null) { + return Binding.DoNothing; + } else { + if (isSet.Value) { + return SET_BRUSH; + } else { + return UNSET_BRUSH; + } + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + return Binding.DoNothing; + } + } + +} diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/StringifiedDeltaTimeConverter.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/StringifiedDeltaTimeConverter.cs index ada93bc..c3ae4fe 100644 --- a/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/StringifiedDeltaTimeConverter.cs +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Converters/StringifiedDeltaTimeConverter.cs @@ -14,10 +14,10 @@ namespace BallanceTasEditor.Frontend.Converters { public static readonly StringifiedDeltaTimeConverter Instance = new StringifiedDeltaTimeConverter(); public StringifiedDeltaTimeConverter() { - m_Validator = new Validator.FpsValidator(); + m_Validator = new Validators.FpsValidator(); } - private Validator.FpsValidator m_Validator; + private Validators.FpsValidator m_Validator; private static readonly string INVALID_DELTA_TIME = "N/A"; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Validator/Validators.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/Validators/Validator.cs similarity index 96% rename from BallanceTasEditor/BallanceTasEditor/Frontend/Validator/Validators.cs rename to BallanceTasEditor/BallanceTasEditor/Frontend/Validators/Validator.cs index 4e59ef4..76b8244 100644 --- a/BallanceTasEditor/BallanceTasEditor/Frontend/Validator/Validators.cs +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Validators/Validator.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BallanceTasEditor.Frontend.Validator { +namespace BallanceTasEditor.Frontend.Validators { public interface IValidator { OneOf Validate(TIn value); diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Validator/ValidatorAdapter.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/Validators/ValidatorAdapter.cs similarity index 95% rename from BallanceTasEditor/BallanceTasEditor/Frontend/Validator/ValidatorAdapter.cs rename to BallanceTasEditor/BallanceTasEditor/Frontend/Validators/ValidatorAdapter.cs index 98ae9d6..8dbea5a 100644 --- a/BallanceTasEditor/BallanceTasEditor/Frontend/Validator/ValidatorAdapter.cs +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Validators/ValidatorAdapter.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BallanceTasEditor.Frontend.Validator { +namespace BallanceTasEditor.Frontend.Validators { public sealed class ValidatorAdapter where V: IValidator { public ValidatorAdapter(IValidator validator) { diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/ViewModels/NewFileDialog.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/ViewModels/NewFileDialog.cs index 6b8ca49..cd7c1a7 100644 --- a/BallanceTasEditor/BallanceTasEditor/Frontend/ViewModels/NewFileDialog.cs +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/ViewModels/NewFileDialog.cs @@ -28,15 +28,15 @@ namespace BallanceTasEditor.Frontend.ViewModels { #region Validators - private static readonly Validator.ValidatorAdapter g_CountValidator = - new Validator.ValidatorAdapter(new Validator.CountValidator()); + private static readonly Validators.ValidatorAdapter g_CountValidator = + new Validators.ValidatorAdapter(new Validators.CountValidator()); public static ValidationResult? ValidateCount(string value, ValidationContext context) { return g_CountValidator.Validate(value, context); } - private static readonly Validator.ValidatorAdapter g_FpsValidator = - new Validator.ValidatorAdapter(new Validator.FpsValidator()); + private static readonly Validators.ValidatorAdapter g_FpsValidator = + new Validators.ValidatorAdapter(new Validators.FpsValidator()); public static ValidationResult? ValidateFps(string value, ValidationContext context) { return g_FpsValidator.Validate(value, context); diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Views/MainWindow.xaml b/BallanceTasEditor/BallanceTasEditor/Frontend/Views/MainWindow.xaml index 8e95572..cdc38a7 100644 --- a/BallanceTasEditor/BallanceTasEditor/Frontend/Views/MainWindow.xaml +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Views/MainWindow.xaml @@ -67,9 +67,9 @@ - - - + + + diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml b/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml new file mode 100644 index 0000000..bf1dc2e --- /dev/null +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml @@ -0,0 +1,13 @@ + + + diff --git a/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml.cs b/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml.cs new file mode 100644 index 0000000..32fcb32 --- /dev/null +++ b/BallanceTasEditor/BallanceTasEditor/Frontend/Widgets/FrameCell.xaml.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace BallanceTasEditor.Frontend.Widgets { + /// + /// Interaction logic for FrameCell.xaml + /// + public partial class FrameCell : UserControl { + public FrameCell() { + InitializeComponent(); + } + + public bool IsSelected { + get { return (bool)GetValue(IsSelectedProperty); } + set { SetValue(IsSelectedProperty, value); } + } + + // Using a DependencyProperty as the backing store for IsSelected. This enables animation, styling, binding, etc... + public static readonly DependencyProperty IsSelectedProperty = + DependencyProperty.Register("IsSelected", typeof(bool), typeof(FrameCell), new PropertyMetadata(false)); + + public bool IsSet { + get { return (bool)GetValue(IsSetProperty); } + set { SetValue(IsSetProperty, value); } + } + + // Using a DependencyProperty as the backing store for IsSet. This enables animation, styling, binding, etc... + public static readonly DependencyProperty IsSetProperty = + DependencyProperty.Register("IsSet", typeof(bool), typeof(FrameCell), new PropertyMetadata(false)); + + } +}