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

Merge branch '16-normalize-activity-application-architecture' into 'master'

Resolve "Normalize Activity application architecture"

Closes #16

See merge request !15
parents 0ce47c59 960b9cd2
No related branches found
No related tags found
1 merge request!15Resolve "Normalize Activity application architecture"
Pipeline #6790 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