diff --git a/CHANGELOG.md b/CHANGELOG.md index da9dbf159f1ad93808db34089cecc5f0248c7282..83e4bd78c45566ab37c191247380bea38c9a7654 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.7 + +- Allow "array" parameter type + ## 1.0.6 - Allow additional content in about page diff --git a/lib/parameters/application_config_definition.dart b/lib/parameters/application_config_definition.dart index a70fa0522ceb8a79a7e8ea03e48e93d5906fbb13..4551981288bb7171702704aaae0b24056b7e6073 100644 --- a/lib/parameters/application_config_definition.dart +++ b/lib/parameters/application_config_definition.dart @@ -37,6 +37,7 @@ class ApplicationSettingsParameter { final String code; final bool displayedOnTop; final List<ApplicationSettingsParameterItemValue> values; + final bool allowMultipleValues; final int itemsPerLine; final Widget Function({ required BuildContext context, @@ -52,6 +53,7 @@ class ApplicationSettingsParameter { required this.code, this.displayedOnTop = true, required this.values, + this.allowMultipleValues = false, this.itemsPerLine = 0, this.builder, this.customPainter, @@ -63,7 +65,15 @@ class ApplicationSettingsParameter { return values.map((ApplicationSettingsParameterItemValue item) => item.value).toList(); } - String get defaultValue => values.firstWhere((element) => element.isDefault).value; + String get defaultValue => allowMultipleValues + ? values + .where((itemValue) => itemValue.isDefault) + .toList() + .map((itemDefaultValue) => itemDefaultValue.value) + .join(',') + : values.firstWhere((itemValue) => itemValue.isDefault).value; + + List<String> get defaultValues => defaultValue.split(','); factory ApplicationSettingsParameter.empty() { return ApplicationSettingsParameter( @@ -82,8 +92,8 @@ class ApplicationSettingsParameter { required double size, required VoidCallback? onPressed, }) { - final Color buttonColorActive = (onPressed != null) ? Colors.blue : Colors.grey; - final Color buttonColorInactive = Theme.of(context).colorScheme.surface; + final Color colorAvailable = Theme.of(context).colorScheme.surface; + final Color colorSelected = (onPressed != null) ? Colors.blue : Colors.grey; const double buttonBorderWidth = 4.0; const double buttonBorderRadius = 12.0; @@ -91,9 +101,9 @@ class ApplicationSettingsParameter { BlocProvider.of<ActivitySettingsCubit>(context); final String currentValue = activitySettingsCubit.get(code); - final bool isSelected = (currentValue == itemValue.value); + final bool isSelected = (currentValue.split(',').contains(itemValue.value)); - final Color buttonColor = isSelected ? buttonColorActive : buttonColorInactive; + final Color color = isSelected ? colorSelected : colorAvailable; Widget content = SizedBox.shrink(); @@ -127,10 +137,10 @@ class ApplicationSettingsParameter { return Container( decoration: BoxDecoration( - color: buttonColor, + color: color, borderRadius: BorderRadius.circular(buttonBorderRadius), border: Border.all( - color: buttonColor, + color: color, width: buttonBorderWidth, ), ), diff --git a/lib/parameters/models/settings/settings_activity.dart b/lib/parameters/models/settings/settings_activity.dart index 45b3a12dab7b262f8555358f98a634d5f70d05c7..5d4d7339b94763f09791180cb0bba5b018083343 100644 --- a/lib/parameters/models/settings/settings_activity.dart +++ b/lib/parameters/models/settings/settings_activity.dart @@ -26,6 +26,10 @@ class ActivitySettings { String get(String code) { if (values.keys.contains(code)) { + if (appConfig.getFromCode(code).allowMultipleValues) { + return getAsArray(code).join(','); + } + if (appConfig.getFromCode(code).allowedValues.contains(values[code])) { return values[code] ?? appConfig.getFromCode(code).defaultValue; } @@ -54,6 +58,19 @@ class ActivitySettings { } } + List<String> getAsArray(String code) { + final List<String> legitValues = []; + if (values[code] != null) { + values[code]?.split(',').forEach((candidateValue) { + if (appConfig.getFromCode(code).allowedValues.contains(candidateValue)) { + legitValues.add(candidateValue); + } + }); + } + + return legitValues; + } + void dump() { printlog('$ActivitySettings:'); values.forEach((code, value) { diff --git a/lib/parameters/pages/parameters.dart b/lib/parameters/pages/parameters.dart index 9015a4921748c85ca28170223841c73333f1986a..eae6c14a6af5d09792e9f3ee9070e0a3580b0af5 100644 --- a/lib/parameters/pages/parameters.dart +++ b/lib/parameters/pages/parameters.dart @@ -153,7 +153,11 @@ class PageParameters extends StatelessWidget { size: itemWidth, onPressed: isEnabled ? () { - activitySettingsCubit.set(parameter.code, item.value); + if (parameter.allowMultipleValues) { + activitySettingsCubit.toggle(parameter.code, item.value); + } else { + activitySettingsCubit.set(parameter.code, item.value); + } } : null, ), diff --git a/lib/parameters/settings/settings_activity_cubit.dart b/lib/parameters/settings/settings_activity_cubit.dart index 6123055fdb2bf2f685d28f063dc909ef4d2f6817..15d795817a9460f2fb73b4298d2c4c931f3a9308 100644 --- a/lib/parameters/settings/settings_activity_cubit.dart +++ b/lib/parameters/settings/settings_activity_cubit.dart @@ -35,7 +35,7 @@ class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { } void set(String code, String value) { - Map<String, String> values = state.settings.values; + final Map<String, String> values = state.settings.values; values[code] = value; @@ -44,6 +44,17 @@ class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { ); } + void toggle(String code, String value) { + final List<String> currentValues = state.settings.values[code]?.split(',') ?? []; + if (currentValues.contains(value) == true) { + currentValues.removeWhere((candidate) => value == candidate); + } else { + currentValues.add(value); + } + + set(code, currentValues.join(',')); + } + @override ActivitySettingsState? fromJson(Map<String, dynamic> json) { Map<String, String> values = {}; diff --git a/pubspec.yaml b/pubspec.yaml index e77f7433e534cdd5f74ba4c5b9067c298f56ce99..d86e3c0bef6e469e1c8400d75d2edf5e8c37c398 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "Flutter custom toolbox for org.benoitharrault.* projects." publish_to: https://pub.harrault.fr/ -version: 1.0.6 +version: 1.0.7 homepage: https://git.harrault.fr/android/flutter-toolbox