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

Normalize Activity application architecture

parent 97ac7a37
No related branches found
No related tags found
1 merge request!26Resolve "Normalize Activity application architecture"
Pipeline #6685 passed
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,
];
}
...@@ -4,10 +4,13 @@ import 'package:flutter/material.dart'; ...@@ -4,10 +4,13 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/cubit/activity_cubit.dart'; import 'package:plotter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:plotter/cubit/nav_cubit_pages.dart'; import 'package:plotter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:plotter/cubit/nav_cubit_screens.dart';
import 'package:plotter/cubit/settings_global_cubit.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'; import 'package:plotter/ui/skeleton.dart';
void main() async { void main() async {
...@@ -40,17 +43,30 @@ class MyApp extends StatelessWidget { ...@@ -40,17 +43,30 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiBlocProvider( return MultiBlocProvider(
providers: [ providers: [
BlocProvider<NavCubitPage>(create: (context) => NavCubitPage()), // default providers
BlocProvider<NavCubitScreen>(create: (context) => NavCubitScreen()), BlocProvider<NavCubitPage>(
create: (context) => NavCubitPage(),
),
BlocProvider<NavCubitScreen>(
create: (context) => NavCubitScreen(),
),
BlocProvider<ApplicationThemeModeCubit>( BlocProvider<ApplicationThemeModeCubit>(
create: (context) => ApplicationThemeModeCubit()), create: (context) => ApplicationThemeModeCubit(),
BlocProvider<ActivityCubit>(create: (context) => ActivityCubit()), ),
BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()), BlocProvider<ActivityCubit>(
create: (context) => ActivityCubit(),
),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(),
),
], ],
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) { builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp( return MaterialApp(
title: 'Stepper plotter assistant', title: ApplicationConfig.appTitle,
home: const SkeletonScreen(), home: const SkeletonScreen(),
// Theme stuff // Theme stuff
......
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/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/screen.dart';
import 'package:plotter/cubit/activity_cubit.dart';
import 'package:plotter/cubit/nav_cubit_screens.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 screenIndex) {
final List<Widget> menuActions = [];
if (screenIndex == Screen.indexActivity) {
// go to Settings page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToSettingsPage();
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
),
child: Screen.screenSettings.icon,
));
// go to About page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToAboutPage();
},
style: ElevatedButton.styleFrom(
shape: const CircleBorder(),
),
child: Screen.screenAbout.icon,
));
} else {
// back to Home page
menuActions.add(ElevatedButton(
onPressed: () {
BlocProvider.of<NavCubitScreen>(context).goToActivityPage();
},
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/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:plotter/config/screen.dart'; import 'package:plotter/common/config/activity_page.dart';
import 'package:plotter/cubit/nav_cubit_screens.dart'; import 'package:plotter/common/config/screen.dart';
import 'package:plotter/ui/nav/bottom_nav_bar.dart'; import 'package:plotter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:plotter/ui/nav/global_app_bar.dart'; import 'package:plotter/common/ui/nav/global_app_bar.dart';
import 'package:plotter/common/ui/nav/bottom_nav_bar.dart';
class SkeletonScreen extends StatelessWidget { class SkeletonScreen extends StatelessWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
...@@ -28,8 +29,7 @@ class SkeletonScreen extends StatelessWidget { ...@@ -28,8 +29,7 @@ class SkeletonScreen extends StatelessWidget {
), ),
), ),
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
bottomNavigationBar: bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null,
Screen.displayBottomNavBar(screenIndex) ? const BottomNavBar() : null,
); );
}, },
); );
......
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:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
class ActivityBottomWidget extends StatelessWidget { class ActivityBottomWidget extends StatelessWidget {
......
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:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
class ActivityContentWidget extends StatelessWidget { class ActivityContentWidget extends StatelessWidget {
......
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:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/utils/api.dart'; import 'package:plotter/utils/api.dart';
class Keyboard extends StatelessWidget { class Keyboard extends StatelessWidget {
......
import 'dart:convert'; import 'dart:convert';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:plotter/cubit/activity_cubit.dart'; import 'package:plotter/cubit/activity/activity_cubit.dart';
import 'package:plotter/models/activity/activity.dart'; import 'package:plotter/models/activity/activity.dart';
class Api { class Api {
......
...@@ -245,10 +245,10 @@ packages: ...@@ -245,10 +245,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider name: path_provider
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.5"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
...@@ -442,10 +442,10 @@ packages: ...@@ -442,10 +442,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a" sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.7.0" version: "5.7.2"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
......
...@@ -3,7 +3,7 @@ description: A plotter helper application. ...@@ -3,7 +3,7 @@ description: A plotter helper application.
publish_to: "none" publish_to: "none"
version: 0.2.1+23 version: 0.3.0+24
environment: environment:
sdk: "^3.0.0" sdk: "^3.0.0"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment