1+ using Microsoft . AspNetCore . Components ;
2+
3+ namespace Wacton . Unicolour . Example . Web ;
4+
5+ public partial class LightSpaces : ComponentBase
6+ {
7+ private ColourSpace colourSpace = ColourSpace . Rgb255 ;
8+ private readonly Slider [ ] sliders = [ new ( 0 ) , new ( 1 ) , new ( 2 ) ] ;
9+
10+ private static ColourSpace [ ] ColourSpaceOptions = ColourLookup . RangeLookup . Keys . OrderBy ( x => x . ToString ( ) ) . ToArray ( ) ;
11+
12+ protected override void OnInitialized ( )
13+ {
14+ SetAllSliders ( ) ;
15+
16+ State . OnChange += ( ) =>
17+ {
18+ SetAllSliders ( ) ;
19+ StateHasChanged ( ) ;
20+ } ;
21+ }
22+
23+ private void SetAllSliders ( )
24+ {
25+ var ( first , second , third ) = State . Colour . GetRepresentation ( colourSpace ) ;
26+ sliders [ 0 ] . Value = first ;
27+ sliders [ 1 ] . Value = second ;
28+ sliders [ 2 ] . Value = third ;
29+ UpdateSliders ( ) ;
30+ }
31+
32+ private void SetColourSpace ( ChangeEventArgs args )
33+ {
34+ var colourSpaceName = ( args . Value == null ? string . Empty : args . Value . ToString ( ) ) ?? string . Empty ;
35+ _ = Enum . TryParse ( colourSpaceName , out colourSpace ) ;
36+
37+ SetAllSliders ( ) ;
38+ SetColour ( ) ;
39+ }
40+
41+ private static double ParseValue ( ChangeEventArgs args ) => double . Parse ( ( args . Value == null ? string . Empty : args . Value . ToString ( ) ) ?? string . Empty ) ;
42+ private void SetSliderValue ( Slider slider , ChangeEventArgs args ) => SetSliderValue ( slider , ParseValue ( args ) ) ;
43+ private void SetSliderValue ( Slider slider , double value )
44+ {
45+ slider . Value = value ;
46+ UpdateSliders ( ) ;
47+ SetColour ( ) ;
48+ }
49+
50+ private void UpdateSliders ( )
51+ {
52+ for ( var i = 0 ; i < sliders . Length ; i ++ )
53+ {
54+ sliders [ i ] . ColourSpace = colourSpace ;
55+ var startColour = new Unicolour ( colourSpace , GetStartValue ( 0 ) , GetStartValue ( 1 ) , GetStartValue ( 2 ) ) ;
56+ var endColour = new Unicolour ( colourSpace , GetEndValue ( 0 ) , GetEndValue ( 1 ) , GetEndValue ( 2 ) ) ;
57+
58+ sliders [ i ] . Stops = GetColourStops ( startColour , endColour ) ;
59+ continue ;
60+
61+ double GetStartValue ( int index ) => index == i ? sliders [ index ] . Min : sliders [ index ] . Value ;
62+ double GetEndValue ( int index ) => index == i ? sliders [ index ] . Max : sliders [ index ] . Value ;
63+ }
64+ }
65+
66+ private List < Unicolour > GetColourStops ( Unicolour start , Unicolour end )
67+ {
68+ var sections = colourSpace is ColourSpace . Hct or ColourSpace . Munsell ? 8 : 16 ;
69+ var stops = new List < Unicolour > { start } ;
70+ for ( var i = 1 ; i < sections ; i ++ )
71+ {
72+ var distance = 1.0 / sections * i ;
73+ stops . Add ( start . Mix ( end , colourSpace , distance , HueSpan . Increasing ) ) ;
74+ }
75+
76+ stops . Add ( end ) ;
77+ return stops ;
78+ }
79+
80+ private void SetColour ( )
81+ {
82+ State . Colour = new Unicolour ( colourSpace , sliders [ 0 ] . Value , sliders [ 1 ] . Value , sliders [ 2 ] . Value ) ;
83+ }
84+ }
0 commit comments