Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: material states card to support dropdown widget #811

Merged
merged 1 commit into from
Jul 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions lib/basic_theme/view/basic_theme_editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class _PrimaryColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Primary colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -98,7 +98,7 @@ class _SecondaryColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Secondary colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -140,7 +140,7 @@ class _TertiaryColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Tertiary colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -182,7 +182,7 @@ class _ErrorColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Error colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -224,7 +224,7 @@ class _NeutralColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Neutral colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -266,7 +266,7 @@ class _NeutralVariantColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Neutral variant colors',
items: [
MaterialStateItem(
Expand Down Expand Up @@ -308,7 +308,7 @@ class _InverseColorPickers extends StatelessWidget {
final cubit = context.read<BasicThemeCubit>();
final colorScheme = context.watch<BasicThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Inverse colors',
items: [
MaterialStateItem(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ abstract class AbstractButtonStyleEditor<T extends AbstractButtonStyleCubit>
final color = context.watch<T>().state.style?.foregroundColor;
final colorScheme = context.watch<ColorThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Foreground color',
tooltip: AbstractButtonStyleDocs.foregroundColor,
items: [
Expand All @@ -64,7 +64,7 @@ abstract class AbstractButtonStyleEditor<T extends AbstractButtonStyleCubit>
final color = context.watch<T>().state.style?.overlayColor;
final colorScheme = context.watch<ColorThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Overlay color',
tooltip: AbstractButtonStyleDocs.overlayColor,
items: [
Expand Down Expand Up @@ -97,7 +97,7 @@ abstract class AbstractButtonStyleEditor<T extends AbstractButtonStyleCubit>
final shadowColor = context.watch<T>().state.style?.shadowColor;
final themeShadowColor = context.watch<ColorThemeCubit>().state.shadowColor;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Shadow color',
tooltip: AbstractButtonStyleDocs.shadowColor,
items: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ abstract class AbstractFlatButtonStyleEditor<
Widget buildBackgroundColorPickers(BuildContext context) {
final color = context.watch<T>().state.style?.backgroundColor;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Background color',
tooltip: AbstractButtonStyleDocs.backgroundColor,
items: [
Expand All @@ -57,7 +57,7 @@ abstract class AbstractFlatButtonStyleEditor<
Widget buildElevationTextFields(BuildContext context) {
return BlocBuilder<T, ButtonStyleState>(
builder: (context, state) {
return MaterialStatesCard<String>(
return MaterialStatesCard<MaterialStateTextField>(
header: 'Elevation',
tooltip: AbstractButtonStyleDocs.elevation,
items: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class ElevatedButtonThemeEditor
context.watch<ElevatedButtonThemeCubit>().state.style?.backgroundColor;
final colorScheme = context.watch<ColorThemeCubit>().state.colorScheme;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Background color',
tooltip: AbstractButtonStyleDocs.backgroundColor,
items: [
Expand Down Expand Up @@ -73,7 +73,7 @@ class ElevatedButtonThemeEditor
final cubit = context.read<ElevatedButtonThemeCubit>();
final elevation = state.style?.elevation;

return MaterialStatesCard<String>(
return MaterialStatesCard<MaterialStateTextField>(
header: 'Elevation',
tooltip: AbstractButtonStyleDocs.elevation,
items: [
Expand Down
6 changes: 3 additions & 3 deletions lib/checkbox_theme/view/checkbox_theme_editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class _FillColorPickers extends StatelessWidget {
final fillColor = context.watch<CheckboxThemeCubit>().state.theme.fillColor;
final colorThemeState = context.watch<ColorThemeCubit>().state;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Fill color',
tooltip: CheckboxThemeDocs.fillColor,
items: [
Expand Down Expand Up @@ -69,7 +69,7 @@ class _CheckColorPickers extends StatelessWidget {
Widget build(BuildContext context) {
return BlocBuilder<CheckboxThemeCubit, CheckboxThemeState>(
builder: (context, state) {
return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Check color',
tooltip: CheckboxThemeDocs.checkColor,
items: [
Expand All @@ -96,7 +96,7 @@ class _OverlayColorPickers extends StatelessWidget {
context.watch<CheckboxThemeCubit>().state.theme.overlayColor;
final colorThemeState = context.watch<ColorThemeCubit>().state;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Overlay color',
tooltip: CheckboxThemeDocs.overlayColor,
items: [
Expand Down
4 changes: 2 additions & 2 deletions lib/radio_theme/view/radio_theme_editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class _FillColorPickers extends StatelessWidget {
final fillColor = context.watch<RadioThemeCubit>().state.theme.fillColor;
final colorThemeState = context.watch<ColorThemeCubit>().state;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Fill color',
tooltip: RadioThemeDocs.fillColor,
items: [
Expand Down Expand Up @@ -71,7 +71,7 @@ class _OverlayColorPickers extends StatelessWidget {
context.watch<RadioThemeCubit>().state.theme.overlayColor;
final colorThemeState = context.watch<ColorThemeCubit>().state;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Overlay color',
tooltip: RadioThemeDocs.overlayColor,
items: [
Expand Down
6 changes: 3 additions & 3 deletions lib/switch_theme/view/switch_theme_editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class _ThumbColorPickers extends StatelessWidget {
final thumbColor = context.watch<SwitchThemeCubit>().state.theme.thumbColor;
final primaryColor = context.watch<ColorThemeCubit>().state.primaryColor;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Thumb color',
tooltip: SwitchThemeDocs.thumbColor,
items: [
Expand Down Expand Up @@ -69,7 +69,7 @@ class _TrackColorPickers extends StatelessWidget {
final trackColor = context.watch<SwitchThemeCubit>().state.theme.trackColor;
final primaryColor = context.watch<ColorThemeCubit>().state.primaryColor;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Track color',
tooltip: SwitchThemeDocs.trackColor,
items: [
Expand Down Expand Up @@ -106,7 +106,7 @@ class _OverlayColorPickers extends StatelessWidget {
context.watch<SwitchThemeCubit>().state.theme.overlayColor;
final colorThemeState = context.watch<ColorThemeCubit>().state;

return MaterialStatesCard<Color>(
return MaterialStatesCard<MaterialStateColorPicker>(
header: 'Overlay color',
tooltip: SwitchThemeDocs.overlayColor,
items: [
Expand Down
89 changes: 51 additions & 38 deletions lib/widgets/cards/material_states_card.dart
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
import 'package:flutter/material.dart';
import 'package:appainter/widgets/widgets.dart';
import 'package:flutter/material.dart';

class MaterialStateItem<T> {
final Key? key;
final String title;
final String? tooltip;
final T value;
final ValueChanged<T> onValueChanged;
final bool colorEnableOpacity;

const MaterialStateItem({
required this.title,
required this.value,
required this.onValueChanged,
this.key,
this.tooltip,
this.colorEnableOpacity = true,
});
}
typedef MaterialStateColorPicker = Color;
typedef MaterialStateTextField = String;
typedef MaterialStateDropdown = String;

class MaterialStatesCard<T> extends StatelessWidget {
final String header;
Expand All @@ -29,13 +15,16 @@ class MaterialStatesCard<T> extends StatelessWidget {
required this.header,
required this.items,
this.tooltip,
}) : super(key: key);
}) : assert(T == MaterialStateColorPicker ||
T == MaterialStateTextField ||
T == MaterialStateDropdown), // coverage:ignore-line
super(key: key);

@override
Widget build(BuildContext context) {
return MyCard(
color: Theme.of(context).brightness == Brightness.dark
? Colors.grey[700]
? Colors.grey[700] // coverage:ignore-line
: Colors.grey[100],
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
Expand Down Expand Up @@ -65,6 +54,26 @@ class MaterialStatesCard<T> extends StatelessWidget {
}
}

class MaterialStateItem<T> {
final Key? key;
final String title;
final String? tooltip;
final T value;
final ValueChanged<T> onValueChanged;
final bool colorEnableOpacity;

const MaterialStateItem({
required this.title,
required this.value,
required this.onValueChanged,
this.key,
this.tooltip,
this.colorEnableOpacity = true,
}) : assert(T == MaterialStateColorPicker ||
T == MaterialStateTextField ||
T == MaterialStateDropdown); // coverage:ignore-line
}

class _Header extends StatelessWidget {
final String header;
final String? tooltip;
Expand Down Expand Up @@ -101,27 +110,31 @@ class _StateListTile<T> extends StatelessWidget {
required this.onValueChanged,
this.tooltip,
this.colorEnableOpacity = true,
}) : super(key: key);
}) : assert(T == MaterialStateColorPicker ||
T == MaterialStateTextField ||
T == MaterialStateDropdown), // coverage:ignore-line
super(key: key);

@override
Widget build(BuildContext context) {
if (T == Color) {
return ColorListTile(
title: title,
tooltip: tooltip,
color: value as Color,
onColorChanged: onValueChanged as ValueChanged<Color>,
enableOpacity: colorEnableOpacity,
);
} else if (T == String) {
return MyTextFormField(
labelText: title,
tooltip: tooltip,
initialValue: value as String,
onChanged: onValueChanged as ValueChanged<String>,
);
} else {
throw Exception('Unsupported type: $T');
switch (T) {
case MaterialStateColorPicker:
return ColorListTile(
title: title,
tooltip: tooltip,
color: value as Color,
onColorChanged: onValueChanged as ValueChanged<Color>,
enableOpacity: colorEnableOpacity,
);
case MaterialStateTextField:
return MyTextFormField(
labelText: title,
tooltip: tooltip,
initialValue: value as String,
onChanged: onValueChanged as ValueChanged<String>,
);
default:
throw Exception('Unsupported type: $T'); // coverage:ignore-line
}
}
}