33using System . Windows ;
44using System . Windows . Controls ;
55using System . Windows . Data ;
6+ using System . Windows . Markup ;
67
78namespace KoAR . SaveEditor . Constructs ;
89
@@ -24,40 +25,63 @@ public bool IsLoading
2425 set => this . SetValue ( LoadingIndicator . IsLoadingProperty , BooleanBoxes . GetBox ( value ) ) ;
2526 }
2627
28+ private static double ParseName ( string name , CultureInfo culture ) => double . Parse ( name [ 6 ..] , NumberStyles . Float , culture ) ;
29+
2730 private sealed class CircleLocationConverter : IMultiValueConverter
2831 {
2932 object IMultiValueConverter . Convert ( object [ ] values , Type targetType , object parameter , CultureInfo culture )
3033 {
31- if ( values is not { Length : 2 } || parameter is not string text )
34+ if ( parameter is not DependencyProperty property || values is not { Length : 2 } || values [ 0 ] is not double width || values [ 1 ] is not string name )
3235 {
3336 return DependencyProperty . UnsetValue ;
3437 }
35- Func < double , double > function = text == "Top" ? Math . Cos : Math . Sin ;
36- return ( 1d + function ( Math . PI + Convert . ToInt32 ( values [ 1 ] , culture ) * ( Math . PI / 5d ) ) ) * Convert . ToDouble ( values [ 0 ] , culture ) * 2.5 ;
38+ Func < double , double > function = property == Canvas . TopProperty ? Math . Cos : Math . Sin ;
39+ return width * ( 1d + function ( Math . PI + LoadingIndicator . ParseName ( name , culture ) * Math . PI / 5d ) ) * 2.5 ;
3740 }
3841
3942 object [ ] IMultiValueConverter . ConvertBack ( object value , Type [ ] targetTypes , object parameter , CultureInfo culture ) => throw new NotImplementedException ( ) ;
4043 }
4144
4245 private sealed class CircleOpacityConverter : IValueConverter
4346 {
44- object IValueConverter . Convert ( object value , Type targetType , object parameter , CultureInfo culture )
45- {
46- return double . TryParse ( value . ToString ( ) , NumberStyles . Float , culture , out double index ) ? 1d - index / 10d : DependencyProperty . UnsetValue ;
47- }
47+ object IValueConverter . Convert ( object value , Type targetType , object parameter , CultureInfo culture ) => value is not string name
48+ ? DependencyProperty . UnsetValue
49+ : 1d - LoadingIndicator . ParseName ( name , culture ) / 10d ;
4850
4951 object IValueConverter . ConvertBack ( object value , Type targetType , object parameter , CultureInfo culture ) => throw new NotImplementedException ( ) ;
5052 }
5153
5254 private sealed class DivisionConverter : IValueConverter
5355 {
54- object IValueConverter . Convert ( object value , Type targetType , object parameter , CultureInfo culture )
55- {
56- return value is double number && parameter is IConvertible divisor
57- ? number / divisor . ToDouble ( culture )
58- : DependencyProperty . UnsetValue ;
59- }
56+ object IValueConverter . Convert ( object value , Type targetType , object parameter , CultureInfo culture ) => value is double number && parameter is double divisor
57+ ? number / divisor
58+ : DependencyProperty . UnsetValue ;
6059
6160 object IValueConverter . ConvertBack ( object value , Type targetType , object parameter , CultureInfo culture ) => throw new NotImplementedException ( ) ;
6261 }
6362}
63+
64+ public sealed class LoadingEllipseLocationExtension : MarkupExtension
65+ {
66+ private static readonly Binding _nameBinding = new ( )
67+ {
68+ Path = new ( FrameworkElement . NameProperty ) ,
69+ RelativeSource = RelativeSource . Self ,
70+ } ;
71+ private static readonly Binding _tagBinding = new ( )
72+ {
73+ Path = new ( Control . TagProperty ) ,
74+ RelativeSource = new ( ) { AncestorType = typeof ( Canvas ) }
75+ } ;
76+
77+ public override object ProvideValue ( IServiceProvider serviceProvider ) => new MultiBinding ( )
78+ {
79+ Converter = LoadingIndicator . LocationConverter ,
80+ ConverterParameter = ( ( IProvideValueTarget ) serviceProvider . GetService ( typeof ( IProvideValueTarget ) ) ! ) . TargetProperty ,
81+ Bindings =
82+ {
83+ LoadingEllipseLocationExtension . _tagBinding ,
84+ LoadingEllipseLocationExtension . _nameBinding ,
85+ }
86+ } ;
87+ }
0 commit comments