Skip to content

Commit bf5761e

Browse files
committed
Saad Advanced Dynamic Settings #1
1 parent 1aa6bee commit bf5761e

File tree

4 files changed

+158
-95
lines changed

4 files changed

+158
-95
lines changed

lib/src/transformers/node_transformers/passive_checkbox_transformer.dart

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,9 @@ class PassiveCheckboxTransformer extends NodeWidgetTransformer<CheckboxNode> {
1414
WidgetBuildSettings settings,
1515
) {
1616
if (settings.isPreview) {
17-
bool? effectiveValue = node.value;
18-
return StatefulBuilder(
19-
builder: (context, setState) => TransformerCheckbox(
20-
node: node,
21-
settings: settings,
22-
onChanged: (context, value) => setState(() {
23-
effectiveValue = value;
24-
}),
25-
value: effectiveValue,
26-
),
17+
return PreviewCheckboxWidget(
18+
node: node,
19+
settings: settings,
2720
);
2821
} else {
2922
return PassiveCheckboxWidget(
@@ -34,16 +27,46 @@ class PassiveCheckboxTransformer extends NodeWidgetTransformer<CheckboxNode> {
3427
}
3528
}
3629

30+
class PreviewCheckboxWidget extends StatefulWidget {
31+
const PreviewCheckboxWidget({
32+
super.key,
33+
required this.node,
34+
required this.settings,
35+
});
36+
37+
final CheckboxNode node;
38+
final WidgetBuildSettings settings;
39+
40+
@override
41+
State<PreviewCheckboxWidget> createState() => _PreviewCheckboxWidgetState();
42+
}
43+
44+
class _PreviewCheckboxWidgetState extends State<PreviewCheckboxWidget> {
45+
bool? effectiveValue = false;
46+
47+
@override
48+
Widget build(BuildContext context) {
49+
return TransformerCheckbox(
50+
node: widget.node,
51+
settings: widget.settings,
52+
onChanged: (context, value) => setState(() {
53+
effectiveValue = value;
54+
}),
55+
value: effectiveValue,
56+
);
57+
}
58+
}
59+
3760
class PassiveCheckboxWidget extends StatelessWidget {
3861
final CheckboxNode node;
3962
final WidgetBuildSettings settings;
40-
final List<VariableData> variables;
63+
final List<VariableData> variablesOverrides;
4164

4265
const PassiveCheckboxWidget({
4366
super.key,
4467
required this.node,
4568
required this.settings,
46-
this.variables = const [],
69+
this.variablesOverrides = const [],
4770
});
4871

4972
void onChanged(BuildContext context, bool? internalValue) {
@@ -60,7 +83,10 @@ class PassiveCheckboxWidget extends StatelessWidget {
6083
final bool? value = PropertyValueDelegate.getPropertyValue<bool>(
6184
node,
6285
'value',
63-
scopedValues: ScopedValues.of(context, variablesOverrides: variables),
86+
scopedValues: ScopedValues.of(
87+
context,
88+
variablesOverrides: variablesOverrides,
89+
),
6490
) ??
6591
node.value;
6692

@@ -69,7 +95,7 @@ class PassiveCheckboxWidget extends StatelessWidget {
6995
settings: settings,
7096
value: value,
7197
onChanged: onChanged,
72-
variables: variables,
98+
variables: variablesOverrides,
7399
);
74100
}
75101
}

lib/src/transformers/node_transformers/passive_slider_transformer.dart

Lines changed: 82 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -13,92 +13,80 @@ class PassiveSliderTransformer extends NodeWidgetTransformer<SliderNode> {
1313
BuildContext context,
1414
WidgetBuildSettings settings,
1515
) {
16-
return buildFromNode(context, node, settings);
16+
if (settings.isPreview) {
17+
return PreviewSliderWidget(
18+
node: node,
19+
settings: settings,
20+
);
21+
} else {
22+
return PassiveSliderWidget(
23+
node: node,
24+
settings: settings,
25+
);
26+
}
1727
}
28+
}
1829

19-
Widget buildFromProps(
20-
BuildContext context, {
21-
required SliderProperties props,
22-
required double height,
23-
required double width,
24-
double value = 0,
25-
required WidgetBuildSettings settings,
26-
}) {
27-
final node = SliderNode(
28-
id: '',
29-
name: 'Slider',
30-
basicBoxLocal: NodeBox(0, 0, width, height),
31-
retainedOuterBoxLocal: NodeBox(0, 0, width, height),
32-
properties: props,
33-
value: value,
34-
);
35-
return buildFromNode(context, node, settings);
36-
}
30+
class PreviewSliderWidget extends StatefulWidget {
31+
const PreviewSliderWidget({
32+
super.key,
33+
required this.node,
34+
required this.settings,
35+
});
3736

38-
Widget buildPreview({
39-
SliderProperties? properties,
40-
SliderNode? node,
41-
double height = kSliderDefaultHeight,
42-
double width = kSliderDefaultWidth,
43-
double value = 0,
44-
ValueChanged<double>? onChanged,
45-
WidgetBuildSettings settings = const WidgetBuildSettings(
46-
debugLabel: 'buildPreview',
47-
replaceVariablesWithSymbols: true,
48-
),
49-
}) {
50-
final previewNode = SliderNode(
51-
properties: properties ?? node?.properties ?? SliderProperties(),
52-
id: '',
53-
name: 'Slider',
54-
value: value,
55-
basicBoxLocal: NodeBox(0, 0, width, height),
56-
retainedOuterBoxLocal: NodeBox(0, 0, width, height),
57-
);
58-
previewNode.value = value;
59-
return PassiveSliderWidget(
60-
node: previewNode,
61-
onChanged: (context, value) => onChanged?.call(value),
62-
settings: settings,
63-
);
64-
}
37+
final SliderNode node;
38+
final WidgetBuildSettings settings;
6539

66-
Widget buildFromNode(
67-
BuildContext context,
68-
SliderNode node,
69-
WidgetBuildSettings settings,
70-
) {
71-
return PassiveSliderWidget(
72-
node: node,
73-
settings: settings,
74-
onChanged: (context, value) => onChanged(context, node, value),
75-
);
76-
}
40+
@override
41+
State<PreviewSliderWidget> createState() => _PreviewSliderWidgetState();
42+
}
7743

78-
void onChanged(BuildContext context, SliderNode node, double internalValue) {
79-
NodeStateProvider.setState(context, internalValue);
80-
FunctionsRepository.setPropertyValue(context,
81-
node: node, property: 'value', value: internalValue);
44+
class _PreviewSliderWidgetState extends State<PreviewSliderWidget> {
45+
double effectiveValue = 0;
8246

83-
FunctionsRepository.triggerAction(
84-
context, node: node, TriggerType.changed, value: internalValue);
47+
@override
48+
Widget build(BuildContext context) {
49+
return TransformerSlider(
50+
node: widget.node,
51+
settings: widget.settings,
52+
onChanged: (value) => setState(() {
53+
effectiveValue = value;
54+
}),
55+
value: effectiveValue,
56+
);
8557
}
8658
}
8759

8860
class PassiveSliderWidget extends StatelessWidget {
8961
final SliderNode node;
9062
final WidgetBuildSettings settings;
9163
final List<VariableData> variablesOverrides;
92-
final void Function(BuildContext context, double value)? onChanged;
9364

9465
const PassiveSliderWidget({
9566
super.key,
9667
required this.node,
9768
required this.settings,
98-
required this.onChanged,
9969
this.variablesOverrides = const [],
10070
});
10171

72+
void onChanged(BuildContext context, double internalValue) {
73+
NodeStateProvider.setState(context, internalValue);
74+
75+
FunctionsRepository.setPropertyValue(
76+
context,
77+
node: node,
78+
property: 'value',
79+
value: internalValue,
80+
);
81+
82+
FunctionsRepository.triggerAction(
83+
context,
84+
node: node,
85+
TriggerType.changed,
86+
value: internalValue,
87+
);
88+
}
89+
10290
@override
10391
Widget build(BuildContext context) {
10492
final ScopedValues scopedValues = ScopedValues.of(
@@ -112,8 +100,34 @@ class PassiveSliderWidget extends StatelessWidget {
112100
) ??
113101
node.value;
114102

115-
// final double value = variables.getDoubleById(node.variables['value'] ?? '',
116-
// defaultValue: node.value);
103+
return TransformerSlider(
104+
node: node,
105+
settings: settings,
106+
variablesOverrides: variablesOverrides,
107+
onChanged: (value) => onChanged(context, value),
108+
value: value,
109+
);
110+
}
111+
}
112+
113+
class TransformerSlider extends StatelessWidget {
114+
const TransformerSlider({
115+
super.key,
116+
required this.node,
117+
required this.settings,
118+
required this.onChanged,
119+
required this.value,
120+
this.variablesOverrides = const [],
121+
});
122+
123+
final SliderNode node;
124+
final WidgetBuildSettings settings;
125+
final List<VariableData> variablesOverrides;
126+
final ValueChanged<double>? onChanged;
127+
final double value;
128+
129+
@override
130+
Widget build(BuildContext context) {
117131
final SliderTrackShape trackShape;
118132
if (node.properties.trackShape == SliderTrackShapeEnum.rectangle) {
119133
trackShape = const RectangularSliderTrackShape();
@@ -170,7 +184,7 @@ class PassiveSliderWidget extends StatelessWidget {
170184
),
171185
child: Slider(
172186
value: value,
173-
onChanged: (value) => onChanged?.call(context, value),
187+
onChanged: onChanged,
174188
autofocus: node.properties.autofocus,
175189
min: node.properties.min,
176190
max: node.properties.max,

lib/src/transformers/node_transformers/passive_switch_transformer.dart

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,9 @@ class PassiveSwitchTransformer extends NodeWidgetTransformer<SwitchNode> {
1414
WidgetBuildSettings settings,
1515
) {
1616
if (settings.isPreview) {
17-
bool effectiveValue = node.value;
18-
return StatefulBuilder(
19-
builder: (context, setState) => TransformerSwitch(
20-
node: node,
21-
settings: settings,
22-
onChanged: (context, value) => setState(() {
23-
effectiveValue = value;
24-
}),
25-
value: effectiveValue,
26-
),
17+
return PreviewSwitchWidget(
18+
node: node,
19+
settings: settings,
2720
);
2821
} else {
2922
return PassiveSwitchWidget(
@@ -34,6 +27,36 @@ class PassiveSwitchTransformer extends NodeWidgetTransformer<SwitchNode> {
3427
}
3528
}
3629

30+
class PreviewSwitchWidget extends StatefulWidget {
31+
const PreviewSwitchWidget({
32+
super.key,
33+
required this.node,
34+
required this.settings,
35+
});
36+
37+
final SwitchNode node;
38+
final WidgetBuildSettings settings;
39+
40+
@override
41+
State<PreviewSwitchWidget> createState() => _PreviewSwitchWidgetState();
42+
}
43+
44+
class _PreviewSwitchWidgetState extends State<PreviewSwitchWidget> {
45+
bool effectiveValue = false;
46+
47+
@override
48+
Widget build(BuildContext context) {
49+
return TransformerSwitch(
50+
node: widget.node,
51+
settings: widget.settings,
52+
onChanged: (context, value) => setState(() {
53+
effectiveValue = value;
54+
}),
55+
value: effectiveValue,
56+
);
57+
}
58+
}
59+
3760
class PassiveSwitchWidget extends StatelessWidget {
3861
final SwitchNode node;
3962
final WidgetBuildSettings settings;

lib/src/utils/extensions.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,7 @@ extension BaseConditionExt on BaseCondition {
17171717
..removeAll(predefinedListenableVariableNames))) ??
17181718
{};
17191719

1720-
/// [variables] is a map of variable name to variable value.
1720+
/// [variablesOverrides] is a map of variable name to variable value.
17211721
R? evaluate<R extends Object>(ScopedValues scopedValues) => accept<R>(
17221722
ConditionEvaluator<R>(scopedValues: scopedValues),
17231723
);
@@ -1808,13 +1808,13 @@ extension CanvasConditionsExt on CanvasConditions {
18081808
}
18091809

18101810
extension ExpressionExt on BaseExpression {
1811-
/// [variables] is a map of variable names and their values.
1811+
/// [variablesOverrides] is a map of variable names and their values.
18121812
bool evaluate(ScopedValues scopedValues) =>
18131813
accept<bool>(ConditionEvaluator<bool>(scopedValues: scopedValues))!;
18141814
}
18151815

18161816
extension ExpressionPartExt on ExpressionPart {
1817-
/// [variables] is a map of variable name and its value.
1817+
/// [variablesOverrides] is a map of variable name and its value.
18181818
dynamic evaluate(ScopedValues scopedValues) =>
18191819
accept(ConditionEvaluator(scopedValues: scopedValues));
18201820
}

0 commit comments

Comments
 (0)