diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..2d0e144 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dart-code.flutter" + ] +} \ No newline at end of file diff --git a/images/car.png b/images/car.png new file mode 100644 index 0000000..29f66b4 Binary files /dev/null and b/images/car.png differ diff --git a/images/car_icons/acura.png b/images/car_icons/acura.png new file mode 100644 index 0000000..c36e62f Binary files /dev/null and b/images/car_icons/acura.png differ diff --git a/images/car_icons/audi.png b/images/car_icons/audi.png new file mode 100644 index 0000000..8de218e Binary files /dev/null and b/images/car_icons/audi.png differ diff --git a/images/car_icons/bmw.png b/images/car_icons/bmw.png new file mode 100644 index 0000000..e986900 Binary files /dev/null and b/images/car_icons/bmw.png differ diff --git a/images/car_icons/buick.png b/images/car_icons/buick.png new file mode 100644 index 0000000..d5e6b4c Binary files /dev/null and b/images/car_icons/buick.png differ diff --git a/images/car_icons/cadillac.png b/images/car_icons/cadillac.png new file mode 100644 index 0000000..55d3dbc Binary files /dev/null and b/images/car_icons/cadillac.png differ diff --git a/images/car_icons/car.png b/images/car_icons/car.png new file mode 100644 index 0000000..29f66b4 Binary files /dev/null and b/images/car_icons/car.png differ diff --git a/images/car_icons/chevrolet.png b/images/car_icons/chevrolet.png new file mode 100644 index 0000000..6b8eb65 Binary files /dev/null and b/images/car_icons/chevrolet.png differ diff --git a/images/car_icons/chrysler.png b/images/car_icons/chrysler.png new file mode 100644 index 0000000..634af4d Binary files /dev/null and b/images/car_icons/chrysler.png differ diff --git a/images/car_icons/dodge.png b/images/car_icons/dodge.png new file mode 100644 index 0000000..4e06355 Binary files /dev/null and b/images/car_icons/dodge.png differ diff --git a/images/car_icons/fiat.png b/images/car_icons/fiat.png new file mode 100644 index 0000000..f82b8bb Binary files /dev/null and b/images/car_icons/fiat.png differ diff --git a/images/car_icons/ford.png b/images/car_icons/ford.png new file mode 100644 index 0000000..6e93930 Binary files /dev/null and b/images/car_icons/ford.png differ diff --git a/images/car_icons/gmc.png b/images/car_icons/gmc.png new file mode 100644 index 0000000..7e359f1 Binary files /dev/null and b/images/car_icons/gmc.png differ diff --git a/images/car_icons/honda.png b/images/car_icons/honda.png new file mode 100644 index 0000000..17c8a70 Binary files /dev/null and b/images/car_icons/honda.png differ diff --git a/images/car_icons/hyundai.png b/images/car_icons/hyundai.png new file mode 100644 index 0000000..bb728f9 Binary files /dev/null and b/images/car_icons/hyundai.png differ diff --git a/images/car_icons/icons8.png b/images/car_icons/icons8.png new file mode 100644 index 0000000..a124721 Binary files /dev/null and b/images/car_icons/icons8.png differ diff --git a/images/car_icons/infiniti.png b/images/car_icons/infiniti.png new file mode 100644 index 0000000..6b16cf9 Binary files /dev/null and b/images/car_icons/infiniti.png differ diff --git a/images/car_icons/jaguar.png b/images/car_icons/jaguar.png new file mode 100644 index 0000000..6c16787 Binary files /dev/null and b/images/car_icons/jaguar.png differ diff --git a/images/car_icons/jeep.png b/images/car_icons/jeep.png new file mode 100644 index 0000000..1754161 Binary files /dev/null and b/images/car_icons/jeep.png differ diff --git a/images/car_icons/kia.png b/images/car_icons/kia.png new file mode 100644 index 0000000..db44253 Binary files /dev/null and b/images/car_icons/kia.png differ diff --git a/images/car_icons/lamborghini.png b/images/car_icons/lamborghini.png new file mode 100644 index 0000000..dcfd5fc Binary files /dev/null and b/images/car_icons/lamborghini.png differ diff --git a/images/car_icons/land-rover.png b/images/car_icons/land-rover.png new file mode 100644 index 0000000..2d68a04 Binary files /dev/null and b/images/car_icons/land-rover.png differ diff --git a/images/car_icons/lexus.png b/images/car_icons/lexus.png new file mode 100644 index 0000000..041edf2 Binary files /dev/null and b/images/car_icons/lexus.png differ diff --git a/images/car_icons/lincoln.png b/images/car_icons/lincoln.png new file mode 100644 index 0000000..8a24e6a Binary files /dev/null and b/images/car_icons/lincoln.png differ diff --git a/images/car_icons/maserati.png b/images/car_icons/maserati.png new file mode 100644 index 0000000..095a4bc Binary files /dev/null and b/images/car_icons/maserati.png differ diff --git a/images/mazda.png b/images/car_icons/mazda.png similarity index 100% rename from images/mazda.png rename to images/car_icons/mazda.png diff --git a/images/car_icons/mercedes-benz.png b/images/car_icons/mercedes-benz.png new file mode 100644 index 0000000..d4c4593 Binary files /dev/null and b/images/car_icons/mercedes-benz.png differ diff --git a/images/car_icons/mini.png b/images/car_icons/mini.png new file mode 100644 index 0000000..28500e2 Binary files /dev/null and b/images/car_icons/mini.png differ diff --git a/images/car_icons/mitsubishi.png b/images/car_icons/mitsubishi.png new file mode 100644 index 0000000..b2f6385 Binary files /dev/null and b/images/car_icons/mitsubishi.png differ diff --git a/images/car_icons/nissan.png b/images/car_icons/nissan.png new file mode 100644 index 0000000..368dfa9 Binary files /dev/null and b/images/car_icons/nissan.png differ diff --git a/images/car_icons/porsche.png b/images/car_icons/porsche.png new file mode 100644 index 0000000..d0ed0d8 Binary files /dev/null and b/images/car_icons/porsche.png differ diff --git a/images/car_icons/ram.png b/images/car_icons/ram.png new file mode 100644 index 0000000..ad51c6e Binary files /dev/null and b/images/car_icons/ram.png differ diff --git a/images/car_icons/rolls-royce.png b/images/car_icons/rolls-royce.png new file mode 100644 index 0000000..1057a2d Binary files /dev/null and b/images/car_icons/rolls-royce.png differ diff --git a/images/car_icons/subaru.png b/images/car_icons/subaru.png new file mode 100644 index 0000000..5b8e5a2 Binary files /dev/null and b/images/car_icons/subaru.png differ diff --git a/images/car_icons/suzuki.png b/images/car_icons/suzuki.png new file mode 100644 index 0000000..7a97ad7 Binary files /dev/null and b/images/car_icons/suzuki.png differ diff --git a/images/car_icons/tesla.png b/images/car_icons/tesla.png new file mode 100644 index 0000000..1c8de2c Binary files /dev/null and b/images/car_icons/tesla.png differ diff --git a/images/car_icons/toyota.png b/images/car_icons/toyota.png new file mode 100644 index 0000000..ea63622 Binary files /dev/null and b/images/car_icons/toyota.png differ diff --git a/images/car_icons/volkswagen.png b/images/car_icons/volkswagen.png new file mode 100644 index 0000000..f2a46ef Binary files /dev/null and b/images/car_icons/volkswagen.png differ diff --git a/images/car_icons/volvo.png b/images/car_icons/volvo.png new file mode 100644 index 0000000..41c826d Binary files /dev/null and b/images/car_icons/volvo.png differ diff --git a/images/car_icons_svg/acura.svg b/images/car_icons_svg/acura.svg deleted file mode 100644 index e59d22e..0000000 --- a/images/car_icons_svg/acura.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/audi.svg b/images/car_icons_svg/audi.svg deleted file mode 100644 index 318bbf4..0000000 --- a/images/car_icons_svg/audi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/bmw.svg b/images/car_icons_svg/bmw.svg deleted file mode 100644 index a01c0cc..0000000 --- a/images/car_icons_svg/bmw.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/buick.svg b/images/car_icons_svg/buick.svg deleted file mode 100644 index dfde4f7..0000000 --- a/images/car_icons_svg/buick.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/cadillac.svg b/images/car_icons_svg/cadillac.svg deleted file mode 100644 index c9271b4..0000000 --- a/images/car_icons_svg/cadillac.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/chevrolet.svg b/images/car_icons_svg/chevrolet.svg deleted file mode 100644 index cba114b..0000000 --- a/images/car_icons_svg/chevrolet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/chrysler.svg b/images/car_icons_svg/chrysler.svg deleted file mode 100644 index 995af1d..0000000 --- a/images/car_icons_svg/chrysler.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/dodge.svg b/images/car_icons_svg/dodge.svg deleted file mode 100644 index c753784..0000000 --- a/images/car_icons_svg/dodge.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/ford.svg b/images/car_icons_svg/ford.svg deleted file mode 100644 index c080c3c..0000000 --- a/images/car_icons_svg/ford.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/gmc.svg b/images/car_icons_svg/gmc.svg deleted file mode 100644 index 23bbd30..0000000 --- a/images/car_icons_svg/gmc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/honda.svg b/images/car_icons_svg/honda.svg deleted file mode 100644 index 73a8df0..0000000 --- a/images/car_icons_svg/honda.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/hyundai.svg b/images/car_icons_svg/hyundai.svg deleted file mode 100644 index beaae62..0000000 --- a/images/car_icons_svg/hyundai.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/icons8.svg b/images/car_icons_svg/icons8.svg deleted file mode 100644 index 29637fd..0000000 --- a/images/car_icons_svg/icons8.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/infiniti.svg b/images/car_icons_svg/infiniti.svg deleted file mode 100644 index 425a950..0000000 --- a/images/car_icons_svg/infiniti.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/jaguar.svg b/images/car_icons_svg/jaguar.svg deleted file mode 100644 index 62a33e5..0000000 --- a/images/car_icons_svg/jaguar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/jeep.svg b/images/car_icons_svg/jeep.svg deleted file mode 100644 index da257ba..0000000 --- a/images/car_icons_svg/jeep.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/kia.svg b/images/car_icons_svg/kia.svg deleted file mode 100644 index feb1c5e..0000000 --- a/images/car_icons_svg/kia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/lamborghini.svg b/images/car_icons_svg/lamborghini.svg deleted file mode 100644 index 696f187..0000000 --- a/images/car_icons_svg/lamborghini.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/land-rover.svg b/images/car_icons_svg/land-rover.svg deleted file mode 100644 index 4c0f7d8..0000000 --- a/images/car_icons_svg/land-rover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/lexus.svg b/images/car_icons_svg/lexus.svg deleted file mode 100644 index 2820bd0..0000000 --- a/images/car_icons_svg/lexus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/lincoln.svg b/images/car_icons_svg/lincoln.svg deleted file mode 100644 index b5ba395..0000000 --- a/images/car_icons_svg/lincoln.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/maserati.svg b/images/car_icons_svg/maserati.svg deleted file mode 100644 index 5265f58..0000000 --- a/images/car_icons_svg/maserati.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/mazda.svg b/images/car_icons_svg/mazda.svg deleted file mode 100644 index e10e094..0000000 --- a/images/car_icons_svg/mazda.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/mercedes-benz.svg b/images/car_icons_svg/mercedes-benz.svg deleted file mode 100644 index 8753f38..0000000 --- a/images/car_icons_svg/mercedes-benz.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/mini-cooper.svg b/images/car_icons_svg/mini-cooper.svg deleted file mode 100644 index f498724..0000000 --- a/images/car_icons_svg/mini-cooper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/mitsubishi.svg b/images/car_icons_svg/mitsubishi.svg deleted file mode 100644 index 5c2304f..0000000 --- a/images/car_icons_svg/mitsubishi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/nissan.svg b/images/car_icons_svg/nissan.svg deleted file mode 100644 index aef87d8..0000000 --- a/images/car_icons_svg/nissan.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/porsche.svg b/images/car_icons_svg/porsche.svg deleted file mode 100644 index 8a604a5..0000000 --- a/images/car_icons_svg/porsche.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/ram.svg b/images/car_icons_svg/ram.svg deleted file mode 100644 index 7522fbc..0000000 --- a/images/car_icons_svg/ram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/rolls-royce.svg b/images/car_icons_svg/rolls-royce.svg deleted file mode 100644 index 327b8fd..0000000 --- a/images/car_icons_svg/rolls-royce.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/subaru.svg b/images/car_icons_svg/subaru.svg deleted file mode 100644 index 87972d2..0000000 --- a/images/car_icons_svg/subaru.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/suzuki.svg b/images/car_icons_svg/suzuki.svg deleted file mode 100644 index 44ca923..0000000 --- a/images/car_icons_svg/suzuki.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/tesla.svg b/images/car_icons_svg/tesla.svg deleted file mode 100644 index e60e747..0000000 --- a/images/car_icons_svg/tesla.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/toyota.svg b/images/car_icons_svg/toyota.svg deleted file mode 100644 index b7647f7..0000000 --- a/images/car_icons_svg/toyota.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/volkswagen.svg b/images/car_icons_svg/volkswagen.svg deleted file mode 100644 index c0167d2..0000000 --- a/images/car_icons_svg/volkswagen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/car_icons_svg/volvo.svg b/images/car_icons_svg/volvo.svg deleted file mode 100644 index fec0440..0000000 --- a/images/car_icons_svg/volvo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/lib/bups/iconpicker-1.dart b/lib/bups/iconpicker-1.dart new file mode 100644 index 0000000..9ff2ccf --- /dev/null +++ b/lib/bups/iconpicker-1.dart @@ -0,0 +1,136 @@ +import 'dart:convert'; +import 'dart:async'; +import 'package:flutter/material.dart'; +// import '../images/car_icons.svg'; + +class IconPicker extends StatefulWidget { + IconPicker({super.key}); + + late final String? selectedIcon; + + @override + State createState() => _IconPickerState(); +} + +class _IconPickerState extends State { + late Future mfst; + late final Future manifestJson; + late final Future> icons; + late List iconList; + late List iconNames; + late Map iconMap; + late List searchableList = []; + late List items; + + TextEditingController editingController = TextEditingController(); + + @override + void initState() { + super.initState(); + icons = loadAssets(); + // iconNames = buildIconList(icons); + } + + Future> loadAssets() async { + final manifestJson = + await DefaultAssetBundle.of(context).loadString('AssetManifest.json'); + // ignore: no_leading_underscores_for_local_identifiers + final _icons = json + .decode(manifestJson) + .keys + .where((String key) => key.startsWith('images/car_icons/')) + .toList(); + return _icons; + } + + List buildIconList(List icons) { + List iN = []; + for (var i in icons) { + iN.add(i.substring(17, i.length - 4)); + } + return iN; + } + + void filterSearch(String query, List iconList) { + if (query.isNotEmpty) { + for (var item in iconList) { + if (item.contains(query)) { + searchableList.add(item); + } + } + setState(() { + items.clear(); + items.addAll(searchableList); + print(items); + }); + return; + } else { + setState(() { + items.clear(); + items.addAll(iconList); + }); + } + } + + @override + Widget build(BuildContext context) { + // mfst = DefaultAssetBundle.of(context).loadString('AssetManifest.json'); + // icons = json.decode(mfst).keys.where((String key) => key.startsWith('assets/images/car_icons_svg')).toList(); + // icons = loadAssets() as List; + return FutureBuilder( + future: icons, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else { + if (snapshot.error != null) { + return const Center( + child: Text('An error occurred'), + ); + } else { + iconList = snapshot.data!; + iconNames = buildIconList(iconList); + print('iconlist is ${iconList.sublist(0, 5)}...'); + print('iconNames is ${iconNames.sublist(0, 5)}...'); + return Scaffold( + appBar: AppBar( + title: const Text('test'), + backgroundColor: const Color.fromARGB(255, 185, 47, 5), + ), + body: Column(children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + onChanged: (value) { + filterSearch(value, snapshot.data!); + }, + controller: editingController, + ), + ), + Expanded( + child: ListView.builder( + itemCount: iconList.length, + itemBuilder: (context, index) => ListTile( + leading: CircleAvatar( + backgroundImage: AssetImage(iconList[index]), + backgroundColor: Colors.white, + ), + title: Text(iconNames[index]), + onTap: (() => VoidCallback)), + )) + ])); + } + } + }); + } + +/* Widget build(BuildContext context) { + return ListView.builder( + itemCount: icons.length, + itemBuilder: (context, index) => ListTile( + leading: Image(image: AssetImage(icons[index])), + title: const Text('title'), + ), + ); + } */ +} diff --git a/lib/main.dart b/lib/main.dart index 812b2cc..2f25835 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -70,6 +70,20 @@ class MyDrawer extends StatelessWidget { print('dbsetup'); }, ), + ListTile( + leading: const Icon(Icons.tune), + title: const Text('IconPicker'), + onTap: () { + showDialog( + barrierColor: Colors.black.withOpacity(.5), + context: context, + builder: (BuildContext context) { + return IconPicker(); + }); + /* Navigator.of(context).push( + MaterialPageRoute(builder: (context) => IconPicker())); */ + }, + ), ListTile( leading: const Icon(Icons.info_outline), title: const Text('About'), diff --git a/lib/models/car.dart b/lib/models/car.dart index c472636..76c4517 100644 --- a/lib/models/car.dart +++ b/lib/models/car.dart @@ -5,8 +5,9 @@ class Car { static const colNickname = 'nickname'; static const colPlate = 'plate'; static const colMileage = 'mileage'; + static const colIcon = 'icon'; - Car({this.id, this.vin, this.plate, this.nickname, this.mileage}); + Car({this.id, this.vin, this.plate, this.nickname, this.mileage, this.icon}); Car.fromMap(Map map) { id = map[colId]; @@ -14,6 +15,7 @@ class Car { nickname = map[colNickname]; plate = map[colPlate]; mileage = map[colMileage]; + icon = map[colIcon]; } int? id; @@ -21,6 +23,7 @@ class Car { String? plate; String? nickname; int? mileage; + String? icon; Map toMap() { var map = { @@ -28,6 +31,7 @@ class Car { colPlate: plate, colNickname: nickname, colMileage: mileage, + colIcon: icon, }; // if (id != null) { // map[colId] = id; //not sure https://www.youtube.com/watch?v=tj7Lj9a3fyM diff --git a/lib/screens/car_detail.dart b/lib/screens/car_detail.dart index 6d39260..4bde9a6 100644 --- a/lib/screens/car_detail.dart +++ b/lib/screens/car_detail.dart @@ -9,6 +9,7 @@ import 'package:dash/screens/screens.dart'; class CarDetailScreen extends StatefulWidget { const CarDetailScreen({super.key, required this.carIndex}); final int carIndex; + // late Car car; @override State createState() => _CarDetailScreenState(); @@ -20,13 +21,13 @@ class _CarDetailScreenState extends State { @override Widget build(BuildContext context) { - // late Car car = Provider.of(context).cars[widget.carIndex]; + late Car car = Provider.of(context).cars[widget.carIndex]; // late Car car = context.watch()_cars[widget.carIndex]; return Scaffold( appBar: AppBar( backgroundColor: const Color.fromARGB(255, 185, 47, 5), - // title: Text(car.nickname ?? ""), - title: const Text("View Car"), + title: Text(car.nickname ?? ""), + // title: const Text("View Car"), ), body: Padding( padding: const EdgeInsets.all(16.0), @@ -36,7 +37,6 @@ class _CarDetailScreenState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - const Text("plh img picker"), Center( // edit car screen child: Ink( @@ -58,11 +58,6 @@ class _CarDetailScreenState extends State { ), ], ), - IconButton( - iconSize: 48.0, - icon: const Icon(Icons.directions_car), - onPressed: (() => VoidCallback), - ), Consumer( builder: (context, garage, child) => Column( children: [ @@ -71,6 +66,11 @@ class _CarDetailScreenState extends State { Text("License Plate: ${garage.cars[widget.carIndex].plate}"), Text( "Mileage: ${garage.cars[widget.carIndex].mileage.toString()}"), + CircleAvatar( + backgroundImage: AssetImage( + garage.cars[widget.carIndex].icon ?? + 'images/car.png'), + backgroundColor: Colors.white), ], ), ), @@ -97,10 +97,10 @@ class CarTxns extends StatefulWidget { final int carIndex; @override - State createState() => _CurrentCar(); + State createState() => _CarTxns(); } -class _CurrentCar extends State { +class _CarTxns extends State { late Future _txns; late Car car; @@ -112,10 +112,22 @@ class _CurrentCar extends State { super.initState(); } + Icon getIcon(String? txntype) { + if (txntype == 'Gas') { + return (const Icon(Icons.local_gas_station)); + } else if (txntype == 'Oil') { + return (const Icon(Icons.water_drop)); + } else if (txntype == 'Other') { + return (const Icon(Icons.build)); + } else { + return (const Icon(Icons.question_mark)); + } + } + @override Widget build(BuildContext context) { // car = - // Provider.of(context, listen: false).cars[widget.carIndex]; + // Provider.of(context, listen: false).cars[widget.carIndex]; // _txns = Provider.of(context, listen: false).getTxns(car.id!); return FutureBuilder( future: _txns, @@ -139,7 +151,7 @@ class _CurrentCar extends State { // dense: true, //only affects text, use visualDensity instead visualDensity: const VisualDensity(horizontal: 0, vertical: -4), - leading: const Icon(Icons.local_gas_station), + leading: getIcon(garage.txns[index].txntype), title: Text(garage.txns[index].txntype ?? "type"), subtitle: Text(garage.txns[index].note ?? "note"), onTap: (() => VoidCallback)), diff --git a/lib/screens/car_edit.dart b/lib/screens/car_edit.dart index 3e64eb9..27bbded 100644 --- a/lib/screens/car_edit.dart +++ b/lib/screens/car_edit.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:dash/utils/garage_model.dart'; import 'package:dash/models/car.dart'; +import 'package:dash/screens/iconpicker.dart'; class EditCarScreen extends StatefulWidget { const EditCarScreen({super.key, required this.carIndex}); @@ -16,6 +17,8 @@ class _EditCarScreenState extends State { late GarageModel garage; late Car car; late int carIndex = widget.carIndex; + late IconPicker ip = IconPicker(); + late String selectedIcon = 'images/car.png'; @override void initState() { @@ -98,6 +101,22 @@ class _EditCarScreenState extends State { return null; }, ), + ListTile( + leading: CircleAvatar( + backgroundImage: AssetImage(car.icon ?? selectedIcon), + backgroundColor: Colors.white), + title: const Text("Change Icon"), + onTap: () => showDialog( + barrierColor: Colors.black.withOpacity(.5), + context: context, + builder: (BuildContext context) { + return ip; + }).then((value) => setState( + () { + // selectedIcon = ip.selectedIcon; + selectedIcon = value; + }, + ))), Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), child: ElevatedButton( @@ -107,6 +126,7 @@ class _EditCarScreenState extends State { //validate form updateForm .save(); //save values (reqd before putting them anywhere) + car.icon = selectedIcon; garage.update(car, carIndex); updateForm.reset(); Navigator.pop(context); diff --git a/lib/screens/car_new.dart b/lib/screens/car_new.dart index 93a2419..2589ae1 100644 --- a/lib/screens/car_new.dart +++ b/lib/screens/car_new.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:dash/utils/garage_model.dart'; import 'package:dash/models/car.dart'; -import '../utils/garage_model.dart'; +import 'package:dash/screens/screens.dart'; class NewCarScreen extends StatefulWidget { const NewCarScreen({super.key}); @@ -14,6 +14,8 @@ class NewCarScreen extends StatefulWidget { class _NewCarScreenState extends State { final GlobalKey formKey = GlobalKey(); Car car = Car(); //initialization is required + late IconPicker ip = IconPicker(); + late String selectedIcon = 'images/car.png'; @override Widget build(BuildContext context) { @@ -29,7 +31,6 @@ class _NewCarScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - //new car form text fields TextFormField( decoration: const InputDecoration( labelText: 'Nickname', @@ -81,6 +82,22 @@ class _NewCarScreenState extends State { return null; }, ), + ListTile( + leading: CircleAvatar( + backgroundImage: AssetImage(selectedIcon), + backgroundColor: Colors.white), + title: const Text("Change Icon"), + onTap: () => showDialog( + barrierColor: Colors.black.withOpacity(.5), + context: context, + builder: (BuildContext context) { + return ip; + }).then((value) => setState( + () { + // selectedIcon = ip.selectedIcon; + selectedIcon = value; + }, + ))), Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: ElevatedButton( @@ -96,6 +113,7 @@ class _NewCarScreenState extends State { vin: car.vin, nickname: car.nickname, plate: car.plate, + icon: selectedIcon, mileage: car.mileage); }); // var garage = context.read(); diff --git a/lib/screens/iconpicker.dart b/lib/screens/iconpicker.dart new file mode 100644 index 0000000..4521c30 --- /dev/null +++ b/lib/screens/iconpicker.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; +import 'dart:async'; +import 'package:flutter/material.dart'; + +class IconPicker extends StatefulWidget { + IconPicker({super.key}); + + late String selectedIcon = 'images/car.png'; + + @override + State createState() => _IconPickerState(); +} + +class _IconPickerState extends State { + late Future manifestJson; + late List icons; + late List iconList; + late List items; + + TextEditingController editingController = TextEditingController(); + + @override + void initState() { + super.initState(); + loadAssets(); + } + + Future> loadAssets() async { + final manifestJson = + await DefaultAssetBundle.of(context).loadString('AssetManifest.json'); + // ignore: no_leading_underscores_for_local_identifiers + final _icons = await json + .decode(manifestJson) + .keys + .where((String key) => key.startsWith('images/car_icons/')) + .toList(); + setState(() { + icons = _icons; + items = _icons; + }); + return _icons; + } + + void runFilter(String query) { + List results = []; + if (query.isEmpty) { + results = icons; + } else { + results = icons + .where((i) => i.substring(17, i.length - 4).contains(query)) + .toList(); + } + setState(() { + items = results; + }); + } + + @override + Widget build(BuildContext context) { + return Dialog( + child: Column(children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + decoration: const InputDecoration( + prefixIcon: Icon(Icons.search), + hintText: "Search icons", + ), + onChanged: (value) { + // filterSearch(value, iconList); + runFilter(value); + print('items found: $items'); + }, + // controller: editingController, + ), + ), + Expanded( + child: ListView.builder( + itemCount: items.length, + itemBuilder: (context, index) => ListTile( + leading: CircleAvatar( + // backgroundImage: AssetImage(iconList[index]), + backgroundImage: AssetImage(items[index]), + backgroundColor: Colors.white, + ), + title: Text(items[index].substring(17, items[index].length - 4)), + // title: Text(items[index]), + onTap: () => + Navigator.of(context, rootNavigator: true).pop(items[index]), + // onTap: (() => setState(() { + // widget.selectedIcon = items[index]; + // })))), + ), + )), + ])); + } +} diff --git a/lib/screens/screens.dart b/lib/screens/screens.dart index 3a48043..7e9ed2f 100644 --- a/lib/screens/screens.dart +++ b/lib/screens/screens.dart @@ -4,3 +4,4 @@ export 'package:dash/screens/car_detail.dart'; export 'package:dash/screens/car_edit.dart'; export 'package:dash/screens/txn_new.dart'; export 'package:dash/screens/txn_type.dart'; +export 'package:dash/screens/iconpicker.dart'; diff --git a/lib/screens/txn_new.dart b/lib/screens/txn_new.dart index b7b51af..a33eb04 100644 --- a/lib/screens/txn_new.dart +++ b/lib/screens/txn_new.dart @@ -79,7 +79,14 @@ class _NewTxnScreenState extends State { decoration: const InputDecoration( labelText: 'Cost', ), - initialValue: "0", + initialValue: "", + onTap: () { + final ft = TextEditingController(); + ft.clear(); + setState(() { + ft.text = ""; + }); + }, onSaved: (val) => setState(() => txn.cost = double.parse(val ?? "0")), keyboardType: TextInputType.number, @@ -117,8 +124,6 @@ class _NewTxnScreenState extends State { setState(() { txn.datetime = DateTime.now().millisecondsSinceEpoch; txn.txntype = txnType.selectedText; - print( - "txntype set to ${txn.txntype} from radio ${txnType.selectedText}"); txn.carid = car.id; car.mileage = txn.mileage; // update car mileage too }); diff --git a/lib/screens/txn_type.dart b/lib/screens/txn_type.dart index ce383ef..f746a08 100644 --- a/lib/screens/txn_type.dart +++ b/lib/screens/txn_type.dart @@ -32,7 +32,9 @@ class TxnTypeState extends State { Widget rIcon( {required int index, required String text, required IconData icon}) { - return Container( + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, padding: const EdgeInsets.all(16.0), decoration: BoxDecoration( shape: BoxShape.circle, diff --git a/lib/utils/dbhelper_sqflite.dart b/lib/utils/dbhelper_sqflite.dart index 09a2a66..77e6736 100644 --- a/lib/utils/dbhelper_sqflite.dart +++ b/lib/utils/dbhelper_sqflite.dart @@ -43,7 +43,8 @@ class DbHelperSqlite { ${Car.colVin} TEXT UNIQUE, ${Car.colNickname} TEXT, ${Car.colMileage} INTEGER, - ${Car.colPlate} TEXT); + ${Car.colPlate} TEXT, + ${Car.colIcon} TEXT); '''); await db.execute(''' CREATE TABLE ${Txn.tblTxns} ( diff --git a/lib/utils/garage_model.dart b/lib/utils/garage_model.dart index 759de3a..84528ec 100644 --- a/lib/utils/garage_model.dart +++ b/lib/utils/garage_model.dart @@ -120,7 +120,10 @@ class _Garage extends State { return ListView.separated( itemCount: garage._cars.length, itemBuilder: (context, index) => ListTile( - leading: const Icon(Icons.directions_car), + leading: CircleAvatar( + backgroundImage: AssetImage( + garage.cars[index].icon ?? 'images/car.png'), + backgroundColor: Colors.white), title: Text(garage.cars[index].nickname ?? "nick_ph"), subtitle: Text(garage.cars[index].vin ?? "vin_ph"), onTap: () { diff --git a/pubspec.yaml b/pubspec.yaml index 5de9321..fa8248f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,8 +70,8 @@ flutter: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg assets: - - images/mazda.png - - images/car_icons_svg/ + - images/car.png + - images/car_icons/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware