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

Use ActivityParameters widgets from flutter_custom_toolbox

parent 2686ba74
No related branches found
No related tags found
1 merge request!18Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7061 passed
This commit is part of merge request !18. Comments created here will be created in the context of that merge request.
Showing
with 92 additions and 326 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
......@@ -3,16 +3,18 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/common/ui/pages/playlist.dart';
import 'package:spotifyplaylistgenerator/common/ui/pages/home.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/models/activity/activity.dart';
class ActivityPageItem {
final String code;
final Icon icon;
final Widget page;
final Widget Function({required Activity currentActivity})? builder;
const ActivityPageItem({
required this.code,
required this.icon,
required this.page,
required this.builder,
});
}
......@@ -20,20 +22,24 @@ class ActivityPage {
static const bool displayBottomNavBar = true;
static const indexHome = 0;
static const pageHome = ActivityPageItem(
static final ActivityPageItem pageHome = ActivityPageItem(
code: 'page_home',
icon: Icon(UniconsLine.home),
page: PageHome(),
builder: ({required Activity currentActivity}) {
return PageHome();
},
);
static const indexPlaylist = 1;
static const pagePlaylist = ActivityPageItem(
static final ActivityPageItem pagePlaylist = ActivityPageItem(
code: 'page_playlist',
icon: Icon(UniconsLine.list_ul),
page: PagePlaylist(),
builder: ({required Activity currentActivity}) {
return PagePlaylist();
},
);
static const Map<int, ActivityPageItem> items = {
static final Map<int, ActivityPageItem> items = {
indexHome: pageHome,
indexPlaylist: pagePlaylist,
};
......@@ -45,6 +51,16 @@ class ActivityPage {
}
static Widget getWidget(int pageIndex) {
return items[pageIndex]?.page ?? pageHome.page;
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
if (items.keys.contains(pageIndex)) {
return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups');
} else {
return getWidget(defaultPageIndex);
}
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_pages.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
class ApplicationConfig {
static const String appTitle = 'Spotify playlist generator';
static const String parameterCodePlaylistType = 'playlist-type';
static const String playlistTypeArtists = 'artists';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Spotify playlist generator',
activitySettings: [
// layout
ApplicationSettingsParameter(
code: parameterCodePlaylistType,
values: [
ApplicationSettingsParameterItemValue(
value: playlistTypeArtists,
isDefault: true,
),
],
),
],
startNewActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
deleteCurrentActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
resumeActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
);
}
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_custom_toolbox/flutter_toolbox.dart';
class DefaultGlobalSettings {
// available global parameters codes
static const String parameterCodeSkin = 'skin';
static const List<String> availableParameters = [
parameterCodeSkin,
];
// skin: available values
static const String skinValueDefault = 'default';
static const List<String> allowedSkinValues = [
skinValueDefault,
];
// skin: default value
static const String defaultSkinValue = skinValueDefault;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeSkin:
return DefaultGlobalSettings.allowedSkinValues;
}
printlog('Did not find any available value for global parameter "$parameterCode".');
return [];
}
}
......@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/models/activity/activity.dart';
import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart';
part 'activity_state.dart';
......@@ -21,7 +20,7 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
void refresh() {
final Activity activity = Activity(
// Settings
globalSettings: state.currentActivity.globalSettings,
activitySettings: state.currentActivity.activitySettings,
// State
isConnected: state.currentActivity.isConnected,
// Base data
......@@ -34,12 +33,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
updateState(activity);
}
void startNewActivity({
required GlobalSettings globalSettings,
}) {
void startNewActivity(BuildContext context) {
final ActivitySettingsCubit activitySettingsCubit =
BlocProvider.of<ActivitySettingsCubit>(context);
final Activity newActivity = Activity.createNew(
// Settings
globalSettings: globalSettings,
activitySettings: activitySettingsCubit.state.settings,
);
newActivity.dump();
......@@ -48,6 +48,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh();
}
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() {
state.currentActivity.isConnected = false;
refresh();
......
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,
];
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/default_global_settings.dart';
import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart';
part 'settings_global_state.dart';
class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> {
GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault()));
void setValues({
String? skin,
}) {
emit(
GlobalSettingsState(
settings: GlobalSettings(
skin: skin ?? state.settings.skin,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultGlobalSettings.parameterCodeSkin:
return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin);
}
return '';
}
void setParameterValue(String code, String value) {
final String skin = (code == DefaultGlobalSettings.parameterCodeSkin)
? value
: getParameterValue(DefaultGlobalSettings.parameterCodeSkin);
setValues(
skin: skin,
);
}
@override
GlobalSettingsState? fromJson(Map<String, dynamic> json) {
final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String;
return GlobalSettingsState(
settings: GlobalSettings(
skin: skin,
),
);
}
@override
Map<String, dynamic>? toJson(GlobalSettingsState state) {
return <String, dynamic>{
DefaultGlobalSettings.parameterCodeSkin: state.settings.skin,
};
}
}
part of 'settings_global_cubit.dart';
@immutable
class GlobalSettingsState extends Equatable {
const GlobalSettingsState({
required this.settings,
});
final GlobalSettings settings;
@override
List<dynamic> get props => <dynamic>[
settings,
];
}
......@@ -9,8 +9,6 @@ import 'package:spotifyplaylistgenerator/common/cubit/nav/nav_cubit_screens.dart
import 'package:spotifyplaylistgenerator/config/application_config.dart';
import 'package:spotifyplaylistgenerator/cubit/activity/activity_cubit.dart';
import 'package:spotifyplaylistgenerator/cubit/settings/settings_activity_cubit.dart';
import 'package:spotifyplaylistgenerator/cubit/settings/settings_global_cubit.dart';
import 'package:spotifyplaylistgenerator/ui/skeleton.dart';
void main() async {
......@@ -56,17 +54,14 @@ class MyApp extends StatelessWidget {
BlocProvider<ActivityCubit>(
create: (context) => ActivityCubit(),
),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(),
create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config),
),
],
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp(
title: ApplicationConfig.appTitle,
title: ApplicationConfig.config.appTitle,
home: const SkeletonScreen(),
// Theme stuff
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/models/settings/settings_global.dart';
import 'package:spotifyplaylistgenerator/config/application_config.dart';
class Activity {
Activity({
// Settings
required this.globalSettings,
required this.activitySettings,
// State
this.isConnected = false,
......@@ -18,7 +18,7 @@ class Activity {
});
// Settings
final GlobalSettings globalSettings;
final ActivitySettings activitySettings;
// State
bool isConnected;
......@@ -32,20 +32,21 @@ class Activity {
factory Activity.createNull() {
return Activity(
// Settings
globalSettings: GlobalSettings.createDefault(),
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
userId: '',
);
}
factory Activity.createNew({
GlobalSettings? globalSettings,
ActivitySettings? activitySettings,
}) {
final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
final ActivitySettings newActivitySettings = activitySettings ??
ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
return Activity(
// Settings
globalSettings: newGlobalSettings,
activitySettings: newActivitySettings,
// State
isConnected: false,
// Base data
......@@ -53,13 +54,15 @@ class Activity {
);
}
bool get canBeResumed => true;
void dump() {
printlog('');
printlog('## Current activity dump:');
printlog('');
printlog('$Activity:');
printlog(' Settings');
globalSettings.dump();
activitySettings.dump();
printlog(' State');
printlog(' isConnected: $isConnected');
printlog(' Base data');
......@@ -77,7 +80,7 @@ class Activity {
Map<String, dynamic>? toJson() {
return <String, dynamic>{
// Settings
'globalSettings': globalSettings.toJson(),
'activitySettings': activitySettings.toJson(),
// State
'isConnected': isConnected,
// Base data
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/default_activity_settings.dart';
class ActivitySettings {
final String layout;
ActivitySettings({
required this.layout,
});
static String getLayoutValueFromUnsafe(String layout) {
if (DefaultActivitySettings.allowedLayoutValues.contains(layout)) {
return layout;
}
return DefaultActivitySettings.defaultLayoutValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
layout: DefaultActivitySettings.defaultLayoutValue,
);
}
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeLayout}: $layout');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeLayout: layout,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:spotifyplaylistgenerator/config/default_global_settings.dart';
class GlobalSettings {
String skin;
GlobalSettings({
required this.skin,
});
static String getSkinValueFromUnsafe(String skin) {
if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) {
return skin;
}
return DefaultGlobalSettings.defaultSkinValue;
}
factory GlobalSettings.createDefault() {
return GlobalSettings(
skin: DefaultGlobalSettings.defaultSkinValue,
);
}
void dump() {
printlog('$GlobalSettings:');
printlog(' ${DefaultGlobalSettings.parameterCodeSkin}: $skin');
printlog('');
}
@override
String toString() {
return '$GlobalSettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultGlobalSettings.parameterCodeSkin: skin,
};
}
}
......@@ -122,11 +122,11 @@ packages:
dependency: "direct main"
description:
path: "."
ref: "0.4.0"
resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8
ref: "0.5.0"
resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7
url: "https://git.harrault.fr/android/flutter-toolbox.git"
source: git
version: "0.4.0"
version: "0.5.0"
flutter_lints:
dependency: "direct dev"
description:
......
......@@ -3,7 +3,7 @@ description: Create and manage Spotify playlists
publish_to: "none"
version: 0.3.2+15
version: 0.4.0+16
environment:
sdk: "^3.0.0"
......@@ -16,7 +16,7 @@ dependencies:
flutter_custom_toolbox:
git:
url: https://git.harrault.fr/android/flutter-toolbox.git
ref: 0.4.0
ref: 0.5.0
# specific
http: ^1.1.0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment