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

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

Resolve "Normalize Activity application architecture"

Closes #26

See merge request !26
parents 97ac7a37 fe47d3a7
No related branches found
No related tags found
1 merge request!26Resolve "Normalize Activity application architecture"
Pipeline #6789 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