Slider fixes. Also resolves #463
This commit is contained in:
		| @@ -191,7 +191,6 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     final entityModel = EntityModel.of(context); |     final entityModel = EntityModel.of(context); | ||||||
|     final ClimateEntity entity = entityModel.entityWrapper.entity; |     final ClimateEntity entity = entityModel.entityWrapper.entity; | ||||||
|     Logger.d("[Climate widget build] changed here = $_changedHere"); |  | ||||||
|     if (_changedHere) { |     if (_changedHere) { | ||||||
|       //_showPending = (_tmpTemperature != entity.temperature || _tmpTargetHigh != entity.targetHigh || _tmpTargetLow != entity.targetLow); |       //_showPending = (_tmpTemperature != entity.temperature || _tmpTargetHigh != entity.targetHigh || _tmpTargetLow != entity.targetLow); | ||||||
|       _changedHere = false; |       _changedHere = false; | ||||||
| @@ -353,15 +352,19 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   Widget _buildHumidityControls(ClimateEntity entity, BuildContext context) { |   Widget _buildHumidityControls(ClimateEntity entity, BuildContext context) { | ||||||
|     List<Widget> result = []; |  | ||||||
|     if (entity.supportTargetHumidity) { |     if (entity.supportTargetHumidity) { | ||||||
|       result.addAll(<Widget>[ |       return Column( | ||||||
|         Text( |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: <Widget>[ | ||||||
|  |           Padding( | ||||||
|  |             padding: EdgeInsets.only(top: Sizes.rowPadding), | ||||||
|  |             child: Text("Target humidity", style: Theme.of(context).textTheme.body1), | ||||||
|  |           ), | ||||||
|  |           UniversalSlider( | ||||||
|  |             leading: Text( | ||||||
|               "$_tmpTargetHumidity%", |               "$_tmpTargetHumidity%", | ||||||
|               style: Theme.of(context).textTheme.display1, |               style: Theme.of(context).textTheme.display1, | ||||||
|             ), |             ), | ||||||
|         Expanded( |  | ||||||
|           child: Slider( |  | ||||||
|             value: _tmpTargetHumidity, |             value: _tmpTargetHumidity, | ||||||
|             max: entity.maxHumidity, |             max: entity.maxHumidity, | ||||||
|             min: entity.minHumidity, |             min: entity.minHumidity, | ||||||
| @@ -373,22 +376,6 @@ class _ClimateControlWidgetState extends State<ClimateControlWidget> { | |||||||
|             }), |             }), | ||||||
|             onChangeEnd: (double v) => _setTargetHumidity(entity, v), |             onChangeEnd: (double v) => _setTargetHumidity(entity, v), | ||||||
|           ), |           ), | ||||||
|         ) |  | ||||||
|       ]); |  | ||||||
|     } |  | ||||||
|     if (result.isNotEmpty) { |  | ||||||
|       return Column( |  | ||||||
|         crossAxisAlignment: CrossAxisAlignment.start, |  | ||||||
|         children: <Widget>[ |  | ||||||
|           Padding( |  | ||||||
|             padding: EdgeInsets.fromLTRB( |  | ||||||
|                 0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), |  | ||||||
|             child: Text("Target humidity", style: Theme.of(context).textTheme.body1), |  | ||||||
|           ), |  | ||||||
|           Row( |  | ||||||
|             crossAxisAlignment: CrossAxisAlignment.center, |  | ||||||
|             children: result, |  | ||||||
|           ), |  | ||||||
|           Container( |           Container( | ||||||
|             height: Sizes.rowPadding, |             height: Sizes.rowPadding, | ||||||
|           ) |           ) | ||||||
|   | |||||||
| @@ -62,11 +62,10 @@ class _CoverControlWidgetState extends State<CoverControlWidget> { | |||||||
|         crossAxisAlignment: CrossAxisAlignment.start, |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|         children: <Widget>[ |         children: <Widget>[ | ||||||
|           Padding( |           Padding( | ||||||
|             padding: EdgeInsets.fromLTRB( |             padding: EdgeInsets.only(top: Sizes.rowPadding), | ||||||
|                 0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), |  | ||||||
|             child: Text("Position"), |             child: Text("Position"), | ||||||
|           ), |           ), | ||||||
|           Slider( |           UniversalSlider( | ||||||
|             value: _tmpPosition, |             value: _tmpPosition, | ||||||
|             min: 0.0, |             min: 0.0, | ||||||
|             max: 100.0, |             max: 100.0, | ||||||
| @@ -78,8 +77,7 @@ class _CoverControlWidgetState extends State<CoverControlWidget> { | |||||||
|               }); |               }); | ||||||
|             }, |             }, | ||||||
|             onChangeEnd: (double value) => _setNewPosition(entity, value), |             onChangeEnd: (double value) => _setNewPosition(entity, value), | ||||||
|           ), |           ) | ||||||
|           Container(height: Sizes.rowPadding,) |  | ||||||
|         ], |         ], | ||||||
|       ); |       ); | ||||||
|     } else { |     } else { | ||||||
| @@ -96,7 +94,7 @@ class _CoverControlWidgetState extends State<CoverControlWidget> { | |||||||
|     } |     } | ||||||
|     if (entity.supportSetTiltPosition) { |     if (entity.supportSetTiltPosition) { | ||||||
|       controls.addAll(<Widget>[ |       controls.addAll(<Widget>[ | ||||||
|         Slider( |         UniversalSlider( | ||||||
|           value: _tmpTiltPosition, |           value: _tmpTiltPosition, | ||||||
|           min: 0.0, |           min: 0.0, | ||||||
|           max: 100.0, |           max: 100.0, | ||||||
| @@ -115,7 +113,7 @@ class _CoverControlWidgetState extends State<CoverControlWidget> { | |||||||
|     if (controls.isNotEmpty) { |     if (controls.isNotEmpty) { | ||||||
|       controls.insert(0, Padding( |       controls.insert(0, Padding( | ||||||
|         padding: EdgeInsets.fromLTRB( |         padding: EdgeInsets.fromLTRB( | ||||||
|             0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), |             0.0, Sizes.rowPadding, 0.0, 0), | ||||||
|         child: Text("Tilt position"), |         child: Text("Tilt position"), | ||||||
|       )); |       )); | ||||||
|       return Column( |       return Column( | ||||||
|   | |||||||
| @@ -83,8 +83,7 @@ class _MediaPlayerSeekBarState extends State<MediaPlayerSeekBar> { | |||||||
|                 Text("${Duration(seconds: entity.durationSeconds).toString().split(".")[0]}") |                 Text("${Duration(seconds: entity.durationSeconds).toString().split(".")[0]}") | ||||||
|               ], |               ], | ||||||
|             ), |             ), | ||||||
|             Container(height: 10,), |             UniversalSlider( | ||||||
|             Slider( |  | ||||||
|               min: 0, |               min: 0, | ||||||
|               activeColor: Theme.of(context).accentColor, |               activeColor: Theme.of(context).accentColor, | ||||||
|               max: entity.durationSeconds.toDouble(), |               max: entity.durationSeconds.toDouble(), | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ class _SliderControlsWidgetState extends State<SliderControlsWidget> { | |||||||
|     } else { |     } else { | ||||||
|       _changedHere = false; |       _changedHere = false; | ||||||
|     } |     } | ||||||
|     Widget slider = Slider( |     Widget slider = UniversalSlider( | ||||||
|       min: entity.minValue * _multiplier, |       min: entity.minValue * _multiplier, | ||||||
|       max: entity.maxValue * _multiplier, |       max: entity.maxValue * _multiplier, | ||||||
|       value: (_newValue <= entity.maxValue) && |       value: (_newValue <= entity.maxValue) && | ||||||
|   | |||||||
| @@ -2,17 +2,20 @@ part of '../main.dart'; | |||||||
|  |  | ||||||
| class UniversalSlider extends StatefulWidget { | class UniversalSlider extends StatefulWidget { | ||||||
|  |  | ||||||
|   final onChanged; |   final Function onChanged; | ||||||
|   final onChangeEnd; |   final Function onChangeEnd; | ||||||
|  |   final Function onChangeStart; | ||||||
|   final Widget leading; |   final Widget leading; | ||||||
|   final Widget closing; |   final Widget closing; | ||||||
|   final String title; |   final String title; | ||||||
|   final double min; |   final double min; | ||||||
|  |   final Color activeColor; | ||||||
|   final double max; |   final double max; | ||||||
|   final double value; |   final double value; | ||||||
|  |   final int divisions; | ||||||
|   final EdgeInsets padding; |   final EdgeInsets padding; | ||||||
|  |  | ||||||
|   const UniversalSlider({Key key, this.onChanged, this.onChangeEnd, this.leading, this.closing, this.title, this.min, this.max, this.value, this.padding: const EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, 0.0)}) : super(key: key); |   const UniversalSlider({Key key, this.onChanged, this.onChangeStart, this.activeColor, this.divisions, this.onChangeEnd, this.leading, this.closing, this.title, this.min, this.max, this.value, this.padding: const EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, 0.0)}) : super(key: key); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   State<StatefulWidget> createState() { |   State<StatefulWidget> createState() { | ||||||
| @@ -35,6 +38,7 @@ class UniversalSliderState extends State<UniversalSlider> { | |||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     List <Widget> row = []; |     List <Widget> row = []; | ||||||
|  |     List <Widget> col = []; | ||||||
|     if (widget.leading != null) { |     if (widget.leading != null) { | ||||||
|       row.add(widget.leading); |       row.add(widget.leading); | ||||||
|     } |     } | ||||||
| @@ -44,23 +48,26 @@ class UniversalSliderState extends State<UniversalSlider> { | |||||||
|           value: _value ?? math.max(widget.max ?? 100, _value ?? 0), |           value: _value ?? math.max(widget.max ?? 100, _value ?? 0), | ||||||
|           min: widget.min ?? 0, |           min: widget.min ?? 0, | ||||||
|           max: widget.max ?? 100, |           max: widget.max ?? 100, | ||||||
|           onChangeStart: (_) { |           activeColor: widget.activeColor, | ||||||
|  |           onChangeStart: (value) { | ||||||
|             _changeStarted = true; |             _changeStarted = true; | ||||||
|  |             widget.onChangeStart?.call(value);  | ||||||
|           }, |           }, | ||||||
|  |           divisions: widget.divisions, | ||||||
|           onChanged: (value) { |           onChanged: (value) { | ||||||
|             setState(() { |             setState(() { | ||||||
|               _value = value; |               _value = value; | ||||||
|             }); |             }); | ||||||
|             widget.onChanged(value); |             widget.onChanged?.call(value); | ||||||
|           }, |           }, | ||||||
|           onChangeEnd: (value) { |           onChangeEnd: (value) { | ||||||
|             _changeStarted = false; |             _changeStarted = false; | ||||||
|             Timer(Duration(milliseconds: 500), () { |  | ||||||
|               if (!_changeStarted) { |  | ||||||
|             setState(() { |             setState(() { | ||||||
|               _value = value; |               _value = value; | ||||||
|             }); |             }); | ||||||
|                 widget.onChangeEnd(value); |             Timer(Duration(milliseconds: 500), () { | ||||||
|  |               if (!_changeStarted) { | ||||||
|  |                 widget.onChangeEnd?.call(value); | ||||||
|               } |               } | ||||||
|             }); |             }); | ||||||
|           } |           } | ||||||
| @@ -70,20 +77,25 @@ class UniversalSliderState extends State<UniversalSlider> { | |||||||
|     if (widget.closing != null) { |     if (widget.closing != null) { | ||||||
|       row.add(widget.closing); |       row.add(widget.closing); | ||||||
|     } |     } | ||||||
|     return Padding( |     if (widget.title != null) { | ||||||
|       padding: widget.padding, |       col.addAll(<Widget>[ | ||||||
|       child: Column( |  | ||||||
|         crossAxisAlignment: CrossAxisAlignment.start, |  | ||||||
|         children: <Widget>[ |  | ||||||
|         Container(height: Sizes.rowPadding,), |         Container(height: Sizes.rowPadding,), | ||||||
|         Text('${widget.title}'), |         Text('${widget.title}'), | ||||||
|  |       ]); | ||||||
|  |     } | ||||||
|  |     col.addAll(<Widget>[ | ||||||
|       Container(height: Sizes.rowPadding,), |       Container(height: Sizes.rowPadding,), | ||||||
|       Row( |       Row( | ||||||
|         mainAxisSize: MainAxisSize.min, |         mainAxisSize: MainAxisSize.min, | ||||||
|         children: row, |         children: row, | ||||||
|       ), |       ), | ||||||
|       Container(height: Sizes.rowPadding,) |       Container(height: Sizes.rowPadding,) | ||||||
|         ], |     ]); | ||||||
|  |     return Padding( | ||||||
|  |       padding: widget.padding, | ||||||
|  |       child: Column( | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: col, | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user