import 'package:flutter/material.dart'; import '../../../../core/models/sensor_defs.dart'; import '../../../../core/models/units.dart'; import '../../../theme/app_colors.dart'; /// One choosable entry in [showPickerSheet]. class PickerItem { final String id; final String title; final String? subtitle; const PickerItem(this.id, this.title, [this.subtitle]); } /// Bottom sheet listing [items]; resolves to the chosen id, or null. Future showPickerSheet( BuildContext context, { required String title, required List items, required String currentId, }) { return showModalBottomSheet( context: context, isScrollControlled: true, backgroundColor: Colors.transparent, builder: (_) => _PickerSheet( title: title, items: items, currentId: currentId, ), ); } /// Picker over every analog sensor, showing the unit currently in use. Future pickSensor( BuildContext context, { required String title, required String currentId, required UnitPrefs units, }) { return showPickerSheet( context, title: title, currentId: currentId, items: [ for (final d in sensorDefs) PickerItem(d.id, d.displayName, sensorView(d.id, units).unit), ], ); } /// Picker over every flag. Future pickFlag(BuildContext context, {required String currentId}) { return showPickerSheet( context, title: 'SELECT FLAG', currentId: currentId, items: [for (final f in flagDefs) PickerItem(f.id, f.displayName)], ); } class _PickerSheet extends StatelessWidget { final String title; final List items; final String currentId; const _PickerSheet({ required this.title, required this.items, required this.currentId, }); @override Widget build(BuildContext context) { final c = AppColors.of(context); return DraggableScrollableSheet( expand: false, initialChildSize: 0.6, minChildSize: 0.4, maxChildSize: 0.9, builder: (context, scrollController) { return Container( decoration: BoxDecoration( color: c.surface, borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), ), child: Column( children: [ const SizedBox(height: 8), Container( width: 40, height: 4, decoration: BoxDecoration( color: c.onSurfaceMuted.withAlpha(90), borderRadius: BorderRadius.circular(2), ), ), Padding( padding: const EdgeInsets.all(16), child: Text( title, style: TextStyle( color: c.onSurfaceMuted, fontSize: 12, letterSpacing: 2, fontWeight: FontWeight.w600, ), ), ), Divider(height: 1, color: c.divider), Expanded( child: ListView.builder( controller: scrollController, itemCount: items.length, itemBuilder: (context, i) { final item = items[i]; final isSelected = item.id == currentId; return ListTile( title: Text( item.title, style: TextStyle( color: c.onSurface, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, ), ), subtitle: item.subtitle == null ? null : Text( item.subtitle!, style: TextStyle( color: c.onSurfaceMuted, fontSize: 12), ), trailing: isSelected ? Icon(Icons.check, color: c.accent, size: 18) : null, onTap: () => Navigator.pop(context, item.id), ); }, ), ), ], ), ); }, ); } }