You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

309 lines
8.7 KiB

import 'package:flutter/material.dart';
import 'dart:ui';
import 'models/train_data.dart';
class StationsList extends StatelessWidget {
final TrainData trainData;
StationsList(this.trainData);
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
for (final station in trainData.stations)
...[
// IntrinsicHeight(
/* child: */ Row(
children: <Widget>[
StopListLine(station),
Expanded(child: StopOnLineDetails(station))
],
),
// )
]
],
);
}
}
enum LineStyle {
SOLID,
DASHED
}
enum NotchStyle {
BLOB,
LINE,
DOT
}
class StopListLine extends StatelessWidget {
final Station station;
final int width;
StopListLine(this.station, {this.width = 32}) : assert(width.isEven);
@override
Widget build(BuildContext context) {
// return CustomPaint(
// child: SizedBox(
// height: double.infinity,
// width: width.toDouble(),
// ),
// painter: StopListLinePainter(
// primaryColor: Theme.of(context).primaryColor,
// secondaryColor: Theme.of(context).accentColor,
// borderColor: Theme.of(context).brightness == Brightness.light
// ? Colors.grey.shade700
// : Colors.grey.shade200,
// lineStyle: station.real ? LineStyle.SOLID : LineStyle.DASHED,
// ),
// );
return Container();
}
}
class StopListLinePainter extends CustomPainter {
final Color primaryColor;
final Color secondaryColor;
final Color borderColor;
final int lineWidth;
final int borderWidth;
final LineStyle lineStyle;
final NotchStyle notchStyle;
StopListLinePainter({
this.primaryColor,
this.secondaryColor,
this.borderColor,
this.lineStyle = LineStyle.SOLID,
this.notchStyle = NotchStyle.BLOB,
this.lineWidth = 16,
this.borderWidth = 2
}) : assert(lineWidth >= borderWidth * 4), assert(borderWidth >= 1);
Size painterSize;
@override
void paint(Canvas canvas, Size size) {
painterSize = size;
// TODO: implement paint
final width = size.width.toInt();
final height = size.height;
// Draw line on center
final beginX = width / 2 - lineWidth / 2;
final beginY1 = beginX - borderWidth;
final beginY2 = beginX + lineWidth;
var xPaint = Paint();
xPaint.color = secondaryColor;
xPaint.style = PaintingStyle.fill;
switch (lineStyle) {
case LineStyle.SOLID:
canvas.drawRect(Rect.fromLTWH(beginX, 0, lineWidth.toDouble(), height), xPaint);
break;
case LineStyle.DASHED:
for (var pos = 0; true; pos += (lineWidth * 2 + borderWidth * 2)) {
// if ()
}
break;
}
var yPaint = Paint();
yPaint.color = borderColor;
yPaint.style = PaintingStyle.fill;
switch (lineStyle) {
case LineStyle.SOLID:
canvas.drawRect(Rect.fromLTWH(beginY1, 0, borderWidth.toDouble(), height), yPaint);
canvas.drawRect(Rect.fromLTWH(beginY2, 0, borderWidth.toDouble(), height), yPaint);
break;
case LineStyle.DASHED:
break;
}
// Draw notch
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
final oldPainter = (oldDelegate as StopListLinePainter);
if (painterSize == null) return true;
if (oldPainter.painterSize != painterSize) return true;
if (oldPainter.primaryColor != primaryColor) return true;
if (oldPainter.secondaryColor != secondaryColor) return true;
if (oldPainter.lineWidth != lineWidth) return true;
if (oldPainter.borderWidth != borderWidth) return true;
if (oldPainter.primaryColor != primaryColor) return true;
if (oldPainter.secondaryColor != secondaryColor) return true;
if (oldPainter.borderColor != borderColor) return true;
return false;
}
}
class StopOnLineDetails extends StatelessWidget {
final Station station;
StopOnLineDetails(this.station);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.fromLTRB(4.0, 0.0, 4.0, 0.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Divider(
height: 0,
),
Padding(
padding: const EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 1.0),
child: Text(
station.name,
style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center,
),
),
// if (station.observations == "ONI")
// Padding(
// padding: const EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 0.5),
// child: Text("oprire ne-itinerarică", style: Theme.of(context).textTheme.bodyText2.copyWith(color: Colors.red.shade700),),
// ),
Padding(
padding: const EdgeInsets.fromLTRB(8.0, 0.5, 8.0, 8.0),
child: Text(
"km ${station.km}",
style: Theme.of(context).textTheme.caption,
textAlign: TextAlign.center,
),
),
StopOnLineTimeDetails(station),
// TODO: Figure out how to display delay info
// if (station.arrival != null && station.arrival.status != null || station.departure != null && station.departure.status != null)
// Padding(
// padding: const EdgeInsets.all(2.0),
// child: StopOnLineDelayDetails(station),
// ),
Divider(
height: 0,
),
],
),
);
}
}
class StopOnLineTimeDetails extends StatelessWidget {
final Station station;
StopOnLineTimeDetails(this.station);
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
if (station.arrival != null)
Padding(
padding: const EdgeInsets.all(4.0),
child: Align(
alignment: Alignment.topLeft,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
"sosește la",
textAlign: TextAlign.left,
),
Text(
station.arrival.scheduleTime,
textAlign: TextAlign.left,
)
],
),
),
),
if (station.stoppingTime != null)
Expanded(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Align(
alignment: Alignment.topCenter,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
"staționează pentru",
textAlign: TextAlign.center,
),
Text(
"${station.stoppingTime} ${station.stoppingTime == 1 ? "minut" : "minute"}",
textAlign: TextAlign.center,
)
],
),
),
),
)
else
Expanded(child: Container(),),
if (station.departure != null)
Padding(
padding: const EdgeInsets.all(4.0),
child: Align(
alignment: Alignment.topRight,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
"pleacă la",
textAlign: TextAlign.right,
),
Text(
station.departure.scheduleTime,
textAlign: TextAlign.right,
)
],
),
),
),
],
);
}
}
// class StopOnLineDelayDetails extends StatelessWidget {
// final Station station;
// StopOnLineDelayDetails(this.station);
// @override
// Widget build(BuildContext context) {
// if (station.delay == 0) {
// return Text(
// "Fără întârziere",
// style: Theme.of(context).textTheme.caption,
// textAlign: TextAlign.center,
// );
// }
// else if (station.delay < 0) {
// return Text(
// "${-(station.delay)} minute mai devreme",
// style: Theme.of(context).textTheme.bodyText2.copyWith(color: Colors.green.shade700),
// textAlign: TextAlign.center,
// );
// }
// else {
// return Text(
// "${station.delay} minute întârziere",
// style: Theme.of(context).textTheme.bodyText2.copyWith(color: Colors.red.shade700),
// textAlign: TextAlign.center,
// );
// }
// }
// }