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

Merge branch '22-use-activityparameters-widgets-from-flutter_custom_toolbox' into 'master'

Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"

Closes #22

See merge request !19
parents 12b67c59 8f0b5609
No related branches found
No related tags found
1 merge request!19Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7135 passed
Showing
with 109 additions and 356 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
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:midisynth/cubit/activity/activity_cubit.dart';
import 'package:midisynth/models/activity/activity.dart';
import 'package:midisynth/common/ui/pages/editor.dart'; import 'package:midisynth/ui/pages/editor.dart';
import 'package:midisynth/common/ui/pages/home.dart'; import 'package:midisynth/ui/pages/home.dart';
import 'package:midisynth/common/ui/pages/player.dart'; import 'package:midisynth/ui/pages/player.dart';
class ActivityPageItem { class ActivityPageItem {
final String code; final String code;
final Icon icon; final Icon icon;
final Widget page; final Widget Function({required Activity currentActivity})? builder;
const ActivityPageItem({ const ActivityPageItem({
required this.code, required this.code,
required this.icon, required this.icon,
required this.page, required this.builder,
}); });
} }
...@@ -21,27 +23,33 @@ class ActivityPage { ...@@ -21,27 +23,33 @@ class ActivityPage {
static const bool displayBottomNavBar = true; static const bool displayBottomNavBar = true;
static const indexHome = 0; static const indexHome = 0;
static const pageHome = ActivityPageItem( static final pageHome = ActivityPageItem(
code: 'page_home', code: 'page_home',
icon: Icon(UniconsLine.home), icon: Icon(UniconsLine.home),
page: PageHome(), builder: ({required Activity currentActivity}) {
return PageHome();
},
); );
static const indexEditor = 1; static const indexEditor = 1;
static const pageEditor = ActivityPageItem( static final pageEditor = ActivityPageItem(
code: 'page_editor', code: 'page_editor',
icon: Icon(UniconsLine.edit), icon: Icon(UniconsLine.edit),
page: PageEditor(), builder: ({required Activity currentActivity}) {
return PageEditor();
},
); );
static const indexPlayer = 2; static const indexPlayer = 2;
static const pagePlayer = ActivityPageItem( static final pagePlayer = ActivityPageItem(
code: 'page_player', code: 'page_player',
icon: Icon(UniconsLine.play), icon: Icon(UniconsLine.play),
page: PagePlayer(), builder: ({required Activity currentActivity}) {
return PagePlayer();
},
); );
static const Map<int, ActivityPageItem> items = { static final Map<int, ActivityPageItem> items = {
indexHome: pageHome, indexHome: pageHome,
indexEditor: pageEditor, indexEditor: pageEditor,
indexPlayer: pagePlayer, indexPlayer: pagePlayer,
...@@ -54,6 +62,16 @@ class ActivityPage { ...@@ -54,6 +62,16 @@ class ActivityPage {
} }
static Widget getWidget(int pageIndex) { 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);
}
},
);
} }
} }
...@@ -17,6 +17,10 @@ class NavCubitPage extends HydratedCubit<int> { ...@@ -17,6 +17,10 @@ class NavCubitPage extends HydratedCubit<int> {
updateIndex(ActivityPage.indexHome); updateIndex(ActivityPage.indexHome);
} }
void goToPageEditor() {
updateIndex(ActivityPage.indexEditor);
}
@override @override
int fromJson(Map<String, dynamic> json) { int fromJson(Map<String, dynamic> json) {
return ActivityPage.indexHome; return ActivityPage.indexHome;
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/common/cubit/nav/nav_cubit_pages.dart';
import 'package:midisynth/cubit/activity/activity_cubit.dart';
class ApplicationConfig { class ApplicationConfig {
static const String appTitle = 'MIDI Synth'; // sequence length
static const String parameterCodeSequenceLength = 'sequenceLength';
static const String sequenceLengthValueShort = 'short';
static const String sequenceLengthValueMedium = 'medium';
static const String sequenceLengthValueLong = 'long';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'MIDI Synth',
activitySettings: [
// sequence length
ApplicationSettingsParameter(
code: parameterCodeSequenceLength,
values: [
ApplicationSettingsParameterItemValue(
value: sequenceLengthValueShort,
),
ApplicationSettingsParameterItemValue(
value: sequenceLengthValueMedium,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: sequenceLengthValueLong,
),
],
intValueGetter: (value) {
const Map<String, int> intValues = {
sequenceLengthValueShort: 8,
sequenceLengthValueMedium: 16,
sequenceLengthValueLong: 32,
};
return intValues[parameterCodeSequenceLength] ?? 0;
},
),
],
startNewActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
BlocProvider.of<NavCubitPage>(context).goToPageEditor();
},
deleteCurrentActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
resumeActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageEditor();
},
);
} }
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class DefaultActivitySettings {
// available activity parameters codes
static const String parameterCodeSequenceLength = 'sequenceLength';
static const List<String> availableParameters = [
parameterCodeSequenceLength,
];
// items count: available values
static const String sequenceLengthValueShort = 'short';
static const String sequenceLengthValueMedium = 'medium';
static const String sequenceLengthValueLong = 'long';
static const List<String> allowedSequenceLengthValues = [
sequenceLengthValueShort,
sequenceLengthValueMedium,
sequenceLengthValueLong,
];
// items count: default value
static const String defaultSequenceLengthValue = sequenceLengthValueMedium;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeSequenceLength:
return DefaultActivitySettings.allowedSequenceLengthValues;
}
printlog('Did not find any available value for activity parameter "$parameterCode".');
return [];
}
static int getSequenceLengthFromParameterValueCode(String parameterLevel) {
const Map<String, int> values = {
sequenceLengthValueShort: 8,
sequenceLengthValueMedium: 16,
sequenceLengthValueLong: 32,
};
return values[parameterLevel] ??
getSequenceLengthFromParameterValueCode(
DefaultActivitySettings.defaultSequenceLengthValue);
}
}
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,8 +2,6 @@ import 'package:flutter/material.dart'; ...@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/models/activity/activity.dart'; import 'package:midisynth/models/activity/activity.dart';
import 'package:midisynth/models/settings/settings_activity.dart';
import 'package:midisynth/models/settings/settings_global.dart';
part 'activity_state.dart'; part 'activity_state.dart';
...@@ -23,7 +21,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -23,7 +21,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
final Activity activity = Activity( final Activity activity = Activity(
// Settings // Settings
activitySettings: state.currentActivity.activitySettings, activitySettings: state.currentActivity.activitySettings,
globalSettings: state.currentActivity.globalSettings,
// State // State
isRunning: state.currentActivity.isRunning, isRunning: state.currentActivity.isRunning,
isStarted: state.currentActivity.isStarted, isStarted: state.currentActivity.isStarted,
...@@ -39,14 +36,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -39,14 +36,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
updateState(activity); updateState(activity);
} }
void startNewActivity({ void startNewActivity(BuildContext context) {
required ActivitySettings activitySettings, final ActivitySettingsCubit activitySettingsCubit =
required GlobalSettings globalSettings, BlocProvider.of<ActivitySettingsCubit>(context);
}) {
final Activity newActivity = Activity.createNew( final Activity newActivity = Activity.createNew(
// Settings // Settings
activitySettings: activitySettings, activitySettings: activitySettingsCubit.state.settings,
globalSettings: globalSettings,
); );
newActivity.dump(); newActivity.dump();
...@@ -55,6 +51,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -55,6 +51,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh(); refresh();
} }
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() { void quitActivity() {
state.currentActivity.isRunning = false; state.currentActivity.isRunning = false;
refresh(); refresh();
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/config/default_activity_settings.dart';
import 'package:midisynth/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? sequenceLength,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
sequenceLength: sequenceLength ?? state.settings.sequenceLength,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeSequenceLength:
return ActivitySettings.getSequenceLengthValueFromUnsafe(
state.settings.sequenceLength);
}
return '';
}
void setParameterValue(String code, String value) {
final String sequenceLength = code == DefaultActivitySettings.parameterCodeSequenceLength
? value
: getParameterValue(DefaultActivitySettings.parameterCodeSequenceLength);
setValues(
sequenceLength: sequenceLength,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String sequenceLength =
json[DefaultActivitySettings.parameterCodeSequenceLength] as String;
return ActivitySettingsState(
settings: ActivitySettings(
sequenceLength: sequenceLength,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeSequenceLength: state.settings.sequenceLength,
};
}
}
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:midisynth/config/default_global_settings.dart';
import 'package:midisynth/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:midisynth/common/cubit/nav/nav_cubit_screens.dart'; ...@@ -9,8 +9,6 @@ import 'package:midisynth/common/cubit/nav/nav_cubit_screens.dart';
import 'package:midisynth/config/application_config.dart'; import 'package:midisynth/config/application_config.dart';
import 'package:midisynth/cubit/activity/activity_cubit.dart'; import 'package:midisynth/cubit/activity/activity_cubit.dart';
import 'package:midisynth/cubit/settings/settings_activity_cubit.dart';
import 'package:midisynth/cubit/settings/settings_global_cubit.dart';
import 'package:midisynth/ui/skeleton.dart'; import 'package:midisynth/ui/skeleton.dart';
void main() async { void main() async {
...@@ -56,17 +54,14 @@ class MyApp extends StatelessWidget { ...@@ -56,17 +54,14 @@ class MyApp extends StatelessWidget {
BlocProvider<ActivityCubit>( BlocProvider<ActivityCubit>(
create: (context) => ActivityCubit(), create: (context) => ActivityCubit(),
), ),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>( BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(), create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config),
), ),
], ],
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) { builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp( return MaterialApp(
title: ApplicationConfig.appTitle, title: ApplicationConfig.config.appTitle,
home: const SkeletonScreen(), home: const SkeletonScreen(),
// Theme stuff // Theme stuff
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/config/application_config.dart';
import 'package:midisynth/models/data/note.dart'; import 'package:midisynth/models/data/note.dart';
import 'package:midisynth/models/settings/settings_activity.dart';
import 'package:midisynth/models/settings/settings_global.dart';
class Activity { class Activity {
Activity({ Activity({
// Settings // Settings
required this.activitySettings, required this.activitySettings,
required this.globalSettings,
// State // State
this.isRunning = false, this.isRunning = false,
...@@ -25,7 +24,6 @@ class Activity { ...@@ -25,7 +24,6 @@ class Activity {
// Settings // Settings
final ActivitySettings activitySettings; final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
// State // State
bool isRunning; bool isRunning;
...@@ -42,8 +40,7 @@ class Activity { ...@@ -42,8 +40,7 @@ class Activity {
factory Activity.createNull() { factory Activity.createNull() {
return Activity( return Activity(
// Settings // Settings
activitySettings: ActivitySettings.createDefault(), activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
globalSettings: GlobalSettings.createDefault(),
// Base data // Base data
notes: [], notes: [],
); );
...@@ -51,16 +48,13 @@ class Activity { ...@@ -51,16 +48,13 @@ class Activity {
factory Activity.createNew({ factory Activity.createNew({
ActivitySettings? activitySettings, ActivitySettings? activitySettings,
GlobalSettings? globalSettings,
}) { }) {
final ActivitySettings newActivitySettings = final ActivitySettings newActivitySettings = activitySettings ??
activitySettings ?? ActivitySettings.createDefault(); ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
return Activity( return Activity(
// Settings // Settings
activitySettings: newActivitySettings, activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
// State // State
isRunning: true, isRunning: true,
// Base data // Base data
...@@ -77,7 +71,6 @@ class Activity { ...@@ -77,7 +71,6 @@ class Activity {
printlog('$Activity:'); printlog('$Activity:');
printlog(' Settings'); printlog(' Settings');
activitySettings.dump(); activitySettings.dump();
globalSettings.dump();
printlog(' State'); printlog(' State');
printlog(' isRunning: $isRunning'); printlog(' isRunning: $isRunning');
printlog(' isStarted: $isStarted'); printlog(' isStarted: $isStarted');
...@@ -99,7 +92,6 @@ class Activity { ...@@ -99,7 +92,6 @@ class Activity {
return <String, dynamic>{ return <String, dynamic>{
// Settings // Settings
'activitySettings': activitySettings.toJson(), 'activitySettings': activitySettings.toJson(),
'globalSettings': globalSettings.toJson(),
// State // State
'isRunning': isRunning, 'isRunning': isRunning,
'isStarted': isStarted, 'isStarted': isStarted,
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/config/default_activity_settings.dart';
class ActivitySettings {
final String sequenceLength;
ActivitySettings({
required this.sequenceLength,
});
// Getters to convert String to int
int get sequenceLengthValue => int.parse(sequenceLength);
static String getSequenceLengthValueFromUnsafe(String sequenceLength) {
if (DefaultActivitySettings.allowedSequenceLengthValues.contains(sequenceLength)) {
return sequenceLength;
}
return DefaultActivitySettings.defaultSequenceLengthValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
sequenceLength: DefaultActivitySettings.defaultSequenceLengthValue,
);
}
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeSequenceLength}: $sequenceLength');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeSequenceLength: sequenceLength,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:midisynth/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,
};
}
}
File moved
File moved
File moved
...@@ -122,11 +122,11 @@ packages: ...@@ -122,11 +122,11 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "0.4.0" ref: "0.5.0"
resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8 resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7
url: "https://git.harrault.fr/android/flutter-toolbox.git" url: "https://git.harrault.fr/android/flutter-toolbox.git"
source: git source: git
version: "0.4.0" version: "0.5.0"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
......
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