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: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,
 | 
			
		||||
                  ),
 | 
			
		||||
                ],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
                  ),
 | 
			
		||||
                ],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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/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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue