From cf103d5a7c1e67912688afab5f2f81906a600deb Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Thu, 10 Apr 2025 15:15:20 +0300 Subject: [PATCH] Add CpsDialogSliderSelector for enhanced slider functionality and integrate with CeilingSensorDialog --- .../ceiling_sensor/ceiling_sensor_dialog.dart | 31 ++++-- .../cps_dialog_slider_selector.dart | 105 ++++++++++++++++++ .../widgets/slider_value_selector.dart | 16 +-- 3 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_slider_selector.dart diff --git a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart index 50756c69..7b51d064 100644 --- a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart +++ b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart @@ -7,6 +7,8 @@ import 'package:syncrow_web/pages/routines/models/ceiling_presence_sensor_functi import 'package:syncrow_web/pages/routines/models/device_functions.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; +import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart'; +import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_slider_selector.dart'; import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_value_selector.dart'; import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_functions_list.dart'; @@ -122,21 +124,32 @@ class _CeilingSensorDialogState extends State { ), ); final operations = selectedCpsFunctions.getOperationalValues(); - + final isToggleFunction = + CeilingSensorHelper.toggleCodes.contains(selectedFunction); return Row( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ CpsFunctionsList(cpsFunctions: _cpsFunctions), if (state.selectedFunction != null) Expanded( - child: CpsDialogValueSelector( - operations: operations, - selectedFunction: selectedFunction ?? '', - selectedFunctionData: selectedFunctionData, - cpsFunctions: _cpsFunctions, - operationName: selectedOperationName ?? '', - device: widget.device, - ), + child: isToggleFunction + ? CpsDialogValueSelector( + operations: operations, + selectedFunction: selectedFunction ?? '', + selectedFunctionData: selectedFunctionData, + cpsFunctions: _cpsFunctions, + operationName: selectedOperationName ?? '', + device: widget.device, + ) + : CpsDialogSliderSelector( + operations: operations, + selectedFunction: selectedFunction ?? '', + selectedFunctionData: selectedFunctionData, + cpsFunctions: _cpsFunctions, + operationName: selectedOperationName ?? '', + device: widget.device, + dialogType: widget.dialogType, + ), ), ], ); diff --git a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_slider_selector.dart b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_slider_selector.dart new file mode 100644 index 00000000..d826afb5 --- /dev/null +++ b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/cps_dialog_slider_selector.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; +import 'package:syncrow_web/pages/routines/bloc/functions_bloc/functions_bloc_bloc.dart'; +import 'package:syncrow_web/pages/routines/models/ceiling_presence_sensor_functions.dart'; +import 'package:syncrow_web/pages/routines/models/device_functions.dart'; +import 'package:syncrow_web/pages/routines/widgets/slider_value_selector.dart'; + +class CpsDialogSliderSelector extends StatelessWidget { + const CpsDialogSliderSelector({ + required this.operations, + required this.selectedFunction, + required this.selectedFunctionData, + required this.cpsFunctions, + required this.device, + required this.operationName, + required this.dialogType, + super.key, + }); + + final List operations; + final String selectedFunction; + final DeviceFunctionData selectedFunctionData; + final List cpsFunctions; + final AllDevicesModel? device; + final String operationName; + final String dialogType; + + @override + Widget build(BuildContext context) { + return SliderValueSelector( + selectedFunction: selectedFunction, + functionData: selectedFunctionData, + device: device, + dialogType: dialogType, + sliderRange: _sliderRange, + displayedValue: _displayText, + initialValue: selectedFunctionData.value ?? 0, + onConditionChanged: (condition) => context.read().add( + AddFunction( + functionData: DeviceFunctionData( + entityId: device?.uuid ?? '', + functionCode: selectedFunction, + operationName: selectedFunctionData.operationName, + condition: condition, + value: selectedFunctionData.value, + ), + ), + ), + onSliderChanged: (value) => context.read().add( + AddFunction( + functionData: DeviceFunctionData( + entityId: device?.uuid ?? '', + functionCode: selectedFunction, + operationName: selectedFunctionData.operationName, + value: value.toInt(), + condition: selectedFunctionData.condition, + ), + ), + ), + ); + } + + double get sliderStepper { + return 1; + } + + (double, double) get _sliderRange => switch (selectedFunctionData.functionCode) { + 'moving_speed' => (0, 32), + 'space_static_val' => (0, 255), + 'space_move_val' => (0, 255), + 'moving_max_dis' => (0, 10), + 'static_max_dis' => (0, 10), + 'moving_range' => (0, 25.5), + 'presence_range' => (0, 25.5), + 'presence_judgement_threshold' => (0, 255), + 'motion_amplitude_trigger_threshold' => (0, 255), + 'perceptual_boundary' => (0, 5), + 'moving_boundary' => (0, 5), + 'moving_rigger_time' => (0, 2), + 'moving_static_time' => (0, 50), + 'none_body_time' => (0, 300), + _ => (0, 300), + }; + + String get _displayText { + final value = selectedFunctionData.value; + final parsedValue = double.tryParse('$value') ?? value; + + return switch (selectedFunctionData.functionCode) { + 'moving_max_dis' || + 'static_max_dis' || + 'moving_range' || + 'presence_range' || + 'perceptual_boundary' || + 'moving_boundary' => + '${parsedValue?.toStringAsFixed(1) ?? '0'} M', + 'moving_rigger_time' => '${parsedValue?.toStringAsFixed(3) ?? '0'} s', + 'moving_static_time' || + 'none_body_time' => + '${parsedValue?.toStringAsFixed(0) ?? '0'} s', + _ => '${parsedValue ?? 0}', + }; + } +} diff --git a/lib/pages/routines/widgets/slider_value_selector.dart b/lib/pages/routines/widgets/slider_value_selector.dart index 6b408008..82c59533 100644 --- a/lib/pages/routines/widgets/slider_value_selector.dart +++ b/lib/pages/routines/widgets/slider_value_selector.dart @@ -46,20 +46,8 @@ class SliderValueSelector extends StatelessWidget { const SizedBox(height: 20), FunctionSlider( initialValue: initialValue, - range: sliderRange, onChanged: onSliderChanged, - // void _updateValue(BuildContext context, int value) { - // context.read().add( - // AddFunction( - // functionData: DeviceFunctionData( - // entityId: device?.uuid ?? '', - // functionCode: functionCode, - // operationName: functionData.operationName, - // value: value, - // condition: functionData.condition, - // ), - // ), - // ); - // } + range: sliderRange, + onChanged: onSliderChanged, ), ], );