part of '../../main.dart'; class LightControlsWidget extends StatefulWidget { @override _LightControlsWidgetState createState() => _LightControlsWidgetState(); } class _LightControlsWidgetState extends State { int _tmpBrightness; int _tmpColorTemp = 0; Color _tmpColor = Colors.white; bool _changedHere = false; String _tmpEffect; void _resetState(LightEntity entity) { _tmpBrightness = entity.brightness ?? 0; _tmpColorTemp = entity.colorTemp ?? entity.minMireds?.toInt(); _tmpColor = entity.color ?? _tmpColor; _tmpEffect = entity.effect; } void _setBrightness(LightEntity entity, double value) { setState(() { _tmpBrightness = value.round(); _changedHere = true; if (_tmpBrightness > 0) { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_on", entity.entityId, {"brightness": _tmpBrightness})); } else { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_off", entity.entityId, null)); } }); } void _setColorTemp(LightEntity entity, double value) { setState(() { _tmpColorTemp = value.round(); _changedHere = true; eventBus.fire(new ServiceCallEvent( entity.domain, "turn_on", entity.entityId, {"color_temp": _tmpColorTemp})); }); } void _setColor(LightEntity entity, Color color) { setState(() { _tmpColor = color; _changedHere = true; Logger.d( "Color: [${color.red}, ${color.green}, ${color.blue}]"); if ((color == Colors.black) || ((color.red == color.green) && (color.green == color.blue))) { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_off", entity.entityId, null)); } else { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_on", entity.entityId, {"rgb_color": [color.red, color.green, color.blue]})); } }); } void _setEffect(LightEntity entity, String value) { setState(() { _tmpEffect = value; _changedHere = true; if (_tmpEffect != null) { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_on", entity.entityId, {"effect": "$value"})); } }); } @override Widget build(BuildContext context) { final entityModel = EntityModel.of(context); final LightEntity entity = entityModel.entityWrapper.entity; if (!_changedHere) { _resetState(entity); } else { _changedHere = false; } return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ _buildBrightnessControl(entity), _buildColorTempControl(entity), _buildColorControl(entity), _buildEffectControl(entity) ], ); } Widget _buildBrightnessControl(LightEntity entity) { if ((entity.supportBrightness) && (_tmpBrightness != null) && (entity.state != EntityState.unavailable)) { return UniversalSlider( onChanged: (value) { setState(() { _changedHere = true; _tmpBrightness = value.round(); }); }, min: 0.0, max: 255.0, onChangeEnd: (value) => _setBrightness(entity, value), value: _tmpBrightness.toDouble(), leading: Icon(Icons.brightness_5), title: "Brightness", ); } else { return Container(width: 0.0, height: 0.0); } } Widget _buildColorTempControl(LightEntity entity) { if (entity.supportColorTemp) { return UniversalSlider( title: "Color temperature", leading: Text("Cold", style: TextStyle(color: Colors.lightBlue),), value: _tmpColorTemp.toDouble(), onChangeEnd: (value) => _setColorTemp(entity, value), max: entity.maxMireds, min: entity.minMireds, onChanged: (value) { setState(() { _changedHere = true; _tmpColorTemp = value.round(); }); }, closing: Text("Warm", style: TextStyle(color: Colors.amberAccent),), ); } else { return Container(width: 0.0, height: 0.0); } } Widget _buildColorControl(LightEntity entity) { if (entity.supportColor) { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container(height: Sizes.rowPadding,), RaisedButton( onPressed: () => _showColorPicker(entity), color: _tmpColor ?? Colors.black45, child: Text( "COLOR", textAlign: TextAlign.center, style: TextStyle( fontSize: 50.0, fontWeight: FontWeight.bold, color: Colors.black12, ), ), ), Container(height: 2*Sizes.rowPadding,), ], ); } else { return Container(width: 0.0, height: 0.0); } } void _showColorPicker(LightEntity entity) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( titlePadding: EdgeInsets.all(0.0), contentPadding: EdgeInsets.all(0.0), content: SingleChildScrollView( child: MaterialPicker( pickerColor: _tmpColor, onColorChanged: (color) { _setColor(entity, color); Navigator.of(context).pop(); }, enableLabel: true, ), ), ); }, ); } Widget _buildEffectControl(LightEntity entity) { if ((entity.supportEffect) && (entity.effectList != null)) { return ModeSelectorWidget( onChange: (effect) => _setEffect(entity, effect), caption: "Effect", options: entity.effectList, value: _tmpEffect ); } else { return Container(width: 0.0, height: 0.0); } } }