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