@@ -75,12 +75,16 @@ protected double GetDoubleAttribute(string name)
7575
7676 protected double ParseDouble ( string value )
7777 {
78- return double . Parse ( value ? . Replace ( "," , "." ) ?? "0" , NumberStyles . Any , CultureInfo . InvariantCulture ) ;
78+ return value ? . Length == 0
79+ ? 0
80+ : double . Parse ( value ? . Replace ( "," , "." ) ?? "0" , NumberStyles . Any , CultureInfo . InvariantCulture ) ;
7981 }
8082
8183 protected int ParseInt ( string value )
8284 {
83- return int . Parse ( value ? . Replace ( "," , "." ) ?? "0" , NumberStyles . Any , CultureInfo . InvariantCulture ) ;
85+ return value ? . Length == 0
86+ ? 0
87+ : int . Parse ( value ? . Replace ( "," , "." ) ?? "0" , NumberStyles . Any , CultureInfo . InvariantCulture ) ;
8488 }
8589
8690 protected List < string > GetListAttribute ( string name )
@@ -90,6 +94,12 @@ protected List<string> GetListAttribute(string name)
9094 : new List < string > ( ) ;
9195 }
9296
97+ protected string GetListAttribute ( string name , int index )
98+ {
99+ var attribute = GetListAttribute ( name ) ;
100+ return attribute . Count > index ? attribute [ index ] : "" ;
101+ }
102+
93103 protected virtual List < string > OffStates ( )
94104 {
95105 return new List < string > ( ) ;
@@ -154,31 +164,50 @@ protected MenuItem CreateMenuItem(Dispatcher dispatcher, string service, string
154164 }
155165
156166 protected Slider CreateSlider ( Dispatcher dispatcher , double min , double max , double value , string service ,
157- string toolTip , string attribute , double step = 1 )
167+ string toolTip , string attribute , double step = 1 , Action < Slider , double > changer = null ,
168+ Func < double , object > converter = null )
158169 {
159170 var slider = new Slider
160171 {
161172 Minimum = min , Maximum = max , MinWidth = 100 , ToolTip = toolTip , Value = value ,
162173 IsSnapToTickEnabled = true ,
163- TickFrequency = step
174+ TickFrequency = step ,
175+ IsMoveToPointEnabled = true
164176 } ;
165177 slider . PreviewMouseUp += ( sender , args ) =>
166178 {
167- HaClientContext . CallService ( dispatcher , this , service ,
168- Tuple . Create < string , object > ( attribute , step == 1 ? ( int ) slider . Value : slider . Value ) ) ;
179+ if ( converter == null )
180+ {
181+ HaClientContext . CallService ( dispatcher , this , service ,
182+ Tuple . Create < string , object > ( attribute , step == 1 ? ( int ) slider . Value : slider . Value ) ) ;
183+ }
184+ else
185+ {
186+ HaClientContext . CallService ( dispatcher , this , service ,
187+ Tuple . Create ( attribute , converter . Invoke ( slider . Value ) ) ) ;
188+ }
169189 } ;
190+
191+ if ( changer != null )
192+ {
193+ slider . ValueChanged += ( sender , args ) => changer . Invoke ( slider , args . NewValue ) ;
194+ changer . Invoke ( slider , value ) ;
195+ }
196+
170197 return slider ;
171198 }
172199
173200 protected void AddSliderIfSupported ( Dispatcher dispatcher , ItemsControl root , int supportedFeature , double min ,
174- double max , double value , string attribute , double step = 1 )
201+ double max , double value , string attribute , double step = 1 , Action < Slider , double > changer = null ,
202+ Func < double , object > converter = null )
175203 {
176204 var supportedFeatures = GetSupportedFeatures ( ) ;
177205 var featureToServiceMap = FeatureToServiceMap ( ) ;
178206 if ( supportedFeatures . Contains ( supportedFeature ) && featureToServiceMap . ContainsKey ( supportedFeature ) )
179207 {
180208 var ( service , header ) = featureToServiceMap [ supportedFeature ] ;
181- root . Items . Add ( CreateSlider ( dispatcher , min , max , value , service , header , attribute , step ) ) ;
209+ root . Items . Add ( CreateSlider ( dispatcher , min , max , value , service , header , attribute , step , changer ,
210+ converter ) ) ;
182211 }
183212 }
184213
0 commit comments