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

Use ActivityParameters widgets from flutter_custom_toolbox

parent 72da20ff
No related branches found
No related tags found
1 merge request!29Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7058 passed
Showing
with 105 additions and 346 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
......@@ -5,15 +5,18 @@ import 'package:plotter/common/ui/pages/home.dart';
import 'package:plotter/common/ui/pages/player.dart';
import 'package:plotter/common/ui/pages/remote_control.dart';
import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/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,
});
}
......@@ -21,27 +24,33 @@ 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 indexPlayer = 1;
static const pagePlayer = ActivityPageItem(
static final ActivityPageItem pagePlayer = ActivityPageItem(
code: 'page_player',
icon: Icon(UniconsLine.star),
page: PagePlayer(),
builder: ({required Activity currentActivity}) {
return PagePlayer();
},
);
static const indexRemoteControl = 2;
static const pageRemoteControl = ActivityPageItem(
static final ActivityPageItem pageRemoteControl = ActivityPageItem(
code: 'page_remote_control',
icon: Icon(UniconsLine.star),
page: PageRemoteControl(),
builder: ({required Activity currentActivity}) {
return PageRemoteControl();
},
);
static const Map<int, ActivityPageItem> items = {
static final Map<int, ActivityPageItem> items = {
indexHome: pageHome,
indexPlayer: pagePlayer,
indexRemoteControl: pageRemoteControl,
......@@ -54,6 +63,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:plotter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:plotter/cubit/activity/activity_cubit.dart';
class ApplicationConfig {
static const String appTitle = 'Stepper plotter assistant';
// plotter type
static const String parameterCodePlotterType = 'plotterType';
static const String plotterTypeNone = 'none';
static const String plotterTypeRadial = 'radial';
static const String plotterTypeAxial = 'axial';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Stepper plotter assistant',
activitySettings: [
// plotter type
ApplicationSettingsParameter(
code: parameterCodePlotterType,
values: [
ApplicationSettingsParameterItemValue(
value: plotterTypeNone,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: plotterTypeRadial,
),
ApplicationSettingsParameterItemValue(
value: plotterTypeAxial,
),
],
),
],
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 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 [];
}
}
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:plotter/models/activity/activity.dart';
import 'package:plotter/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
isRunning: state.currentActivity.isRunning,
// 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.isRunning = false;
refresh();
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/default_activity_settings.dart';
import 'package:plotter/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? plotterType,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
plotterType: plotterType ?? state.settings.plotterType,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodePlotterType:
return ActivitySettings.getPlotterTypeValueFromUnsafe(state.settings.plotterType);
}
return '';
}
void setParameterValue(String code, String value) {
final String plotterType = code == DefaultActivitySettings.parameterCodePlotterType
? value
: getParameterValue(DefaultActivitySettings.parameterCodePlotterType);
setValues(
plotterType: plotterType,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String plotterType =
json[DefaultActivitySettings.parameterCodePlotterType] as String;
return ActivitySettingsState(
settings: ActivitySettings(
plotterType: plotterType,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodePlotterType: state.settings.plotterType,
};
}
}
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:plotter/config/default_global_settings.dart';
import 'package:plotter/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,
String? apiHost,
}) {
emit(
GlobalSettingsState(
settings: GlobalSettings(
skin: skin ?? state.settings.skin,
apiHost: apiHost ?? state.settings.apiHost,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultGlobalSettings.parameterCodeSkin:
return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin);
case 'apiHost':
return state.settings.apiHost;
}
return '';
}
void setParameterValue(String code, String value) {
final String skin = (code == DefaultGlobalSettings.parameterCodeSkin)
? value
: getParameterValue(DefaultGlobalSettings.parameterCodeSkin);
final String apiHost = (code == 'apiHost') ? value : getParameterValue('apiHost');
setValues(
skin: skin,
apiHost: apiHost,
);
}
@override
GlobalSettingsState? fromJson(Map<String, dynamic> json) {
final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String;
final String apiHost = json['apiHost'] as String;
return GlobalSettingsState(
settings: GlobalSettings(
skin: skin,
apiHost: apiHost,
),
);
}
@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:plotter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:plotter/config/application_config.dart';
import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/cubit/settings/settings_activity_cubit.dart';
import 'package:plotter/cubit/settings/settings_global_cubit.dart';
import 'package:plotter/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:plotter/models/settings/settings_global.dart';
import 'package:plotter/config/application_config.dart';
class Activity {
Activity({
// Settings
required this.globalSettings,
required this.activitySettings,
// State
this.isRunning = false,
......@@ -18,7 +18,7 @@ class Activity {
});
// Settings
final GlobalSettings globalSettings;
final ActivitySettings activitySettings;
// State
bool isRunning;
......@@ -32,20 +32,21 @@ class Activity {
factory Activity.createNull() {
return Activity(
// Settings
globalSettings: GlobalSettings.createDefault(),
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
apiHost: '',
);
}
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
isRunning: true,
// Base data
......@@ -53,13 +54,15 @@ class Activity {
);
}
bool get canBeResumed => false;
void dump() {
printlog('');
printlog('## Current activity dump:');
printlog('');
printlog('$Activity:');
printlog(' Settings');
globalSettings.dump();
activitySettings.dump();
printlog(' State');
printlog(' isRunning: $isRunning');
printlog(' Base data');
......@@ -77,7 +80,7 @@ class Activity {
Map<String, dynamic>? toJson() {
return <String, dynamic>{
// Settings
'globalSettings': globalSettings.toJson(),
'activitySettings': activitySettings.toJson(),
// State
'isRunning': isRunning,
// Base data
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/default_activity_settings.dart';
class ActivitySettings {
final String plotterType;
ActivitySettings({
required this.plotterType,
});
static String getPlotterTypeValueFromUnsafe(String plotterType) {
if (DefaultActivitySettings.allowedPlotterTypeValues.contains(plotterType)) {
return plotterType;
}
return DefaultActivitySettings.defaultPlotterTypeValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
plotterType: DefaultActivitySettings.defaultPlotterTypeValue,
);
}
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodePlotterType}: $plotterType');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodePlotterType: plotterType,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/default_global_settings.dart';
class GlobalSettings {
String skin;
String apiHost;
GlobalSettings({
required this.skin,
required this.apiHost,
});
static String getSkinValueFromUnsafe(String skin) {
if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) {
return skin;
}
return DefaultGlobalSettings.defaultSkinValue;
}
factory GlobalSettings.createDefault() {
return GlobalSettings(
skin: DefaultGlobalSettings.defaultSkinValue,
apiHost: '',
);
}
void dump() {
printlog('$GlobalSettings:');
printlog(' ${DefaultGlobalSettings.parameterCodeSkin}: $skin');
printlog(' apiHost: $apiHost');
printlog('');
}
@override
String toString() {
return '$GlobalSettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultGlobalSettings.parameterCodeSkin: skin,
'apiHost': apiHost,
};
}
}
......@@ -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: A plotter helper application.
publish_to: "none"
version: 0.3.2+26
version: 0.4.0+27
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.
Finish editing this message first!
Please register or to comment