Slider fixes. Also resolves #463

This commit is contained in:
Yegor Vialov 2020-05-05 12:12:49 +00:00
parent 7c473eb1ca
commit 45fb637d48
5 changed files with 51 additions and 55 deletions

View File

@ -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,
"$_tmpTargetHumidity%", children: <Widget>[
style: Theme.of(context).textTheme.display1, Padding(
), padding: EdgeInsets.only(top: Sizes.rowPadding),
Expanded( child: Text("Target humidity", style: Theme.of(context).textTheme.body1),
child: Slider( ),
UniversalSlider(
leading: Text(
"$_tmpTargetHumidity%",
style: Theme.of(context).textTheme.display1,
),
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,
) )

View File

@ -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(

View File

@ -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(),

View File

@ -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) &&

View File

@ -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;
setState(() {
_value = value;
});
Timer(Duration(milliseconds: 500), () { Timer(Duration(milliseconds: 500), () {
if (!_changeStarted) { if (!_changeStarted) {
setState(() { widget.onChangeEnd?.call(value);
_value = value;
});
widget.onChangeEnd(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);
} }
if (widget.title != null) {
col.addAll(<Widget>[
Container(height: Sizes.rowPadding,),
Text('${widget.title}'),
]);
}
col.addAll(<Widget>[
Container(height: Sizes.rowPadding,),
Row(
mainAxisSize: MainAxisSize.min,
children: row,
),
Container(height: Sizes.rowPadding,)
]);
return Padding( return Padding(
padding: widget.padding, padding: widget.padding,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: col,
Container(height: Sizes.rowPadding,),
Text('${widget.title}'),
Container(height: Sizes.rowPadding,),
Row(
mainAxisSize: MainAxisSize.min,
children: row,
),
Container(height: Sizes.rowPadding,)
],
), ),
); );
} }