From aabeef6384c4c9ce3c7a1d19472f2450c0038f55 Mon Sep 17 00:00:00 2001 From: Andreas Fahrecker Date: Tue, 16 Mar 2021 16:33:46 +0100 Subject: [PATCH] Started Porting Progress Creation Screen Signed-off-by: Andreas Fahrecker --- .../create_time_progress_store_connector.dart | 53 +++++++++++ lib/ui/buttons/create_progress_button.dart | 24 ++--- .../buttons/go_to_create_progress_button.dart | 39 ++++++++ lib/ui/progress/progress_editor_widget.dart | 28 ++++-- lib/ui/screens/dashboard_screen.dart | 4 +- lib/ui/screens/progress_creation_screen.dart | 88 ++++++++++++++++++- 6 files changed, 212 insertions(+), 24 deletions(-) create mode 100644 lib/redux/store_connectors/create_time_progress_store_connector.dart create mode 100644 lib/ui/buttons/go_to_create_progress_button.dart diff --git a/lib/redux/store_connectors/create_time_progress_store_connector.dart b/lib/redux/store_connectors/create_time_progress_store_connector.dart new file mode 100644 index 0000000..cc297f3 --- /dev/null +++ b/lib/redux/store_connectors/create_time_progress_store_connector.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; +import 'package:redux/redux.dart'; +import 'package:time_progress_tracker/models/app_settings.dart'; +import 'package:time_progress_tracker/models/time_progress.dart'; +import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart'; +import 'package:time_progress_tracker/redux/app_state.dart'; +import 'package:time_progress_tracker/redux/redux_selectors.dart'; + +import '../../utils/helper_functions.dart'; + +class CreateTimeProgressStoreConnector extends StatelessWidget { + final Widget Function(BuildContext, CreateTimeProgressViewModel) + loadedBuilder; + + CreateTimeProgressStoreConnector({ + @required this.loadedBuilder, + }); + + @override + Widget build(BuildContext context) { + return StoreConnector( + onInit: loadTimeProgressListIfUnloaded, + converter: (store) => CreateTimeProgressViewModel._create(store), + builder: (context, CreateTimeProgressViewModel vm) { + return loadedBuilder(context, vm); + }, + ); + } +} + +class CreateTimeProgressViewModel { + final TimeProgress defaultProgress; + + final void Function(TimeProgress) addTimeProgress; + + CreateTimeProgressViewModel( + this.defaultProgress, + this.addTimeProgress, + ); + + factory CreateTimeProgressViewModel._create(Store store) { + AppSettings settings = appSettingsSelector(store.state); + void _addTimeProgress(TimeProgress tp) { + if (TimeProgress.isValid(tp)) store.dispatch(AddTimeProgressAction(tp)); + } + + return CreateTimeProgressViewModel( + TimeProgress.defaultFromDuration(settings.duration), + _addTimeProgress, + ); + } +} diff --git a/lib/ui/buttons/create_progress_button.dart b/lib/ui/buttons/create_progress_button.dart index 2abed39..633b252 100644 --- a/lib/ui/buttons/create_progress_button.dart +++ b/lib/ui/buttons/create_progress_button.dart @@ -1,36 +1,36 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/ui/screens/progress_creation_screen.dart'; import 'package:time_progress_tracker/utils/helper_functions.dart'; class CreateProgressButton extends StatelessWidget { - final String _heroTag = "createProgressBTN"; + final String _heroTag = "createTimeProgressBTN"; + + final void Function() createProgress; + + const CreateProgressButton({Key key, @required this.createProgress}) + : super(key: key); @override Widget build(BuildContext context) { - void _onButtonPressed() => Navigator.push( - context, - platformPageRoute( - context: context, - builder: (context) => ProgressCreationScreen(), - )); - Widget _renderCupertino() { return PlatformButton( padding: EdgeInsets.all(4), child: Icon( - Icons.add, + Icons.save, color: Colors.white, ), - onPressed: _onButtonPressed, + onPressed: () => createProgress(), ); } Widget _renderMaterial() { return FloatingActionButton( heroTag: _heroTag, - child: Icon(Icons.add), - onPressed: _onButtonPressed, + child: Icon(Icons.save), + onPressed: () => createProgress(), ); } diff --git a/lib/ui/buttons/go_to_create_progress_button.dart b/lib/ui/buttons/go_to_create_progress_button.dart new file mode 100644 index 0000000..fb56b9c --- /dev/null +++ b/lib/ui/buttons/go_to_create_progress_button.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:time_progress_tracker/ui/screens/progress_creation_screen.dart'; +import 'package:time_progress_tracker/utils/helper_functions.dart'; + +class GoToCreateProgressButton extends StatelessWidget { + final String _heroTag = "createProgressBTN"; + + @override + Widget build(BuildContext context) { + void _onButtonPressed() => Navigator.push( + context, + platformPageRoute( + context: context, + builder: (context) => ProgressCreationScreen(), + )); + + Widget _renderCupertino() { + return PlatformButton( + padding: EdgeInsets.all(4), + child: Icon( + Icons.add, + color: Colors.white, + ), + onPressed: _onButtonPressed, + ); + } + + Widget _renderMaterial() { + return FloatingActionButton( + heroTag: _heroTag, + child: Icon(Icons.add), + onPressed: _onButtonPressed, + ); + } + + return useCupertino() ? _renderCupertino() : _renderMaterial(); + } +} diff --git a/lib/ui/progress/progress_editor_widget.dart b/lib/ui/progress/progress_editor_widget.dart index 91293e8..ffead6c 100644 --- a/lib/ui/progress/progress_editor_widget.dart +++ b/lib/ui/progress/progress_editor_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/ui/buttons/date_picker_btn.dart'; @@ -64,14 +65,25 @@ class _ProgressEditorWidgetState extends State { Widget build(BuildContext context) { List columnChildren = [ Expanded( - child: TextField( - controller: _nameTextController, - decoration: InputDecoration( - border: OutlineInputBorder(), - labelText: "Progress Name", - errorText: _validName - ? null - : "The Name need to have at least 3 and at max 20 symbols.", + child: Center( + child: PlatformTextField( + controller: _nameTextController, + material: (context, platform) => MaterialTextFieldData( + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: "Progress Name", + errorText: _validName + ? null + : "The Name need to have at least 3 and at max 20 symbols.", + ), + ), + cupertino: (context, platform) => CupertinoTextFieldData( + placeholder: "Progress Name", + decoration: BoxDecoration( + border: Border.all(width: 2, color: Colors.grey), + borderRadius: BorderRadius.circular(32), + ) + ), ), ), ), diff --git a/lib/ui/screens/dashboard_screen.dart b/lib/ui/screens/dashboard_screen.dart index fc26bd5..f7c762b 100644 --- a/lib/ui/screens/dashboard_screen.dart +++ b/lib/ui/screens/dashboard_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; -import 'package:time_progress_tracker/ui/buttons/create_progress_button.dart'; +import 'package:time_progress_tracker/ui/buttons/go_to_create_progress_button.dart'; import 'package:time_progress_tracker/ui/screens/active_time_progresses_screen.dart'; import 'package:time_progress_tracker/ui/screens/inactive_time_progresses_screen.dart'; import 'package:time_progress_tracker/ui/screens/settings_screen.dart'; @@ -42,7 +42,7 @@ class _DashboardScreenState extends State { } Widget _renderCreateProgressBtn() => - _tabSelectedIndex == 2 ? null : CreateProgressButton(); + _tabSelectedIndex == 2 ? null : GoToCreateProgressButton(); @override Widget build(BuildContext context) { diff --git a/lib/ui/screens/progress_creation_screen.dart b/lib/ui/screens/progress_creation_screen.dart index 4517e4a..18d22f3 100644 --- a/lib/ui/screens/progress_creation_screen.dart +++ b/lib/ui/screens/progress_creation_screen.dart @@ -1,14 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:redux/redux.dart'; import 'package:time_progress_tracker/models/app_settings.dart'; +import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart'; import 'package:time_progress_tracker/redux/app_state.dart'; -import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/redux/redux_selectors.dart'; -import 'package:time_progress_tracker/utils/helper_functions.dart'; +import 'package:time_progress_tracker/redux/store_connectors/create_time_progress_store_connector.dart'; +import 'package:time_progress_tracker/ui/buttons/create_progress_button.dart'; import 'package:time_progress_tracker/ui/progress/progress_editor_widget.dart'; +import 'package:time_progress_tracker/utils/color_utils.dart'; +import 'package:time_progress_tracker/utils/helper_functions.dart'; class ProgressCreationScreen extends StatefulWidget { static const routeName = "/create-progress"; @@ -41,6 +45,86 @@ class _ProgressCreationScreenState extends State { @override Widget build(BuildContext context) { + void _onCreateTimeProgress(CreateTimeProgressViewModel vm) { + if (!_isProgressValid) return null; + vm.addTimeProgress(timeProgressToCreate); + Navigator.pop(context); + } + + initTimeProgress(TimeProgress.defaultFromDuration( + StoreProvider.of(context).state.appSettings.duration)); + + return PlatformScaffold( + appBar: PlatformAppBar( + title: Text( + ProgressCreationScreen.title, + style: toolbarTextStyle, + ), + cupertino: (_, __) => CupertinoNavigationBarData( + transitionBetweenRoutes: false, + trailing: CreateTimeProgressStoreConnector( + loadedBuilder: (context, CreateTimeProgressViewModel vm) => + CreateProgressButton( + createProgress: () => _onCreateTimeProgress(vm), + ), + ), + ), + ), + material: (_, __) => MaterialScaffoldData( + floatingActionButton: Row( + children: [ + Expanded( + child: CreateTimeProgressStoreConnector( + loadedBuilder: (context, CreateTimeProgressViewModel vm) => + CreateProgressButton( + createProgress: () => _onCreateTimeProgress(vm), + ), + ), + ) + ], + ), + ), + body: ProgressEditorWidget( + timeProgress: timeProgressToCreate, + onTimeProgressChanged: onTimeProgressChanged, + ), + ); + + return CreateTimeProgressStoreConnector( + loadedBuilder: (context, CreateTimeProgressViewModel vm) { + initTimeProgress(vm.defaultProgress); + return PlatformScaffold( + appBar: PlatformAppBar( + title: Text( + ProgressCreationScreen.title, + style: toolbarTextStyle, + ), + cupertino: (_, __) => CupertinoNavigationBarData( + transitionBetweenRoutes: false, + trailing: CreateProgressButton( + createProgress: () => _onCreateTimeProgress(vm), + ), + ), + ), + material: (_, __) => MaterialScaffoldData( + floatingActionButton: Row( + children: [ + Expanded( + child: CreateProgressButton( + createProgress: () => _onCreateTimeProgress(vm), + ), + ) + ], + ), + ), + body: ProgressEditorWidget( + timeProgress: timeProgressToCreate, + onTimeProgressChanged: onTimeProgressChanged, + ), + ); + }, + ); + return Scaffold( appBar: AppBar( title: Text(ProgressCreationScreen.title),