diff --git a/lib/components/select_train_suggestions/select_train_suggestions_cupertino.dart b/lib/components/select_train_suggestions/select_train_suggestions_cupertino.dart index fa87f65..fdcc941 100644 --- a/lib/components/select_train_suggestions/select_train_suggestions_cupertino.dart +++ b/lib/components/select_train_suggestions/select_train_suggestions_cupertino.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.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/train_id_text_span.dart'; import 'package:info_tren/models.dart'; class SelectTrainSuggestionsCupertino extends SelectTrainSuggestionsShared { @@ -69,8 +70,8 @@ class OperatorAutocompleteTileCupertino extends OperatorAutocompleteTile { style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(fontSize: 10, fontWeight: FontWeight.w200), textAlign: TextAlign.left, ), - Text( - "${train.rank} ${train.number}", + Text.rich( + trainIdSpan(rank: train.rank, number: train.number), textAlign: TextAlign.left, ), ], diff --git a/lib/components/select_train_suggestions/select_train_suggestions_fluent.dart b/lib/components/select_train_suggestions/select_train_suggestions_fluent.dart index 097f20e..dc1a783 100644 --- a/lib/components/select_train_suggestions/select_train_suggestions_fluent.dart +++ b/lib/components/select_train_suggestions/select_train_suggestions_fluent.dart @@ -1,5 +1,6 @@ import 'package:fluent_ui/fluent_ui.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'; class SelectTrainSuggestionsFluent extends SelectTrainSuggestionsShared { @@ -68,8 +69,8 @@ class OperatorAutocompleteTileFluent extends OperatorAutocompleteTile { style: FluentTheme.of(context).typography.body?.copyWith(fontSize: 10, fontWeight: FontWeight.w200), textAlign: TextAlign.left, ), - Text( - "${train.rank} ${train.number}", + Text.rich( + trainIdSpan(rank: train.rank, number: train.number), textAlign: TextAlign.left, ), ], diff --git a/lib/components/select_train_suggestions/select_train_suggestions_material.dart b/lib/components/select_train_suggestions/select_train_suggestions_material.dart index 4026e79..46df4bc 100644 --- a/lib/components/select_train_suggestions/select_train_suggestions_material.dart +++ b/lib/components/select_train_suggestions/select_train_suggestions_material.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.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'; class SelectTrainSuggestionsMaterial extends SelectTrainSuggestionsShared { @@ -44,7 +45,7 @@ class OperatorAutocompleteTileMaterial extends OperatorAutocompleteTile { Widget build(BuildContext context) { return ListTile( dense: true, - title: Text("${train.rank} ${train.number}"), + title: Text.rich(trainIdSpan(rank: train.rank, number: train.number)), subtitle: Text(operatorName), onTap: () { onTrainSelected(train.number); diff --git a/lib/components/train_id_text_span.dart b/lib/components/train_id_text_span.dart new file mode 100644 index 0000000..84535b4 --- /dev/null +++ b/lib/components/train_id_text_span.dart @@ -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, +); diff --git a/lib/pages/station_arrdep_page/view_station/view_station_cupertino.dart b/lib/pages/station_arrdep_page/view_station/view_station_cupertino.dart index f98747b..83a30e7 100644 --- a/lib/pages/station_arrdep_page/view_station/view_station_cupertino.dart +++ b/lib/pages/station_arrdep_page/view_station/view_station_cupertino.dart @@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:info_tren/components/loading/loading.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/train_id_text_span.dart'; import 'package:info_tren/models.dart'; import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/providers.dart'; @@ -66,18 +67,7 @@ class ViewStationPageCupertino extends ViewStationPageShared { onTap: () => onTrainTapped(context, item.train), child: CupertinoFormRow( prefix: Text.rich( - TextSpan( - 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,), - ], - ), + trainIdSpan(rank: item.train.rank, number: item.train.number), ), helper: Text.rich( TextSpan( @@ -99,18 +89,7 @@ class ViewStationPageCupertino extends ViewStationPageShared { onTap: () => onTrainTapped(context, item.train), child: CupertinoFormRow( prefix: Text.rich( - TextSpan( - 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,), - ], - ), + trainIdSpan(rank: item.train.rank, number: item.train.number), ), helper: Text.rich( TextSpan( diff --git a/lib/pages/station_arrdep_page/view_station/view_station_fluent.dart b/lib/pages/station_arrdep_page/view_station/view_station_fluent.dart index 276748d..9006547 100644 --- a/lib/pages/station_arrdep_page/view_station/view_station_fluent.dart +++ b/lib/pages/station_arrdep_page/view_station/view_station_fluent.dart @@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:info_tren/components/badge/badge.dart'; import 'package:info_tren/components/loading/loading.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/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/providers.dart'; @@ -177,18 +178,7 @@ class ViewStationPageFluent extends ViewStationPageShared { child: ListTile( // isThreeLine: item.status.delay != 0, title: Text.rich( - TextSpan( - 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,), - ], - ), + trainIdSpan(rank: item.train.rank, number: item.train.number), ), subtitle: Text.rich( TextSpan( diff --git a/lib/pages/station_arrdep_page/view_station/view_station_material.dart b/lib/pages/station_arrdep_page/view_station/view_station_material.dart index 1dfb76a..c57ff28 100644 --- a/lib/pages/station_arrdep_page/view_station/view_station_material.dart +++ b/lib/pages/station_arrdep_page/view_station/view_station_material.dart @@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:info_tren/components/badge/badge.dart'; import 'package:info_tren/components/loading/loading.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/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/providers.dart'; @@ -142,18 +143,7 @@ class ViewStationPageMaterial extends ViewStationPageShared { child: ListTile( isThreeLine: item.status.delay != 0, title: Text.rich( - TextSpan( - 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,), - ], - ), + trainIdSpan(rank: item.train.rank, number: item.train.number), ), subtitle: Text.rich( TextSpan( diff --git a/lib/pages/train_info_page/view_train/train_info_cupertino.dart b/lib/pages/train_info_page/view_train/train_info_cupertino.dart index c353aef..64dcfbc 100644 --- a/lib/pages/train_info_page/view_train/train_info_cupertino.dart +++ b/lib/pages/train_info_page/view_train/train_info_cupertino.dart @@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:info_tren/components/cupertino_divider.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/pages/train_info_page/train_info_constants.dart'; import 'package:info_tren/pages/train_info_page/view_train/train_info.dart'; @@ -562,18 +563,7 @@ class DisplayTrainID extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: Text.rich( - TextSpan( - 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,), - ], - ), + trainIdSpan(rank: trainData.rank, number: trainData.number), style: CupertinoTheme.of(context).textTheme.navLargeTitleTextStyle, ), ), diff --git a/lib/pages/train_info_page/view_train/train_info_fluent.dart b/lib/pages/train_info_page/view_train/train_info_fluent.dart index 44e3480..faf19b7 100644 --- a/lib/pages/train_info_page/view_train/train_info_fluent.dart +++ b/lib/pages/train_info_page/view_train/train_info_fluent.dart @@ -1,5 +1,6 @@ import 'package:fluent_ui/fluent_ui.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/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/pages/train_info_page/view_train/train_info.dart'; @@ -303,22 +304,7 @@ class DisplayTrainID extends StatelessWidget { @override Widget build(BuildContext context) { return Text.rich( - TextSpan( - 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, - ), - ], - ), + trainIdSpan(rank: trainData.rank, number: trainData.number), style: FluentTheme.of(context).typography.title?.copyWith( color: FluentTheme.of(context).typography.body?.color, fontWeight: FontWeight.bold, diff --git a/lib/pages/train_info_page/view_train/train_info_material.dart b/lib/pages/train_info_page/view_train/train_info_material.dart index 917056c..4161828 100644 --- a/lib/pages/train_info_page/view_train/train_info_material.dart +++ b/lib/pages/train_info_page/view_train/train_info_material.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.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/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/pages/train_info_page/view_train/train_info.dart'; @@ -318,22 +319,7 @@ class DisplayTrainID extends StatelessWidget { @override Widget build(BuildContext context) { return Text.rich( - TextSpan( - 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, - ), - ], - ), + trainIdSpan(rank: trainData.rank, number: trainData.number), style: (isSmallScreen(context) ? Theme.of(context).textTheme.headlineMedium : Theme.of(context).textTheme.displaySmall)