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
Branches
Tags Release_1.0.54_55
1 merge request!26Resolve "Normalize Activity application architecture"
Pipeline #6685 passed
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 [];
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment