Slider fixes. Also resolves #463
This commit is contained in:
parent
7c473eb1ca
commit
45fb637d48
@ -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,
|
||||||
)
|
)
|
||||||
|
@ -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;
|
||||||
|
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,)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user