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

Normalize Activity application architecture

parent 0ce47c59
No related branches found
No related tags found
1 merge request!15Resolve "Normalize Activity application architecture"
Pipeline #6688 passed
Showing
with 237 additions and 49 deletions
Normalize Activity application architecture.
Harmonisation des applications en Activity.
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/ui/pages/playlist.dart';
import 'package:spotifyplaylistgenerator/ui/pages/home.dart';
import 'package:spotifyplaylistgenerator/common/ui/pages/playlist.dart';
import 'package:spotifyplaylistgenerator/common/ui/pages/home.dart';
class ActivityPageItem {
final String code;
final Icon icon;
final Widget page;
final String code;
const ActivityPageItem({
required this.code,
required this.icon,
required this.page,
required this.code,
});
}
class ActivityPage {
static const bool displayBottomNavBar = true;
static const indexHome = 0;
static const pageHome = ActivityPageItem(
code: 'page_home',
icon: Icon(UniconsLine.home),
page: PageHome(),
code: 'page_home',
);
static const indexPlaylist = 1;
static const pagePlaylist = ActivityPageItem(
code: 'page_playlist',
icon: Icon(UniconsLine.list_ul),
page: PagePlaylist(),
code: 'page_playlist',
);
static Map<int, ActivityPageItem> items = {
static const Map<int, ActivityPageItem> items = {
indexHome: pageHome,
indexPlaylist: pagePlaylist,
};
static int defaultPageIndex = indexHome;
static bool isIndexAllowed(int pageIndex) {
return items.keys.contains(pageIndex);
}
static ActivityPageItem getPageItem(int pageIndex) {
return items[pageIndex] ?? pageHome;
}
static Widget getPageWidget(int pageIndex) {
static Widget getWidget(int pageIndex) {
return items[pageIndex]?.page ?? pageHome.page;
}
static int itemsCount = ActivityPage.items.length;
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/ui/screens/about.dart';
import 'package:spotifyplaylistgenerator/ui/screens/activity.dart';
import 'package:spotifyplaylistgenerator/ui/screens/settings.dart';
import 'package:spotifyplaylistgenerator/common/ui/screens/about.dart';
import 'package:spotifyplaylistgenerator/common/ui/screens/activity.dart';
import 'package:spotifyplaylistgenerator/common/ui/screens/settings.dart';
class ScreenItem {
final String code;
final Icon icon;
final Widget screen;
final bool displayBottomNavBar;
const ScreenItem({
required this.code,
required this.icon,
required this.screen,
required this.displayBottomNavBar,
});
}
class Screen {
static const indexActivity = 0;
static const screenActivity = ScreenItem(
code: 'screen_activity',
icon: Icon(UniconsLine.home),
screen: ScreenActivity(),
displayBottomNavBar: true,
);
static const indexSettings = 1;
static const screenSettings = ScreenItem(
code: 'screen_settings',
icon: Icon(UniconsLine.setting),
screen: ScreenSettings(),
displayBottomNavBar: false,
);
static const indexAbout = 2;
static const screenAbout = ScreenItem(
code: 'screen_about',
icon: Icon(UniconsLine.info_circle),
screen: ScreenAbout(),
displayBottomNavBar: false,
);
static Map<int, ScreenItem> items = {
......@@ -53,9 +53,5 @@ class 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:spotifyplaylistgenerator/config/activity_page.dart';
import 'package:spotifyplaylistgenerator/common/config/activity_page.dart';
class NavCubitPage extends HydratedCubit<int> {
NavCubitPage() : super(0);
......@@ -13,6 +13,10 @@ class NavCubitPage extends HydratedCubit<int> {
}
}
void goToPageHome() {
updateIndex(ActivityPage.indexHome);
}
@override
int fromJson(Map<String, dynamic> json) {
return ActivityPage.indexHome;
......@@ -20,6 +24,6 @@ class NavCubitPage extends HydratedCubit<int> {
@override
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:spotifyplaylistgenerator/config/screen.dart';
import 'package:spotifyplaylistgenerator/common/config/screen.dart';
class NavCubitScreen extends HydratedCubit<int> {
NavCubitScreen() : super(0);
......@@ -9,19 +9,19 @@ class NavCubitScreen extends HydratedCubit<int> {
if (Screen.isIndexAllowed(index)) {
emit(index);
} else {
goToActivityPage();
goToScreenActivity();
}
}
void goToActivityPage() {
void goToScreenActivity() {
emit(Screen.indexActivity);
}
void goToSettingsPage() {
void goToScreenSettings() {
emit(Screen.indexSettings);
}
void goToAboutPage() {
void goToScreenAbout() {
emit(Screen.indexAbout);
}
......@@ -32,6 +32,6 @@ class NavCubitScreen extends HydratedCubit<int> {
@override
Map<String, dynamic>? toJson(int state) {
return <String, int>{'screenIndex': state};
return <String, int>{'index': state};
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/activity_page.dart';
import 'package:spotifyplaylistgenerator/cubit/nav_cubit_pages.dart';
import 'package:spotifyplaylistgenerator/common/config/activity_page.dart';
import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_pages.dart';
class BottomNavBar extends StatelessWidget {
const BottomNavBar({super.key});
......@@ -21,16 +21,14 @@ class BottomNavBar extends StatelessWidget {
),
),
child: BlocBuilder<NavCubitPage, int>(builder: (BuildContext context, int state) {
final List<ActivityPageItem> pageItems = [
ActivityPage.pageHome,
ActivityPage.pagePlaylist,
];
final List<BottomNavigationBarItem> items = pageItems.map((ActivityPageItem item) {
return BottomNavigationBarItem(
final List<BottomNavigationBarItem> items = [];
ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) {
items.add(BottomNavigationBarItem(
icon: item.icon,
label: tr(item.code),
);
}).toList();
));
});
return BottomNavigationBar(
currentIndex: state,
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/common/config/screen.dart';
import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_pages.dart';
import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_screens.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/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.isConnected) {
menuActions.add(StyledButton(
color: Colors.red,
onPressed: () {},
onLongPress: () {
BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
child: Screen.screenSettings.icon,
));
} 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_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/cubit/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/models/activity/activity.dart';
class PageHome extends StatelessWidget {
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/cubit/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/models/activity/activity.dart';
class PagePlaylist extends StatelessWidget {
......
File moved
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/activity_page.dart';
import 'package:spotifyplaylistgenerator/cubit/nav_cubit_pages.dart';
import 'package:spotifyplaylistgenerator/common/config/activity_page.dart';
import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_pages.dart';
class ScreenActivity extends StatelessWidget {
const ScreenActivity({super.key});
......@@ -11,7 +11,7 @@ class ScreenActivity extends StatelessWidget {
Widget build(BuildContext context) {
return BlocBuilder<NavCubitPage, int>(
builder: (BuildContext context, int pageIndex) {
return ActivityPage.getPageWidget(pageIndex);
return ActivityPage.getWidget(pageIndex);
},
);
}
......
File moved
class ApplicationConfig {
static const String appTitle = 'Spotify playlist generator';
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class DefaultActivitySettings {
// available game parameters codes
static const String parameterCodeLayout = 'layout';
static const List<String> availableParameters = [
parameterCodeLayout,
];
// layout: available values
static const String layoutValueFrench = 'default';
static const List<String> allowedLayoutValues = [
layoutValueFrench,
];
// layout: default value
static const String defaultLayoutValue = layoutValueFrench;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeLayout:
return DefaultActivitySettings.allowedLayoutValues;
}
printlog('Did not find any available value for game parameter "$parameterCode".');
return [];
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/default_activity_settings.dart';
import 'package:spotifyplaylistgenerator/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? layout,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
layout: layout ?? state.settings.layout,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeLayout:
return ActivitySettings.getLayoutValueFromUnsafe(state.settings.layout);
}
return '';
}
void setParameterValue(String code, String value) {
final String layout = code == DefaultActivitySettings.parameterCodeLayout
? value
: getParameterValue(DefaultActivitySettings.parameterCodeLayout);
setValues(
layout: layout,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String layout = json[DefaultActivitySettings.parameterCodeLayout] as String;
return ActivitySettingsState(
settings: ActivitySettings(
layout: layout,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeLayout: state.settings.layout,
};
}
}
part of 'settings_activity_cubit.dart';
@immutable
class ActivitySettingsState extends Equatable {
const ActivitySettingsState({
required this.settings,
});
final ActivitySettings settings;
@override
List<dynamic> get props => <dynamic>[
settings,
];
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment