From 45fb637d48f5a7b023baaf9635612a19e65c664a Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Tue, 5 May 2020 12:12:49 +0000 Subject: [PATCH] Slider fixes. Also resolves #463 --- .../climate/widgets/climate_controls.dart | 37 +++++-------- .../cover/widgets/cover_controls.widget.dart | 12 ++--- .../widgets/media_player_seek_bar.widget.dart | 3 +- .../slider/widgets/slider_controls.dart | 2 +- lib/entities/universal_slider.widget.dart | 52 ++++++++++++------- 5 files changed, 51 insertions(+), 55 deletions(-) diff --git a/lib/entities/climate/widgets/climate_controls.dart b/lib/entities/climate/widgets/climate_controls.dart index f3610c8..6e9064b 100644 --- a/lib/entities/climate/widgets/climate_controls.dart +++ b/lib/entities/climate/widgets/climate_controls.dart @@ -191,7 +191,6 @@ class _ClimateControlWidgetState extends State { Widget build(BuildContext context) { final entityModel = EntityModel.of(context); final ClimateEntity entity = entityModel.entityWrapper.entity; - Logger.d("[Climate widget build] changed here = $_changedHere"); if (_changedHere) { //_showPending = (_tmpTemperature != entity.temperature || _tmpTargetHigh != entity.targetHigh || _tmpTargetLow != entity.targetLow); _changedHere = false; @@ -353,15 +352,19 @@ class _ClimateControlWidgetState extends State { } Widget _buildHumidityControls(ClimateEntity entity, BuildContext context) { - List result = []; if (entity.supportTargetHumidity) { - result.addAll([ - Text( - "$_tmpTargetHumidity%", - style: Theme.of(context).textTheme.display1, - ), - Expanded( - child: Slider( + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: Sizes.rowPadding), + child: Text("Target humidity", style: Theme.of(context).textTheme.body1), + ), + UniversalSlider( + leading: Text( + "$_tmpTargetHumidity%", + style: Theme.of(context).textTheme.display1, + ), value: _tmpTargetHumidity, max: entity.maxHumidity, min: entity.minHumidity, @@ -373,22 +376,6 @@ class _ClimateControlWidgetState extends State { }), onChangeEnd: (double v) => _setTargetHumidity(entity, v), ), - ) - ]); - } - if (result.isNotEmpty) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - 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( height: Sizes.rowPadding, ) diff --git a/lib/entities/cover/widgets/cover_controls.widget.dart b/lib/entities/cover/widgets/cover_controls.widget.dart index a043b06..c0814c3 100644 --- a/lib/entities/cover/widgets/cover_controls.widget.dart +++ b/lib/entities/cover/widgets/cover_controls.widget.dart @@ -62,11 +62,10 @@ class _CoverControlWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.fromLTRB( - 0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), + padding: EdgeInsets.only(top: Sizes.rowPadding), child: Text("Position"), ), - Slider( + UniversalSlider( value: _tmpPosition, min: 0.0, max: 100.0, @@ -78,8 +77,7 @@ class _CoverControlWidgetState extends State { }); }, onChangeEnd: (double value) => _setNewPosition(entity, value), - ), - Container(height: Sizes.rowPadding,) + ) ], ); } else { @@ -96,7 +94,7 @@ class _CoverControlWidgetState extends State { } if (entity.supportSetTiltPosition) { controls.addAll([ - Slider( + UniversalSlider( value: _tmpTiltPosition, min: 0.0, max: 100.0, @@ -115,7 +113,7 @@ class _CoverControlWidgetState extends State { if (controls.isNotEmpty) { controls.insert(0, Padding( padding: EdgeInsets.fromLTRB( - 0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), + 0.0, Sizes.rowPadding, 0.0, 0), child: Text("Tilt position"), )); return Column( diff --git a/lib/entities/media_player/widgets/media_player_seek_bar.widget.dart b/lib/entities/media_player/widgets/media_player_seek_bar.widget.dart index 195c4cf..9662e83 100644 --- a/lib/entities/media_player/widgets/media_player_seek_bar.widget.dart +++ b/lib/entities/media_player/widgets/media_player_seek_bar.widget.dart @@ -83,8 +83,7 @@ class _MediaPlayerSeekBarState extends State { Text("${Duration(seconds: entity.durationSeconds).toString().split(".")[0]}") ], ), - Container(height: 10,), - Slider( + UniversalSlider( min: 0, activeColor: Theme.of(context).accentColor, max: entity.durationSeconds.toDouble(), diff --git a/lib/entities/slider/widgets/slider_controls.dart b/lib/entities/slider/widgets/slider_controls.dart index 9a82094..dc282e0 100644 --- a/lib/entities/slider/widgets/slider_controls.dart +++ b/lib/entities/slider/widgets/slider_controls.dart @@ -40,7 +40,7 @@ class _SliderControlsWidgetState extends State { } else { _changedHere = false; } - Widget slider = Slider( + Widget slider = UniversalSlider( min: entity.minValue * _multiplier, max: entity.maxValue * _multiplier, value: (_newValue <= entity.maxValue) && diff --git a/lib/entities/universal_slider.widget.dart b/lib/entities/universal_slider.widget.dart index e2ef081..c66066c 100644 --- a/lib/entities/universal_slider.widget.dart +++ b/lib/entities/universal_slider.widget.dart @@ -2,17 +2,20 @@ part of '../main.dart'; class UniversalSlider extends StatefulWidget { - final onChanged; - final onChangeEnd; + final Function onChanged; + final Function onChangeEnd; + final Function onChangeStart; final Widget leading; final Widget closing; final String title; final double min; + final Color activeColor; final double max; final double value; + final int divisions; 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 State createState() { @@ -35,6 +38,7 @@ class UniversalSliderState extends State { @override Widget build(BuildContext context) { List row = []; + List col = []; if (widget.leading != null) { row.add(widget.leading); } @@ -44,23 +48,26 @@ class UniversalSliderState extends State { value: _value ?? math.max(widget.max ?? 100, _value ?? 0), min: widget.min ?? 0, max: widget.max ?? 100, - onChangeStart: (_) { - _changeStarted = true; + activeColor: widget.activeColor, + onChangeStart: (value) { + _changeStarted = true; + widget.onChangeStart?.call(value); }, + divisions: widget.divisions, onChanged: (value) { setState(() { _value = value; }); - widget.onChanged(value); + widget.onChanged?.call(value); }, onChangeEnd: (value) { _changeStarted = false; + setState(() { + _value = value; + }); Timer(Duration(milliseconds: 500), () { if (!_changeStarted) { - setState(() { - _value = value; - }); - widget.onChangeEnd(value); + widget.onChangeEnd?.call(value); } }); } @@ -70,20 +77,25 @@ class UniversalSliderState extends State { if (widget.closing != null) { row.add(widget.closing); } + if (widget.title != null) { + col.addAll([ + Container(height: Sizes.rowPadding,), + Text('${widget.title}'), + ]); + } + col.addAll([ + Container(height: Sizes.rowPadding,), + Row( + mainAxisSize: MainAxisSize.min, + children: row, + ), + Container(height: Sizes.rowPadding,) + ]); return Padding( padding: widget.padding, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container(height: Sizes.rowPadding,), - Text('${widget.title}'), - Container(height: Sizes.rowPadding,), - Row( - mainAxisSize: MainAxisSize.min, - children: row, - ), - Container(height: Sizes.rowPadding,) - ], + children: col, ), ); }