Skip to content
Snippets Groups Projects
Commit fe47d3a7 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Normalize Activity application architecture

parent 97ac7a37
No related branches found
No related tags found
1 merge request!26Resolve "Normalize Activity application architecture"
Pipeline #6685 passed
This commit is part of merge request !26. Comments created here will be created in the context of that merge request.
Showing
with 182 additions and 55 deletions
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"about_version": "Version: {version}", "about_version": "Version: {version}",
"page_home": "Home", "page_home": "Home",
"page_player": "Player",
"page_remote_control": "Control", "page_remote_control": "Control",
"": "" "": ""
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"about_version": "Version : {version}", "about_version": "Version : {version}",
"page_home": "Accueil", "page_home": "Accueil",
"page_player": "Player",
"page_remote_control": "Télécommande", "page_remote_control": "Télécommande",
"": "" "": ""
......
Normalize Activity application architecture.
Harmonisation des applications en Activity.
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/ui/pages/remote_control.dart'; import 'package:plotter/common/ui/pages/home.dart';
import 'package:plotter/ui/pages/home.dart'; import 'package:plotter/common/ui/pages/player.dart';
import 'package:plotter/common/ui/pages/remote_control.dart';
class ActivityPageItem { class ActivityPageItem {
final String code;
final Icon icon; final Icon icon;
final Widget page; final Widget page;
final String code;
const ActivityPageItem({ const ActivityPageItem({
required this.code,
required this.icon, required this.icon,
required this.page, required this.page,
required this.code,
}); });
} }
class ActivityPage { class ActivityPage {
static const bool displayBottomNavBar = true;
static const indexHome = 0; static const indexHome = 0;
static const pageHome = ActivityPageItem( static const pageHome = ActivityPageItem(
code: 'page_home',
icon: Icon(UniconsLine.home), icon: Icon(UniconsLine.home),
page: PageHome(), page: PageHome(),
code: 'page_home',
); );
static const indexRemoteControl = 1; static const indexPlayer = 1;
static const pagePlayer = ActivityPageItem(
code: 'page_player',
icon: Icon(UniconsLine.star),
page: PagePlayer(),
);
static const indexRemoteControl = 2;
static const pageRemoteControl = ActivityPageItem( static const pageRemoteControl = ActivityPageItem(
icon: Icon(UniconsLine.arrow),
page: PageRemoteControl(),
code: 'page_remote_control', code: 'page_remote_control',
icon: Icon(UniconsLine.star),
page: PageRemoteControl(),
); );
static Map<int, ActivityPageItem> items = { static const Map<int, ActivityPageItem> items = {
indexHome: pageHome, indexHome: pageHome,
indexPlayer: pagePlayer,
indexRemoteControl: pageRemoteControl, indexRemoteControl: pageRemoteControl,
}; };
static int defaultPageIndex = indexHome;
static bool isIndexAllowed(int pageIndex) { static bool isIndexAllowed(int pageIndex) {
return items.keys.contains(pageIndex); return items.keys.contains(pageIndex);
} }
static ActivityPageItem getPageItem(int pageIndex) { static Widget getWidget(int pageIndex) {
return items[pageIndex] ?? pageHome;
}
static Widget getPageWidget(int pageIndex) {
return items[pageIndex]?.page ?? pageHome.page; return items[pageIndex]?.page ?? pageHome.page;
} }
static int itemsCount = ActivityPage.items.length;
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/ui/screens/about.dart'; import 'package:plotter/common/ui/screens/about.dart';
import 'package:plotter/ui/screens/activity.dart'; import 'package:plotter/common/ui/screens/activity.dart';
import 'package:plotter/ui/screens/settings.dart'; import 'package:plotter/common/ui/screens/settings.dart';
class ScreenItem { class ScreenItem {
final String code;
final Icon icon; final Icon icon;
final Widget screen; final Widget screen;
final bool displayBottomNavBar;
const ScreenItem({ const ScreenItem({
required this.code,
required this.icon, required this.icon,
required this.screen, required this.screen,
required this.displayBottomNavBar,
}); });
} }
class Screen { class Screen {
static const indexActivity = 0; static const indexActivity = 0;
static const screenActivity = ScreenItem( static const screenActivity = ScreenItem(
code: 'screen_activity',
icon: Icon(UniconsLine.home), icon: Icon(UniconsLine.home),
screen: ScreenActivity(), screen: ScreenActivity(),
displayBottomNavBar: true,
); );
static const indexSettings = 1; static const indexSettings = 1;
static const screenSettings = ScreenItem( static const screenSettings = ScreenItem(
code: 'screen_settings',
icon: Icon(UniconsLine.setting), icon: Icon(UniconsLine.setting),
screen: ScreenSettings(), screen: ScreenSettings(),
displayBottomNavBar: false,
); );
static const indexAbout = 2; static const indexAbout = 2;
static const screenAbout = ScreenItem( static const screenAbout = ScreenItem(
code: 'screen_about',
icon: Icon(UniconsLine.info_circle), icon: Icon(UniconsLine.info_circle),
screen: ScreenAbout(), screen: ScreenAbout(),
displayBottomNavBar: false,
); );
static Map<int, ScreenItem> items = { static Map<int, ScreenItem> items = {
...@@ -52,10 +52,4 @@ class Screen { ...@@ -52,10 +52,4 @@ class Screen {
static Widget getWidget(int screenIndex) { static Widget getWidget(int screenIndex) {
return items[screenIndex]?.screen ?? screenActivity.screen; return items[screenIndex]?.screen ?? screenActivity.screen;
} }
static bool displayBottomNavBar(int screenIndex) {
return items[screenIndex]?.displayBottomNavBar ?? screenActivity.displayBottomNavBar;
}
static int itemsCount = Screen.items.length;
} }
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/activity_page.dart'; import 'package:plotter/common/config/activity_page.dart';
class NavCubitPage extends HydratedCubit<int> { class NavCubitPage extends HydratedCubit<int> {
NavCubitPage() : super(0); NavCubitPage() : super(0);
...@@ -13,6 +13,10 @@ class NavCubitPage extends HydratedCubit<int> { ...@@ -13,6 +13,10 @@ class NavCubitPage extends HydratedCubit<int> {
} }
} }
void goToPageHome() {
updateIndex(ActivityPage.indexHome);
}
@override @override
int fromJson(Map<String, dynamic> json) { int fromJson(Map<String, dynamic> json) {
return ActivityPage.indexHome; return ActivityPage.indexHome;
...@@ -20,6 +24,6 @@ class NavCubitPage extends HydratedCubit<int> { ...@@ -20,6 +24,6 @@ class NavCubitPage extends HydratedCubit<int> {
@override @override
Map<String, dynamic>? toJson(int state) { Map<String, dynamic>? toJson(int state) {
return <String, int>{'pageIndex': state}; return <String, int>{'index': state};
} }
} }
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/screen.dart'; import 'package:plotter/common/config/screen.dart';
class NavCubitScreen extends HydratedCubit<int> { class NavCubitScreen extends HydratedCubit<int> {
NavCubitScreen() : super(0); NavCubitScreen() : super(0);
...@@ -9,19 +9,19 @@ class NavCubitScreen extends HydratedCubit<int> { ...@@ -9,19 +9,19 @@ class NavCubitScreen extends HydratedCubit<int> {
if (Screen.isIndexAllowed(index)) { if (Screen.isIndexAllowed(index)) {
emit(index); emit(index);
} else { } else {
goToActivityPage(); goToScreenActivity();
} }
} }
void goToActivityPage() { void goToScreenActivity() {
emit(Screen.indexActivity); emit(Screen.indexActivity);
} }
void goToSettingsPage() { void goToScreenSettings() {
emit(Screen.indexSettings); emit(Screen.indexSettings);
} }
void goToAboutPage() { void goToScreenAbout() {
emit(Screen.indexAbout); emit(Screen.indexAbout);
} }
...@@ -32,6 +32,6 @@ class NavCubitScreen extends HydratedCubit<int> { ...@@ -32,6 +32,6 @@ class NavCubitScreen extends HydratedCubit<int> {
@override @override
Map<String, dynamic>? toJson(int state) { Map<String, dynamic>? toJson(int state) {
return <String, int>{'screenIndex': state}; return <String, int>{'index': state};
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/activity_page.dart'; import 'package:plotter/common/config/activity_page.dart';
import 'package:plotter/cubit/nav_cubit_pages.dart'; import 'package:plotter/common/cubit/nav/nav_cubit_pages.dart';
class BottomNavBar extends StatelessWidget { class BottomNavBar extends StatelessWidget {
const BottomNavBar({super.key}); const BottomNavBar({super.key});
...@@ -21,16 +21,14 @@ class BottomNavBar extends StatelessWidget { ...@@ -21,16 +21,14 @@ class BottomNavBar extends StatelessWidget {
), ),
), ),
child: BlocBuilder<NavCubitPage, int>(builder: (BuildContext context, int state) { child: BlocBuilder<NavCubitPage, int>(builder: (BuildContext context, int state) {
final List<ActivityPageItem> pageItems = [ final List<BottomNavigationBarItem> items = [];
ActivityPage.pageHome,
ActivityPage.pageRemoteControl, ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) {
]; items.add(BottomNavigationBarItem(
final List<BottomNavigationBarItem> items = pageItems.map((ActivityPageItem item) {
return BottomNavigationBarItem(
icon: item.icon, icon: item.icon,
label: tr(item.code), label: tr(item.code),
); ));
}).toList(); });
return BottomNavigationBar( return BottomNavigationBar(
currentIndex: state, currentIndex: state,
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/common/config/screen.dart';
import 'package:plotter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:plotter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart';
class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
const GlobalAppBar({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
return BlocBuilder<NavCubitScreen, int>(
builder: (BuildContext context, int pageIndex) {
final Activity currentActivity = activityState.currentActivity;
final List<Widget> menuActions = [];
if (currentActivity.isRunning) {
menuActions.add(StyledButton(
color: Colors.red,
onPressed: () {},
onLongPress: () {
BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
child: const Image(
image: AssetImage('assets/ui/button_back.png'),
fit: BoxFit.fill,
),
));
} else {
if (pageIndex == Screen.indexActivity) {
// go to Settings page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenSettings();
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
),
child: Screen.screenSettings.icon,
));
// go to About page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenAbout();
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
),
child: Screen.screenAbout.icon,
));
} else {
// back to Home page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToScreenActivity();
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
),
child: Screen.screenActivity.icon,
));
}
}
return AppBar(
title: const AppHeader(text: 'app_name'),
actions: menuActions,
);
},
);
},
);
}
@override
Size get preferredSize => const Size.fromHeight(50);
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
class PageHome extends StatelessWidget { class PageHome extends StatelessWidget {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
class PagePlayer extends StatelessWidget { class PagePlayer extends StatelessWidget {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
import 'package:plotter/ui/widgets/keyboard.dart'; import 'package:plotter/ui/widgets/keyboard.dart';
import 'package:plotter/utils/api.dart'; import 'package:plotter/utils/api.dart';
......
File moved
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/activity_page.dart'; import 'package:plotter/common/config/activity_page.dart';
import 'package:plotter/cubit/nav_cubit_pages.dart'; import 'package:plotter/common/cubit/nav/nav_cubit_pages.dart';
class ScreenActivity extends StatelessWidget { class ScreenActivity extends StatelessWidget {
const ScreenActivity({super.key}); const ScreenActivity({super.key});
...@@ -11,7 +11,7 @@ class ScreenActivity extends StatelessWidget { ...@@ -11,7 +11,7 @@ class ScreenActivity extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<NavCubitPage, int>( return BlocBuilder<NavCubitPage, int>(
builder: (BuildContext context, int pageIndex) { builder: (BuildContext context, int pageIndex) {
return ActivityPage.getPageWidget(pageIndex); return ActivityPage.getWidget(pageIndex);
}, },
); );
} }
......
File moved
class ApplicationConfig {
static const String appTitle = 'Stepper plotter assistant';
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class DefaultActivitySettings {
// available game parameters codes
static const String parameterCodePlotterType = 'plotterType';
static const List<String> availableParameters = [
parameterCodePlotterType,
];
// plotter type: available values
static const String plotterTypeNone = 'none';
static const String plotterTypeRadial = 'radial';
static const String plotterTypeAxial = 'axial';
static const List<String> allowedPlotterTypeValues = [
plotterTypeNone,
plotterTypeRadial,
plotterTypeAxial,
];
// items count: default value
static const String defaultPlotterTypeValue = plotterTypeNone;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodePlotterType:
return DefaultActivitySettings.allowedPlotterTypeValues;
}
printlog('Did not find any available value for game parameter "$parameterCode".');
return [];
}
}
File moved
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment