import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; /// A screen item, /// /// Normalized screens are: "activity", "settings" and "about". /// /// These are set in [ApplicationNavigation] with /// - [ApplicationNavigation.screenActivity] /// - [ApplicationNavigation.screenSettings] /// - [ApplicationNavigation.screenAbout] /// class ScreenItem { final String code; final Icon icon; final Widget Function({required ApplicationConfigDefinition appConfig}) screen; const ScreenItem({ required this.code, required this.icon, required this.screen, }); } /// A page in [ScreenItem] given in [ApplicationNavigation.screenActivity] /// /// These are set in [ApplicationNavigation] with /// [ApplicationNavigation.activityPages]. /// class ActivityPageItem { final String code; final Icon? icon; final Widget Function({required ApplicationConfigDefinition appConfig}) builder; const ActivityPageItem({ required this.code, this.icon, required this.builder, }); factory ActivityPageItem.empty() { return ActivityPageItem( code: '', builder: ({required ApplicationConfigDefinition appConfig}) => Text(''), ); } } /// Custom AppBar configuration /// class AppBarConfiguration { final bool? hideApplicationTitle; final bool? pushQuitActivityButtonLeft; final bool? hideQuitActivityButton; final List<AppBarButton> Function(BuildContext context)? topBarButtonsBuilder; const AppBarConfiguration({ this.hideApplicationTitle = false, this.pushQuitActivityButtonLeft = false, this.hideQuitActivityButton = false, this.topBarButtonsBuilder, }); } /// Custom AppBar button (will generate a widget [IconButton]) /// class AppBarButton { final Icon icon; final Function(BuildContext context)? onPressed; final Function(BuildContext context)? onLongPress; const AppBarButton({ required this.icon, this.onPressed, this.onLongPress, }); Widget render(BuildContext context) { return ElevatedButton( onPressed: () => onPressed!(context), onLongPress: () => onLongPress!(context), style: ElevatedButton.styleFrom( shape: const CircleBorder(), iconColor: Theme.of(context).colorScheme.onSurface, ), child: icon, ); } } /// Navigation configuration for application /// class ApplicationNavigation { final ScreenItem screenActivity; final ScreenItem screenSettings; final ScreenItem screenAbout; final AppBarConfiguration? appBarConfiguration; final Map<int, ActivityPageItem> activityPages; final bool displayBottomNavBar; const ApplicationNavigation({ required this.screenActivity, required this.screenSettings, required this.screenAbout, this.appBarConfiguration, required this.activityPages, this.displayBottomNavBar = false, }); static const indexActivity = 0; static const indexSettings = 1; static const indexAbout = 2; ScreenItem getScreen(int screenIndex) { switch (screenIndex) { case indexActivity: return screenActivity; case indexSettings: return screenSettings; case indexAbout: return screenAbout; default: return screenActivity; } } ScreenItem getActivityScreen() { return screenActivity; } Widget getScreenWidget({ required ApplicationConfigDefinition appConfig, required int screenIndex, }) { return getScreen(screenIndex).screen(appConfig: appConfig); } bool isActivityPageIndexAllowed(int pageIndex) { return activityPages.keys.contains(pageIndex); } }