Add support for IC trains
This commit is contained in:
parent
2456f7cbda
commit
9637551d7a
10 changed files with 60 additions and 97 deletions
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:info_tren/components/cupertino_divider.dart';
|
import 'package:info_tren/components/cupertino_divider.dart';
|
||||||
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
|
|
||||||
class SelectTrainSuggestionsCupertino extends SelectTrainSuggestionsShared {
|
class SelectTrainSuggestionsCupertino extends SelectTrainSuggestionsShared {
|
||||||
|
@ -69,8 +70,8 @@ class OperatorAutocompleteTileCupertino extends OperatorAutocompleteTile {
|
||||||
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(fontSize: 10, fontWeight: FontWeight.w200),
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(fontSize: 10, fontWeight: FontWeight.w200),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
),
|
),
|
||||||
Text(
|
Text.rich(
|
||||||
"${train.rank} ${train.number}",
|
trainIdSpan(rank: train.rank, number: train.number),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:fluent_ui/fluent_ui.dart';
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
|
|
||||||
class SelectTrainSuggestionsFluent extends SelectTrainSuggestionsShared {
|
class SelectTrainSuggestionsFluent extends SelectTrainSuggestionsShared {
|
||||||
|
@ -68,8 +69,8 @@ class OperatorAutocompleteTileFluent extends OperatorAutocompleteTile {
|
||||||
style: FluentTheme.of(context).typography.body?.copyWith(fontSize: 10, fontWeight: FontWeight.w200),
|
style: FluentTheme.of(context).typography.body?.copyWith(fontSize: 10, fontWeight: FontWeight.w200),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
),
|
),
|
||||||
Text(
|
Text.rich(
|
||||||
"${train.rank} ${train.number}",
|
trainIdSpan(rank: train.rank, number: train.number),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
|
|
||||||
class SelectTrainSuggestionsMaterial extends SelectTrainSuggestionsShared {
|
class SelectTrainSuggestionsMaterial extends SelectTrainSuggestionsShared {
|
||||||
|
@ -44,7 +45,7 @@ class OperatorAutocompleteTileMaterial extends OperatorAutocompleteTile {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
dense: true,
|
dense: true,
|
||||||
title: Text("${train.rank} ${train.number}"),
|
title: Text.rich(trainIdSpan(rank: train.rank, number: train.number)),
|
||||||
subtitle: Text(operatorName),
|
subtitle: Text(operatorName),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
onTrainSelected(train.number);
|
onTrainSelected(train.number);
|
||||||
|
|
39
lib/components/train_id_text_span.dart
Normal file
39
lib/components/train_id_text_span.dart
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/rendering.dart';
|
||||||
|
|
||||||
|
TextSpan trainIdSpan({
|
||||||
|
required String rank,
|
||||||
|
required String number,
|
||||||
|
Locale? locale,
|
||||||
|
MouseCursor? mouseCursor,
|
||||||
|
void Function(PointerEnterEvent)? onEnter,
|
||||||
|
void Function(PointerExitEvent)? onExit,
|
||||||
|
GestureRecognizer? recognizer,
|
||||||
|
String? semanticsLabel,
|
||||||
|
bool? spellOut,
|
||||||
|
TextStyle? style,
|
||||||
|
}) => TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: rank,
|
||||||
|
style: TextStyle(
|
||||||
|
inherit: true,
|
||||||
|
color: rank.startsWith('IC')
|
||||||
|
? const Color.fromARGB(255, 0, 255, 0)
|
||||||
|
: rank.startsWith('IR')
|
||||||
|
? const Color.fromARGB(255, 255, 0, 0)
|
||||||
|
: null,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const TextSpan(text: ' '),
|
||||||
|
TextSpan(text: number),
|
||||||
|
],
|
||||||
|
locale: locale,
|
||||||
|
mouseCursor: mouseCursor,
|
||||||
|
onEnter: onEnter,
|
||||||
|
onExit: onExit,
|
||||||
|
recognizer: recognizer,
|
||||||
|
semanticsLabel: semanticsLabel,
|
||||||
|
spellOut: spellOut,
|
||||||
|
style: style,
|
||||||
|
);
|
|
@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/components/loading/loading.dart';
|
import 'package:info_tren/components/loading/loading.dart';
|
||||||
import 'package:info_tren/components/refresh_future_builder.dart';
|
import 'package:info_tren/components/refresh_future_builder.dart';
|
||||||
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
|
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
@ -66,18 +67,7 @@ class ViewStationPageCupertino extends ViewStationPageShared {
|
||||||
onTap: () => onTrainTapped(context, item.train),
|
onTap: () => onTrainTapped(context, item.train),
|
||||||
child: CupertinoFormRow(
|
child: CupertinoFormRow(
|
||||||
prefix: Text.rich(
|
prefix: Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: item.train.rank, number: item.train.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: item.train.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(text: item.train.number,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
helper: Text.rich(
|
helper: Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
|
@ -99,18 +89,7 @@ class ViewStationPageCupertino extends ViewStationPageShared {
|
||||||
onTap: () => onTrainTapped(context, item.train),
|
onTap: () => onTrainTapped(context, item.train),
|
||||||
child: CupertinoFormRow(
|
child: CupertinoFormRow(
|
||||||
prefix: Text.rich(
|
prefix: Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: item.train.rank, number: item.train.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: item.train.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(text: item.train.number,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
helper: Text.rich(
|
helper: Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
|
|
|
@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/components/badge/badge.dart';
|
import 'package:info_tren/components/badge/badge.dart';
|
||||||
import 'package:info_tren/components/loading/loading.dart';
|
import 'package:info_tren/components/loading/loading.dart';
|
||||||
import 'package:info_tren/components/refresh_future_builder.dart';
|
import 'package:info_tren/components/refresh_future_builder.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
@ -177,18 +178,7 @@ class ViewStationPageFluent extends ViewStationPageShared {
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
// isThreeLine: item.status.delay != 0,
|
// isThreeLine: item.status.delay != 0,
|
||||||
title: Text.rich(
|
title: Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: item.train.rank, number: item.train.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: item.train.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(text: item.train.number,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
subtitle: Text.rich(
|
subtitle: Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
|
|
|
@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:info_tren/components/badge/badge.dart';
|
import 'package:info_tren/components/badge/badge.dart';
|
||||||
import 'package:info_tren/components/loading/loading.dart';
|
import 'package:info_tren/components/loading/loading.dart';
|
||||||
import 'package:info_tren/components/refresh_future_builder.dart';
|
import 'package:info_tren/components/refresh_future_builder.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/providers.dart';
|
import 'package:info_tren/providers.dart';
|
||||||
|
@ -142,18 +143,7 @@ class ViewStationPageMaterial extends ViewStationPageShared {
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
isThreeLine: item.status.delay != 0,
|
isThreeLine: item.status.delay != 0,
|
||||||
title: Text.rich(
|
title: Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: item.train.rank, number: item.train.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: item.train.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(text: item.train.number,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
subtitle: Text.rich(
|
subtitle: Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:info_tren/components/cupertino_divider.dart';
|
import 'package:info_tren/components/cupertino_divider.dart';
|
||||||
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
|
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/train_info_constants.dart';
|
import 'package:info_tren/pages/train_info_page/train_info_constants.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
||||||
|
@ -562,18 +563,7 @@ class DisplayTrainID extends StatelessWidget {
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text.rich(
|
child: Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: trainData.rank, number: trainData.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: trainData.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: trainData.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(text: trainData.number,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
style: CupertinoTheme.of(context).textTheme.navLargeTitleTextStyle,
|
style: CupertinoTheme.of(context).textTheme.navLargeTitleTextStyle,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:fluent_ui/fluent_ui.dart';
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
||||||
|
@ -303,22 +304,7 @@ class DisplayTrainID extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Text.rich(
|
return Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: trainData.rank, number: trainData.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: trainData.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: trainData.rank.startsWith('IR')
|
|
||||||
? const Color.fromARGB(255, 255, 0, 0)
|
|
||||||
: null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(
|
|
||||||
text: trainData.number,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
style: FluentTheme.of(context).typography.title?.copyWith(
|
style: FluentTheme.of(context).typography.title?.copyWith(
|
||||||
color: FluentTheme.of(context).typography.body?.color,
|
color: FluentTheme.of(context).typography.body?.color,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:info_tren/components/slim_app_bar.dart';
|
import 'package:info_tren/components/slim_app_bar.dart';
|
||||||
|
import 'package:info_tren/components/train_id_text_span.dart';
|
||||||
import 'package:info_tren/models.dart';
|
import 'package:info_tren/models.dart';
|
||||||
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
|
||||||
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
|
||||||
|
@ -318,22 +319,7 @@ class DisplayTrainID extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Text.rich(
|
return Text.rich(
|
||||||
TextSpan(
|
trainIdSpan(rank: trainData.rank, number: trainData.number),
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: trainData.rank,
|
|
||||||
style: TextStyle(
|
|
||||||
color: trainData.rank.startsWith('IR')
|
|
||||||
? const Color.fromARGB(255, 255, 0, 0)
|
|
||||||
: null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const TextSpan(text: ' '),
|
|
||||||
TextSpan(
|
|
||||||
text: trainData.number,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
style: (isSmallScreen(context)
|
style: (isSmallScreen(context)
|
||||||
? Theme.of(context).textTheme.headlineMedium
|
? Theme.of(context).textTheme.headlineMedium
|
||||||
: Theme.of(context).textTheme.displaySmall)
|
: Theme.of(context).textTheme.displaySmall)
|
||||||
|
|
Loading…
Add table
Reference in a new issue