-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbutton_customization.dart
More file actions
261 lines (214 loc) · 7.9 KB
/
Copy pathbutton_customization.dart
File metadata and controls
261 lines (214 loc) · 7.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
import 'package:flutter/material.dart';
import 'package:ouds_flutter_demo/ui/components/button/button_enum.dart';
import 'package:ouds_flutter_demo/ui/utilities/customizable/customizable_widget_state.dart';
/// Section for InheritedWidget to pass data down the widget tree
class _ButtonCustomization extends InheritedWidget {
const _ButtonCustomization({required super.child, required this.data});
final ButtonCustomizationState data;
@override
bool updateShouldNotify(_ButtonCustomization oldWidget) => true;
}
/// Main Widget class for button customization
class ButtonCustomization extends StatefulWidget {
const ButtonCustomization({super.key, required this.child});
final Widget child;
@override
ButtonCustomizationState createState() => ButtonCustomizationState();
static ButtonCustomizationState? of(BuildContext context) {
return (context.dependOnInheritedWidgetOfExactType<_ButtonCustomization>())
?.data;
}
}
/// Button customization state management
class ButtonCustomizationState
extends CustomizationWidgetState<ButtonCustomization> {
late final AppearanceState appearanceState;
late final LayoutState layoutState;
late final LoaderState loaderState;
late final FullWidthState fullWidthState;
late final ChevronState chevronState;
late final NavigationAppearanceState navigationAppearanceState;
@override
void initState() {
super.initState();
appearanceState = AppearanceState(setState, onColoredBoxState);
loaderState = LoaderState(setState, enabledState);
layoutState = LayoutState(setState);
fullWidthState = FullWidthState(setState);
chevronState = ChevronState(setState);
navigationAppearanceState = NavigationAppearanceState(
setState,
onColoredBoxState,
);
}
// Getter to determine if the 'OnColoredBox' should be disabled
bool get isOnColoredBoxDisabled {
return ButtonErrorCases.isOnColoredBoxDisabled(appearanceState.selected) ||
ButtonErrorCases.isOnColoredBoxDisabled(
navigationAppearanceState.selected,
);
}
// Getter to determine if the 'Enabled' should be disabled
bool get isEnabledWhenLoading {
return ButtonErrorCases.isEnabledWhenLoading(hasLoader);
}
// Proxy getters and setters to expose state values directly
ButtonEnumAppearance get selectedAppearance => appearanceState.selected;
set selectedAppearance(ButtonEnumAppearance value) =>
appearanceState.selected = value;
ButtonEnumLayout get selectedLayout => layoutState.selected;
set selectedLayout(ButtonEnumLayout value) => layoutState.selected = value;
bool get hasLoader => loaderState.value;
set hasLoader(bool value) => loaderState.value = value;
bool get hasFullWidth => fullWidthState.value;
set hasFullWidth(bool value) => fullWidthState.value = value;
NavigationButtonLayoutEnum get selectedChevron => chevronState.selected;
set selectedChevron(NavigationButtonLayoutEnum value) =>
chevronState.selected = value;
NavigationButtonEnumAppearance get selectedNavigationAppearance =>
navigationAppearanceState.selected;
set selectedNavigationAppearance(NavigationButtonEnumAppearance value) =>
navigationAppearanceState.selected = value;
@override
Widget build(BuildContext context) {
return _ButtonCustomization(data: this, child: widget.child);
}
}
/// Appearance State Management
class AppearanceState {
AppearanceState(this._setState, this.onColoredBoxState);
final void Function(void Function()) _setState;
final OnColoredBoxState onColoredBoxState;
List<ButtonEnumAppearance> _appearance = [
ButtonEnumAppearance.defaultAppearance,
ButtonEnumAppearance.strong,
ButtonEnumAppearance.brand,
ButtonEnumAppearance.minimal,
ButtonEnumAppearance.negative,
];
ButtonEnumAppearance _selectedAppearance =
ButtonEnumAppearance.defaultAppearance;
List<ButtonEnumAppearance> get list => _appearance;
set list(List<ButtonEnumAppearance> newList) {
_setState(() {
_appearance = newList;
});
}
ButtonEnumAppearance get selected => _selectedAppearance;
set selected(ButtonEnumAppearance newValue) {
_setState(() {
_selectedAppearance = newValue;
if (ButtonErrorCases.shouldDisableOnColoredBox(newValue)) {
onColoredBoxState.value = false;
}
});
}
}
/// Layout State Management
class LayoutState {
LayoutState(this._setState);
final void Function(VoidCallback) _setState;
final List<ButtonEnumLayout> _layout = [
ButtonEnumLayout.textOnly,
ButtonEnumLayout.iconAndText,
ButtonEnumLayout.iconOnly,
];
List<ButtonEnumLayout> get list => _layout;
ButtonEnumLayout _selected = ButtonEnumLayout.textOnly;
ButtonEnumLayout get selected => _selected;
set selected(ButtonEnumLayout newValue) {
_setState(() {
_selected = newValue;
});
}
}
/// Loader State Management
class LoaderState {
LoaderState(this._setState, this.enabledState);
final void Function(void Function()) _setState;
final EnabledState enabledState;
bool _hasLoaderState = false;
bool get value => _hasLoaderState;
set value(bool newValue) {
_setState(() {
_hasLoaderState = newValue;
});
}
}
/// FullWidth State Management
class FullWidthState {
FullWidthState(this._setState);
final void Function(void Function()) _setState;
bool _hasFullWidth = false;
bool get value => _hasFullWidth;
set value(bool newValue) {
_setState(() {
_hasFullWidth = newValue;
});
}
}
/// Error handling for specific button behavior
class ButtonErrorCases {
// OnColoredBox behavior: Disable if appearance is 'Negative'
static bool isOnColoredBoxDisabled(Object appearance) {
return appearance == ButtonEnumAppearance.negative ||
appearance == ButtonEnumAppearance.brand ||
appearance == NavigationButtonEnumAppearance.brand;
}
// OnColoredBox management: Disable when "Negative" appearance is selected
static bool shouldDisableOnColoredBox(Object selectedAppearance) {
return selectedAppearance == ButtonEnumAppearance.negative ||
selectedAppearance == ButtonEnumAppearance.brand ||
selectedAppearance == NavigationButtonEnumAppearance.brand;
}
// Enabled behavior: Disable if Loader is not null
static bool isEnabledWhenLoading(bool hasEnabled) {
return hasEnabled;
}
}
/// Chevron State Management
class ChevronState {
ChevronState(this._setState);
final void Function(VoidCallback) _setState;
final List<NavigationButtonLayoutEnum> _chevron = [
NavigationButtonLayoutEnum.next,
NavigationButtonLayoutEnum.previous,
];
List<NavigationButtonLayoutEnum> get list => _chevron;
NavigationButtonLayoutEnum _selected = NavigationButtonLayoutEnum.next;
NavigationButtonLayoutEnum get selected => _selected;
set selected(NavigationButtonLayoutEnum newValue) {
_setState(() {
_selected = newValue;
});
}
}
/// Navigation Appearance State Management
class NavigationAppearanceState {
NavigationAppearanceState(this._setState, this.onColoredBoxState);
final void Function(void Function()) _setState;
final OnColoredBoxState onColoredBoxState;
List<NavigationButtonEnumAppearance> _navigationAppearance = [
NavigationButtonEnumAppearance.defaultAppearance,
NavigationButtonEnumAppearance.strong,
NavigationButtonEnumAppearance.brand,
NavigationButtonEnumAppearance.minimal,
];
NavigationButtonEnumAppearance _selectedAppearance =
NavigationButtonEnumAppearance.defaultAppearance;
List<NavigationButtonEnumAppearance> get list => _navigationAppearance;
set list(List<NavigationButtonEnumAppearance> newList) {
_setState(() {
_navigationAppearance = newList;
});
}
NavigationButtonEnumAppearance get selected => _selectedAppearance;
set selected(NavigationButtonEnumAppearance newValue) {
_setState(() {
_selectedAppearance = newValue;
if (ButtonErrorCases.shouldDisableOnColoredBox(newValue)) {
onColoredBoxState.value = false;
}
});
}
}