From 4cfae85f9c731b1fc5138498cff874f83c9b3cfe Mon Sep 17 00:00:00 2001 From: Mohammad Salameh Date: Sun, 3 Mar 2024 15:00:13 +0300 Subject: [PATCH] implemented light brightness slider optimised state emit to only emit when change is detected --- .../devices/bloc/lights/lights_cubit.dart | 23 +++++++ .../devices/bloc/lights/lights_state.dart | 16 +++++ lib/features/devices/model/light_model.dart | 6 +- .../view/widgets/lights/light_brightness.dart | 66 +++++++++++++++++++ .../view/widgets/lights/lights_list.dart | 3 + .../view/widgets/lights/lights_view.dart | 2 +- .../shared_widgets/default_container.dart | 5 +- 7 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 lib/features/devices/view/widgets/lights/light_brightness.dart diff --git a/lib/features/devices/bloc/lights/lights_cubit.dart b/lib/features/devices/bloc/lights/lights_cubit.dart index 0ce32e9..700b846 100644 --- a/lib/features/devices/bloc/lights/lights_cubit.dart +++ b/lib/features/devices/bloc/lights/lights_cubit.dart @@ -1,4 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/model/light_model.dart'; part 'lights_state.dart'; @@ -6,4 +7,26 @@ class LightsCubit extends Cubit { LightsCubit() : super(LightsInitial()); static LightsCubit get(context) => BlocProvider.of(context); + + int getBrightness(LightModel light) { + return light.brightness.toInt(); + } + + setBrightness(LightModel light, double value) { + value = (value / 5).ceil() * 5; + if (value != light.brightness) { + light.brightness = value; + emit(LightBrightnessChanged(value)); + } + } + + onHorizontalDragUpdate(LightModel light, double dx, double screenWidth) { + double newBrightness = (dx / (screenWidth - 15) * 100); + if (newBrightness > 100) { + newBrightness = 100; + } else if (newBrightness < 0) { + newBrightness = 0; + } + setBrightness(light, newBrightness); + } } diff --git a/lib/features/devices/bloc/lights/lights_state.dart b/lib/features/devices/bloc/lights/lights_state.dart index 96b8e90..f4a9ebe 100644 --- a/lib/features/devices/bloc/lights/lights_state.dart +++ b/lib/features/devices/bloc/lights/lights_state.dart @@ -3,3 +3,19 @@ part of 'lights_cubit.dart'; abstract class LightsState {} class LightsInitial extends LightsState {} + +class LightsLoading extends LightsState {} + +class LightsSuccess extends LightsState {} + +class LightsFailure extends LightsState { + final String message; + + LightsFailure(this.message); +} + +class LightBrightnessChanged extends LightsState { + final double brightness; + + LightBrightnessChanged(this.brightness); +} diff --git a/lib/features/devices/model/light_model.dart b/lib/features/devices/model/light_model.dart index 1d694d7..ef7f59f 100644 --- a/lib/features/devices/model/light_model.dart +++ b/lib/features/devices/model/light_model.dart @@ -1,10 +1,10 @@ import 'package:syncrow_app/features/devices/model/device_model.dart'; class LightModel extends DeviceModel { - final double brightness; - final int color; + late double brightness; + late int color; - final int lightingMode; + late int lightingMode; LightModel({ required this.brightness, diff --git a/lib/features/devices/view/widgets/lights/light_brightness.dart b/lib/features/devices/view/widgets/lights/light_brightness.dart new file mode 100644 index 0000000..7be2a50 --- /dev/null +++ b/lib/features/devices/view/widgets/lights/light_brightness.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/lights/lights_cubit.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/context_extension.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +import '../../../model/light_model.dart'; + +class LightBrightness extends StatelessWidget { + const LightBrightness({ + super.key, + required this.light, + }); + + final LightModel light; + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + return GestureDetector( + onHorizontalDragUpdate: (details) => LightsCubit.get(context) + .onHorizontalDragUpdate(light, details.localPosition.dx, + MediaQuery.of(context).size.width - 15), + child: Stack( + alignment: Alignment.center, + children: [ + const DefaultContainer( + height: 60, + child: SizedBox.expand(), + ), + AnimatedPositioned( + left: 0, + duration: const Duration(milliseconds: 50), + child: Container( + height: 60, + width: (MediaQuery.of(context).size.width - 30) * + light.brightness / + 100, + decoration: BoxDecoration( + color: ColorsManager.primaryColor.withOpacity(0.6), + borderRadius: light.brightness != 100 + ? const BorderRadius.only( + topLeft: Radius.circular(20), + bottomLeft: Radius.circular(20), + ) + : BorderRadius.circular(20), + ), + ), + ), + BodyLarge( + text: "${light.brightness}%", + style: context.bodyLarge.copyWith( + color: Colors.black, + fontSize: 23, + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/features/devices/view/widgets/lights/lights_list.dart b/lib/features/devices/view/widgets/lights/lights_list.dart index 5e0bafa..c2f1eee 100644 --- a/lib/features/devices/view/widgets/lights/lights_list.dart +++ b/lib/features/devices/view/widgets/lights/lights_list.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:syncrow_app/features/devices/view/widgets/lights/light_brightness.dart'; import '../../../../shared_widgets/devices_default_switch.dart'; import '../../../../shared_widgets/text_widgets/body_small.dart'; @@ -47,6 +48,8 @@ class LightsList extends StatelessWidget { ), const SizedBox(height: 5), DevicesDefaultSwitch(model: lights[index]), + const SizedBox(height: 10), + LightBrightness(light: lights[index]), ], ); }, diff --git a/lib/features/devices/view/widgets/lights/lights_view.dart b/lib/features/devices/view/widgets/lights/lights_view.dart index 8354efe..43566b3 100644 --- a/lib/features/devices/view/widgets/lights/lights_view.dart +++ b/lib/features/devices/view/widgets/lights/lights_view.dart @@ -53,7 +53,7 @@ class LightsView extends StatelessWidget { ), child: Padding( padding: const EdgeInsets.only( - top: 60, right: 15, left: 15, bottom: 80), + top: 70, right: 15, left: 15, bottom: 80), child: SizedBox.expand( child: SingleChildScrollView( child: Column( diff --git a/lib/features/shared_widgets/default_container.dart b/lib/features/shared_widgets/default_container.dart index a4f0047..48f5eeb 100644 --- a/lib/features/shared_widgets/default_container.dart +++ b/lib/features/shared_widgets/default_container.dart @@ -6,19 +6,22 @@ class DefaultContainer extends StatelessWidget { required this.child, this.height, this.width, + this.color, }); final double? height; final double? width; final Widget child; + final Color? color; + @override Widget build(BuildContext context) { return Container( height: height, width: width, decoration: BoxDecoration( - color: Colors.white, + color: color ?? Colors.white, borderRadius: BorderRadius.circular(20), ), padding: const EdgeInsets.all(10),