refilc-plus/lib/ui/mobile/goal_planner/route_option.dart
2024-10-03 18:47:25 +02:00

204 lines
5.8 KiB
Dart

import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc_plus/ui/mobile/goal_planner/goal_planner.dart';
import 'package:refilc_plus/ui/mobile/goal_planner/goal_planner_screen.i18n.dart';
import 'package:refilc_plus/ui/mobile/goal_planner/grade_display.dart';
import 'package:flutter/material.dart';
enum RouteMark { recommended, fastest }
class RouteOption extends StatelessWidget {
const RouteOption(
{super.key,
required this.plan,
this.mark,
this.selected = false,
required this.onSelected});
final Plan plan;
final RouteMark? mark;
final bool selected;
final void Function() onSelected;
Widget markLabel({Color? colorOverride}) {
TextStyle style =
TextStyle(fontWeight: FontWeight.bold, color: colorOverride);
switch (mark!) {
case RouteMark.recommended:
return Text("recommended".i18n, style: style);
case RouteMark.fastest:
return Text("fastest".i18n, style: style);
}
}
Color markColor(BuildContext context) {
switch (mark) {
case RouteMark.recommended:
return const Color.fromARGB(255, 104, 93, 255);
case RouteMark.fastest:
return const Color.fromARGB(255, 255, 91, 146);
default:
return Theme.of(context).colorScheme.primary;
}
}
@override
Widget build(BuildContext context) {
List<Widget> gradeWidgets = [];
for (int i = 5; i > 1; i--) {
final count = plan.plan.where((e) => e == i).length;
if (count > 4) {
gradeWidgets.add(Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${count}x",
style: TextStyle(
fontSize: 22.0,
fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.7),
),
),
const SizedBox(width: 4.0),
GradeDisplay(grade: i),
],
));
} else {
gradeWidgets
.addAll(List.generate(count, (_) => GradeDisplay(grade: i)));
}
if (count > 0) {
gradeWidgets.add(SizedBox(
height: 36.0,
width: 32.0,
child: Center(
child: Icon(Icons.add,
color: AppColors.of(context).text.withOpacity(.5))),
));
}
}
gradeWidgets.removeLast();
return Padding(
padding: const EdgeInsets.only(bottom: 12.0),
child: SizedBox(
width: double.infinity,
child: Card(
surfaceTintColor:
selected ? markColor(context).withOpacity(.2) : Colors.white,
margin: EdgeInsets.zero,
elevation: 5,
shadowColor: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16.0),
side: selected
? BorderSide(color: markColor(context), width: 1.5)
: BorderSide.none,
),
child: InkWell(
borderRadius: BorderRadius.circular(16.0),
onTap: onSelected,
child: Padding(
padding: const EdgeInsets.only(
top: 16.0, bottom: 16.0, left: 20.0, right: 12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (mark != null) ...[
// Chip(
// label: markLabel(),
// visualDensity: VisualDensity.compact,
// backgroundColor:
// selected ? markColor(context) : Colors.transparent,
// labelPadding: const EdgeInsets.symmetric(horizontal: 8.0),
// labelStyle:
// TextStyle(color: selected ? Colors.white : null),
// shape: StadiumBorder(
// side: BorderSide(
// color: markColor(context),
// width: 3.0,
// ),
// ),
// ),
markLabel(
colorOverride: selected ? markColor(context) : null),
const SizedBox(height: 6.0),
],
Wrap(
spacing: 4.0,
runSpacing: 8.0,
children: gradeWidgets,
),
],
),
),
),
),
),
);
}
}
class RouteOptionRow extends StatelessWidget {
const RouteOptionRow({
super.key,
required this.plan,
this.mark,
});
final Plan plan;
final RouteMark? mark;
@override
Widget build(BuildContext context) {
List<Widget> gradeWidgets = [];
for (int i = 5; i > 1; i--) {
final count = plan.plan.where((e) => e == i).length;
if (count > 4) {
gradeWidgets.add(Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${count}x",
style: TextStyle(
fontSize: 22.0,
fontWeight: FontWeight.w500,
color: AppColors.of(context).text.withOpacity(.7),
),
),
const SizedBox(width: 4.0),
GradeDisplay(grade: i),
],
));
} else {
gradeWidgets
.addAll(List.generate(count, (_) => GradeDisplay(grade: i)));
}
if (count > 0) {
gradeWidgets.add(SizedBox(
height: 36.0,
width: 32.0,
child: Center(
child: Icon(Icons.add,
color: AppColors.of(context).text.withOpacity(.5))),
));
}
}
gradeWidgets.removeLast();
return Wrap(
spacing: 4.0,
runSpacing: 8.0,
children: gradeWidgets,
);
}
}