Feature/code cleanup (#9)
* Implemented hasSettingsLoaded reducer * Added Padding to Progress List View * Created Settings and Time Progress List Store Connector * Rewritten Home Active Tab * Fixed missing onTap in Progress List Tile * Started using new Store Connectors in Inactive and Settings Tab * Created Time Progress Store Connector * Rewritten ProgressDetailScreen with new Store Connectors * Rewritten DatePickerBtn with TextButton * Deleted unused widget * Changed Foreground Color behaviour in ColorPicker BTN * Created Select Duration Button * Rewritten Duration Setting Widget * Updated Version Number Signed-off-by: Andreas Fahrecker <AndreasFahrecker@gmail.com>
This commit is contained in:
committed by
GitHub
parent
fc35476503
commit
40bdcc44f9
@ -1,26 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||
import 'package:time_progress_tracker/widgets/progress_list_view/progress_list_tile.dart';
|
||||
|
||||
class HomeProgressListTile extends StatelessWidget {
|
||||
final TimeProgress timeProgress;
|
||||
final Color doneColor;
|
||||
final Color leftColor;
|
||||
|
||||
HomeProgressListTile({
|
||||
@required this.timeProgress,
|
||||
@required this.doneColor,
|
||||
@required this.leftColor,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
child: ProgressListTile(
|
||||
timeProgress: timeProgress,
|
||||
doneColor: doneColor,
|
||||
leftColor: leftColor,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,51 +1,32 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_redux/flutter_redux.dart';
|
||||
import 'package:time_progress_tracker/actions/actions.dart';
|
||||
import 'package:time_progress_tracker/models/app_settings.dart';
|
||||
import 'package:time_progress_tracker/models/app_state.dart';
|
||||
import 'package:time_progress_tracker/helper_functions.dart';
|
||||
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||
import 'package:time_progress_tracker/selectors/time_progress_selectors.dart';
|
||||
import 'package:time_progress_tracker/widgets/home/home_progress_list_tile.dart';
|
||||
import 'package:time_progress_tracker/widgets/progress_list_view/progress_list_view.dart';
|
||||
import 'package:time_progress_tracker/widgets/store_connectors/settings_store_connector.dart';
|
||||
import 'package:time_progress_tracker/widgets/store_connectors/time_progress_list_store_connector.dart';
|
||||
|
||||
class HomeActiveProgressesTab extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StoreConnector(
|
||||
onInit: loadTimeProgressListIfUnloaded,
|
||||
converter: (store) => store.state.hasProgressesLoaded,
|
||||
builder: (context, hasLoaded) {
|
||||
if (!(hasLoaded as bool))
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
return StoreConnector<AppState, AppSettings>(
|
||||
onInit: loadSettingsIfUnloaded,
|
||||
converter: (store) => appSettingsSelector(store.state),
|
||||
builder: (context, AppSettings settings) {
|
||||
if (settings == null)
|
||||
return Center(child: CircularProgressIndicator());
|
||||
return StoreConnector<AppState, List<TimeProgress>>(
|
||||
converter: (store) => activeTimeProgressesSelector(store.state),
|
||||
builder: (context, List<TimeProgress> timeProgresses) {
|
||||
if (timeProgresses.length < 1)
|
||||
return Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"You don't have any currently active time progresses, that are tracked."),
|
||||
),
|
||||
);
|
||||
return ListView(
|
||||
padding: EdgeInsets.all(8),
|
||||
children: timeProgresses
|
||||
.map((timeProgress) => HomeProgressListTile(
|
||||
timeProgress: timeProgress,
|
||||
doneColor: settings.doneColor,
|
||||
leftColor: settings.leftColor,
|
||||
))
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
return SettingsStoreConnector(
|
||||
loadedBuilder: (context, settingsVm) {
|
||||
return TimeProgressListStoreConnector(
|
||||
loadedBuilder: (context, tpListVm) {
|
||||
List<TimeProgress> activeTpList =
|
||||
selectActiveProgresses(tpListVm.tpList);
|
||||
if (activeTpList.length < 1)
|
||||
return Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"You don't have any active time progress, that are tracked."),
|
||||
),
|
||||
);
|
||||
|
||||
return ProgressListView(
|
||||
timeProgressList: activeTpList,
|
||||
doneColor: settingsVm.appSettings.doneColor,
|
||||
leftColor: settingsVm.appSettings.leftColor,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
@ -1,50 +1,32 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_redux/flutter_redux.dart';
|
||||
import 'package:time_progress_tracker/actions/actions.dart';
|
||||
import 'package:time_progress_tracker/models/app_settings.dart';
|
||||
import 'package:time_progress_tracker/helper_functions.dart';
|
||||
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||
import 'package:time_progress_tracker/selectors/time_progress_selectors.dart';
|
||||
import 'package:time_progress_tracker/widgets/home/home_progress_list_tile.dart';
|
||||
import 'package:time_progress_tracker/widgets/progress_list_view/progress_list_view.dart';
|
||||
import 'package:time_progress_tracker/widgets/store_connectors/settings_store_connector.dart';
|
||||
import 'package:time_progress_tracker/widgets/store_connectors/time_progress_list_store_connector.dart';
|
||||
|
||||
class HomeInactiveProgressesTab extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StoreConnector(
|
||||
onInit: loadSettingsIfUnloaded,
|
||||
converter: (store) => appSettingsSelector(store.state),
|
||||
builder: (context, AppSettings settings) {
|
||||
return StoreConnector(
|
||||
onInit: loadTimeProgressListIfUnloaded,
|
||||
converter: (store) => store.state.hasProgressesLoaded,
|
||||
builder: (BuildContext context, dynamic hasLoaded) {
|
||||
if (!(hasLoaded as bool))
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
return SettingsStoreConnector(
|
||||
loadedBuilder: (context, settingsVm) {
|
||||
return TimeProgressListStoreConnector(
|
||||
loadedBuilder: (context, tpListVm) {
|
||||
List<TimeProgress> inactiveTpList =
|
||||
selectInactiveProgresses(tpListVm.tpList);
|
||||
if (inactiveTpList.length < 1)
|
||||
return Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"You don't have any currently inactive time progresses, that are tracked."),
|
||||
),
|
||||
);
|
||||
return StoreConnector(
|
||||
onInit: loadTimeProgressListIfUnloaded,
|
||||
converter: (store) => inactiveTimeProgressesSelector(store.state),
|
||||
builder:
|
||||
(BuildContext context, List<TimeProgress> timeProgresses) {
|
||||
if (timeProgresses.length < 1)
|
||||
return Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"You don't have any currently inactive time progresses, that are tracked."),
|
||||
),
|
||||
);
|
||||
return ListView(
|
||||
padding: EdgeInsets.all(8),
|
||||
children: timeProgresses
|
||||
.map((timeProgress) => HomeProgressListTile(
|
||||
timeProgress: timeProgress,
|
||||
doneColor: settings.doneColor,
|
||||
leftColor: settings.leftColor,
|
||||
))
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
|
||||
return ProgressListView(
|
||||
timeProgressList: inactiveTpList,
|
||||
doneColor: settingsVm.appSettings.doneColor,
|
||||
leftColor: settingsVm.appSettings.leftColor,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
@ -1,21 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_redux/flutter_redux.dart';
|
||||
import 'package:redux/redux.dart';
|
||||
import 'package:time_progress_tracker/actions/actions.dart';
|
||||
import 'package:time_progress_tracker/app.dart';
|
||||
import 'package:time_progress_tracker/models/app_settings.dart';
|
||||
import 'package:time_progress_tracker/models/app_state.dart';
|
||||
import 'package:time_progress_tracker/selectors/time_progress_selectors.dart';
|
||||
import 'package:time_progress_tracker/widgets/home/tabs/settings/color_settings_widget.dart';
|
||||
import 'package:time_progress_tracker/widgets/home/tabs/settings/duration_settings_widget.dart';
|
||||
import 'package:time_progress_tracker/widgets/store_connectors/settings_store_connector.dart';
|
||||
|
||||
class HomeSettingsTab extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return StoreConnector<AppState, _ViewModel>(
|
||||
onInit: loadSettingsIfUnloaded,
|
||||
converter: (store) => _ViewModel.create(store),
|
||||
builder: (context, _ViewModel vm) {
|
||||
return SettingsStoreConnector(
|
||||
loadedBuilder: (context, settingsVm) {
|
||||
return Container(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
@ -23,16 +16,16 @@ class HomeSettingsTab extends StatelessWidget {
|
||||
children: [
|
||||
Expanded(
|
||||
child: ColorSettingsWidget(
|
||||
doneColor: vm.doneColor,
|
||||
leftColor: vm.leftColor,
|
||||
updateDoneColor: vm.onDoneColorChanged,
|
||||
updateLeftColor: vm.onLeftColorChanged,
|
||||
doneColor: settingsVm.appSettings.doneColor,
|
||||
leftColor: settingsVm.appSettings.leftColor,
|
||||
updateDoneColor: settingsVm.updateDoneColor,
|
||||
updateLeftColor: settingsVm.updateLeftColor,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: DurationSettingsWidget(
|
||||
duration: vm.duration,
|
||||
updateDuration: vm.onDurationChanged,
|
||||
duration: settingsVm.appSettings.duration,
|
||||
updateDuration: settingsVm.updateDuration,
|
||||
),
|
||||
),
|
||||
Spacer(),
|
||||
@ -57,39 +50,3 @@ class HomeSettingsTab extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ViewModel {
|
||||
final Color doneColor, leftColor;
|
||||
final void Function(Color) onDoneColorChanged, onLeftColorChanged;
|
||||
final Duration duration;
|
||||
final void Function(Duration) onDurationChanged;
|
||||
|
||||
_ViewModel({
|
||||
@required this.doneColor,
|
||||
@required this.leftColor,
|
||||
@required this.onDoneColorChanged,
|
||||
@required this.onLeftColorChanged,
|
||||
@required this.duration,
|
||||
@required this.onDurationChanged,
|
||||
});
|
||||
|
||||
factory _ViewModel.create(Store<AppState> store) {
|
||||
AppSettings settings = appSettingsSelector(store.state);
|
||||
|
||||
void _onDoneColorChanged(Color c) => store
|
||||
.dispatch(UpdateAppSettingsActions(settings.copyWith(doneColor: c)));
|
||||
void _onLeftColorChanged(Color c) => store
|
||||
.dispatch(UpdateAppSettingsActions(settings.copyWith(leftColor: c)));
|
||||
|
||||
void _onDurationChanged(Duration d) => store
|
||||
.dispatch(UpdateAppSettingsActions(settings.copyWith(duration: d)));
|
||||
|
||||
return _ViewModel(
|
||||
doneColor: settings.doneColor,
|
||||
leftColor: settings.leftColor,
|
||||
onDoneColorChanged: _onDoneColorChanged,
|
||||
onLeftColorChanged: _onLeftColorChanged,
|
||||
duration: settings.duration,
|
||||
onDurationChanged: _onDurationChanged);
|
||||
}
|
||||
}
|
||||
|
@ -1,49 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
|
||||
|
||||
class ColorPickerButton extends StatelessWidget {
|
||||
final String title, dialogTitle;
|
||||
final Color selectedColor;
|
||||
final void Function(Color) onColorPicked;
|
||||
|
||||
ColorPickerButton({
|
||||
@required this.title,
|
||||
@required this.dialogTitle,
|
||||
@required this.selectedColor,
|
||||
@required this.onColorPicked,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Color getBtnPrimaryColor() => Color.fromARGB(
|
||||
selectedColor.alpha,
|
||||
selectedColor.alpha - selectedColor.red,
|
||||
selectedColor.alpha - selectedColor.green,
|
||||
selectedColor.alpha - selectedColor.blue,
|
||||
);
|
||||
|
||||
return TextButton(
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(dialogTitle),
|
||||
content: SingleChildScrollView(
|
||||
child: BlockPicker(
|
||||
pickerColor: selectedColor,
|
||||
onColorChanged: onColorPicked,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
child: Text(title),
|
||||
style: TextButton.styleFrom(
|
||||
primary: getBtnPrimaryColor(),
|
||||
backgroundColor: selectedColor,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:time_progress_tracker/widgets/home/tabs/settings/color_picker_btn.dart';
|
||||
import 'package:time_progress_tracker/widgets/buttons/color_picker_btn.dart';
|
||||
|
||||
class ColorSettingsWidget extends StatelessWidget {
|
||||
final Color doneColor, leftColor;
|
||||
@ -14,13 +14,14 @@ class ColorSettingsWidget extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ThemeData appTheme = Theme.of(context);
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Color Settings",
|
||||
style:
|
||||
TextStyle(fontWeight: FontWeight.bold, color: Colors.black87),
|
||||
style: appTheme.textTheme.headline6,
|
||||
),
|
||||
),
|
||||
Row(
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_picker/flutter_picker.dart';
|
||||
import 'package:time_progress_tracker/widgets/buttons/select_duration_btn.dart';
|
||||
|
||||
class DurationSettingsWidget extends StatelessWidget {
|
||||
final Duration duration;
|
||||
@ -12,49 +12,29 @@ class DurationSettingsWidget extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ThemeData appTheme = Theme.of(context);
|
||||
|
||||
int years = duration.inDays ~/ 365;
|
||||
int months = (duration.inDays - (365 * years)) ~/ 30;
|
||||
int days = duration.inDays - (365 * years) - (30 * months);
|
||||
return Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextButton(
|
||||
onPressed: () {
|
||||
Picker(
|
||||
adapter: NumberPickerAdapter(
|
||||
data: [
|
||||
const NumberPickerColumn(
|
||||
begin: 0,
|
||||
end: 999,
|
||||
suffix: Text(" Y"),
|
||||
),
|
||||
const NumberPickerColumn(
|
||||
begin: 0,
|
||||
end: 11,
|
||||
suffix: Text(" M"),
|
||||
),
|
||||
const NumberPickerColumn(
|
||||
begin: 0,
|
||||
end: 30,
|
||||
suffix: Text(" D"),
|
||||
),
|
||||
],
|
||||
),
|
||||
hideHeader: true,
|
||||
confirmText: "OK",
|
||||
title: const Text("Select Duration"),
|
||||
selectedTextStyle: TextStyle(color: Colors.blue),
|
||||
onConfirm: (Picker picker, List<int> value) {
|
||||
int years = value[0], months = value[1], days = value[2];
|
||||
days = (years * 365) + (months * 30) + days;
|
||||
Duration newDuration = Duration(days: days);
|
||||
updateDuration(newDuration);
|
||||
},
|
||||
).showDialog(context);
|
||||
},
|
||||
child: Text("Default Duration: $years Y - $months M - $days D"),
|
||||
child: Text(
|
||||
"Duration Settings",
|
||||
style: appTheme.textTheme.headline6,
|
||||
),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: SelectDurationBtn(
|
||||
duration: duration,
|
||||
updateDuration: updateDuration,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user