From 7a1060e7731fc5833a6c4c724582f9851807e219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Tue, 9 Sep 2025 09:56:57 +0200 Subject: [PATCH] feat: add searchable units list with filtering --- lib/ai/unit_list.dart | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lib/ai/unit_list.dart diff --git a/lib/ai/unit_list.dart b/lib/ai/unit_list.dart new file mode 100644 index 0000000..76a7d84 --- /dev/null +++ b/lib/ai/unit_list.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import '../corpus.dart'; +import '../formula_models.dart'; + +class UnitList extends StatefulWidget { + final UnitCorpus corpus; + + const UnitList({super.key, required this.corpus}); + + @override + State createState() => _UnitListState(); +} + +class _UnitListState extends State { + final TextEditingController _searchController = TextEditingController(); + String _searchQuery = ''; + + @override + void initState() { + super.initState(); + _searchController.addListener(_onSearchChanged); + } + + void _onSearchChanged() { + setState(() { + _searchQuery = _searchController.text.toLowerCase(); + }); + } + + @override + void dispose() { + _searchController.dispose(); + super.dispose(); + } + + List get _filteredUnits { + bool filter(UnitSpec unit) => unit.name.toLowerCase().contains(_searchQuery); + return widget.corpus.allUnits().where(filter).toList(); + } + + // Add unit conversion to base unit to the unit widget AI! + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Units List'), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + controller: _searchController, + decoration: const InputDecoration( + labelText: 'Search units', + hintText: 'Start typing unit name...', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder(), + ), + ), + ), + Expanded( + child: ListView.builder( + itemCount: _filteredUnits.length, + itemBuilder: (context, index) { + final unit = _filteredUnits[index]; + return ListTile( + title: Text(unit.name), + subtitle: Text('Symbol: ${unit.symbol} • Base unit: ${unit.baseUnit}'), + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + tileColor: index.isEven + ? Theme.of(context).colorScheme.surfaceVariant.withOpacity(0.3) + : null, + ); + }, + ), + ), + ], + ), + ); + } +}