Skip to content

Commit

Permalink
adaptive recursive property for container-alike controls (#2518)
Browse files Browse the repository at this point in the history
* `adaptive` property moved to `AdaptiveControl`

* Fix KeyError in pubsub

* Python side: `adaptive` property added to all container controls

* add adaptive to createControl()

* Recursive adaptive property

* parentAdaptive added to all controls
  • Loading branch information
FeodorFitsner committed Feb 2, 2024
1 parent 829b085 commit 417607f
Show file tree
Hide file tree
Showing 99 changed files with 862 additions and 487 deletions.
8 changes: 5 additions & 3 deletions package/example/my_controls/lib/src/create_control.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ CreateControlFactory createControl = (CreateControlArgs args) {
switch (args.control.type) {
case "my_org:my_control":
return MyControl(
control: args.control,
children: args.children,
parentDisabled: args.parentDisabled);
control: args.control,
children: args.children,
parentDisabled: args.parentDisabled,
parentAdaptive: args.parentAdaptive,
);
default:
return null;
}
Expand Down
7 changes: 5 additions & 2 deletions package/example/my_controls/lib/src/my_control.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ class MyControl extends StatelessWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

const MyControl(
{super.key,
this.parent,
required this.control,
required this.children,
required this.parentDisabled});
required this.parentDisabled,
required this.parentAdaptive});

@override
Widget build(BuildContext context) {
Expand All @@ -35,7 +37,8 @@ class MyControl extends StatelessWidget {
surfaceTintColor: HexColor.fromString(
Theme.of(context), control.attrString("surfaceTintColor", "")!),
child: contentCtrls.isNotEmpty
? createControl(control, contentCtrls.first.id, disabled)
? createControl(control, contentCtrls.first.id, disabled,
parentAdaptive: parentAdaptive)
: null),
parent,
control);
Expand Down
5 changes: 3 additions & 2 deletions package/lib/src/control_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ class CreateControlArgs {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

CreateControlArgs(
this.key, this.parent, this.control, this.children, this.parentDisabled);
CreateControlArgs(this.key, this.parent, this.control, this.children,
this.parentDisabled, this.parentAdaptive);
}

typedef CreateControlFactory = Widget? Function(CreateControlArgs args);
19 changes: 14 additions & 5 deletions package/lib/src/controls/alert_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class AlertDialogControl extends StatefulWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;
final Widget? nextChild;

const AlertDialogControl({
Expand All @@ -23,6 +24,7 @@ class AlertDialogControl extends StatefulWidget {
required this.control,
required this.children,
required this.parentDisabled,
required this.parentAdaptive,
required this.nextChild,
});

Expand All @@ -34,6 +36,8 @@ class _AlertDialogControlState extends State<AlertDialogControl>
with FletControlStatefulMixin, FletStoreMixin {
Widget _createAlertDialog() {
bool disabled = widget.control.isDisabled || widget.parentDisabled;
bool? adaptive =
widget.control.attrBool("adaptive") ?? widget.parentAdaptive;
var titleCtrls =
widget.children.where((c) => c.name == "title" && c.isVisible);
var contentCtrls =
Expand All @@ -48,16 +52,19 @@ class _AlertDialogControlState extends State<AlertDialogControl>

return AlertDialog(
title: titleCtrls.isNotEmpty
? createControl(widget.control, titleCtrls.first.id, disabled)
? createControl(widget.control, titleCtrls.first.id, disabled,
parentAdaptive: adaptive)
: null,
titlePadding: parseEdgeInsets(widget.control, "titlePadding"),
content: contentCtrls.isNotEmpty
? createControl(widget.control, contentCtrls.first.id, disabled)
? createControl(widget.control, contentCtrls.first.id, disabled,
parentAdaptive: adaptive)
: null,
contentPadding: parseEdgeInsets(widget.control, "contentPadding") ??
const EdgeInsets.fromLTRB(24.0, 20.0, 24.0, 24.0),
actions: actionCtrls
.map((c) => createControl(widget.control, c.id, disabled))
.map((c) => createControl(widget.control, c.id, disabled,
parentAdaptive: adaptive))
.toList(),
actionsPadding: parseEdgeInsets(widget.control, "actionsPadding"),
actionsAlignment: actionsAlignment,
Expand All @@ -72,15 +79,17 @@ class _AlertDialogControlState extends State<AlertDialogControl>
debugPrint("AlertDialog build ($hashCode): ${widget.control.id}");

return withPagePlatform((context, platform) {
bool adaptive = widget.control.attrBool("adaptive", false)!;
if (adaptive &&
bool? adaptive =
widget.control.attrBool("adaptive") ?? widget.parentAdaptive;
if (adaptive == true &&
(platform == TargetPlatform.iOS ||
platform == TargetPlatform.macOS)) {
return CupertinoAlertDialogControl(
control: widget.control,
parentDisabled: widget.parentDisabled,
children: widget.children,
nextChild: widget.nextChild,
parentAdaptive: adaptive,
);
}

Expand Down
7 changes: 5 additions & 2 deletions package/lib/src/controls/animated_switcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ class AnimatedSwitcherControl extends StatelessWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

const AnimatedSwitcherControl(
{super.key,
this.parent,
required this.control,
required this.children,
required this.parentDisabled});
required this.parentDisabled,
required this.parentAdaptive});

@override
Widget build(BuildContext context) {
Expand All @@ -35,7 +37,8 @@ class AnimatedSwitcherControl extends StatelessWidget {
return const ErrorControl("Content is not set.");
}

var child = createControl(control, contentCtrls.first.id, disabled);
var child = createControl(control, contentCtrls.first.id, disabled,
parentAdaptive: parentAdaptive);

return constrainedControl(
context,
Expand Down
16 changes: 11 additions & 5 deletions package/lib/src/controls/app_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class AppBarControl extends StatelessWidget
final Control? parent;
final Control control;
final bool parentDisabled;
final bool? parentAdaptive;
final List<Control> children;
final double height;

Expand All @@ -22,20 +23,22 @@ class AppBarControl extends StatelessWidget
required this.control,
required this.children,
required this.parentDisabled,
required this.parentAdaptive,
required this.height});

@override
Widget build(BuildContext context) {
debugPrint("AppBar build: ${control.id}");

return withPagePlatform((context, platform) {
bool adaptive = control.attrBool("adaptive", false)!;
if (adaptive &&
bool? adaptive = control.attrBool("adaptive") ?? parentAdaptive;
if (adaptive == true &&
(platform == TargetPlatform.iOS ||
platform == TargetPlatform.macOS)) {
return CupertinoAppBarControl(
control: control,
parentDisabled: parentDisabled,
parentAdaptive: adaptive,
children: children,
bgcolor: HexColor.fromString(
Theme.of(context), control.attrString("bgcolor", "")!));
Expand All @@ -59,20 +62,23 @@ class AppBarControl extends StatelessWidget

return AppBar(
leading: leadingCtrls.isNotEmpty
? createControl(control, leadingCtrls.first.id, control.isDisabled)
? createControl(control, leadingCtrls.first.id, control.isDisabled,
parentAdaptive: adaptive)
: null,
leadingWidth: leadingWidth,
automaticallyImplyLeading: automaticallyImplyLeading,
title: titleCtrls.isNotEmpty
? createControl(control, titleCtrls.first.id, control.isDisabled)
? createControl(control, titleCtrls.first.id, control.isDisabled,
parentAdaptive: adaptive)
: null,
centerTitle: centerTitle,
toolbarHeight: preferredSize.height,
foregroundColor: color,
backgroundColor: bgcolor,
elevation: elevation,
actions: actionCtrls
.map((c) => createControl(control, c.id, control.isDisabled))
.map((c) => createControl(control, c.id, control.isDisabled,
parentAdaptive: adaptive))
.toList(),
);
});
Expand Down
12 changes: 8 additions & 4 deletions package/lib/src/controls/badge.dart
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
import 'package:flutter/material.dart';

import '../models/control.dart';
import 'create_control.dart';
import '../utils/transforms.dart';
import '../utils/alignment.dart';
import '../utils/colors.dart';
import '../utils/edge_insets.dart';
import '../utils/text.dart';
import '../utils/transforms.dart';
import 'create_control.dart';

class BadgeControl extends StatelessWidget {
final Control? parent;
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

const BadgeControl(
{super.key,
required this.parent,
required this.control,
required this.children,
required this.parentDisabled});
required this.parentDisabled,
required this.parentAdaptive});

@override
Widget build(BuildContext context) {
Expand All @@ -31,7 +34,8 @@ class BadgeControl extends StatelessWidget {
bool disabled = control.isDisabled || parentDisabled;

Widget? child = contentCtrls.isNotEmpty
? createControl(control, contentCtrls.first.id, disabled)
? createControl(control, contentCtrls.first.id, disabled,
parentAdaptive: parentAdaptive)
: null;

var offsetDetails = parseOffset(control, "offset");
Expand Down
11 changes: 8 additions & 3 deletions package/lib/src/controls/banner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class BannerControl extends StatefulWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;
final Widget? nextChild;

const BannerControl(
Expand All @@ -19,6 +20,7 @@ class BannerControl extends StatefulWidget {
required this.control,
required this.children,
required this.parentDisabled,
required this.parentAdaptive,
required this.nextChild});

@override
Expand All @@ -45,13 +47,16 @@ class _BannerControlState extends State<BannerControl> {

return MaterialBanner(
leading: leadingCtrls.isNotEmpty
? createControl(widget.control, leadingCtrls.first.id, disabled)
? createControl(widget.control, leadingCtrls.first.id, disabled,
parentAdaptive: widget.parentAdaptive)
: null,
leadingPadding: parseEdgeInsets(widget.control, "leadingPadding"),
content: createControl(widget.control, contentCtrls.first.id, disabled),
content: createControl(widget.control, contentCtrls.first.id, disabled,
parentAdaptive: widget.parentAdaptive),
padding: parseEdgeInsets(widget.control, "contentPadding"),
actions: actionCtrls
.map((c) => createControl(widget.control, c.id, disabled))
.map((c) => createControl(widget.control, c.id, disabled,
parentAdaptive: widget.parentAdaptive))
.toList(),
forceActionsBelow: widget.control.attrBool("forceActionsBelow", false)!,
backgroundColor: HexColor.fromString(
Expand Down
7 changes: 5 additions & 2 deletions package/lib/src/controls/bottom_app_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ class BottomAppBarControl extends StatefulWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

const BottomAppBarControl(
{super.key,
this.parent,
required this.control,
required this.children,
required this.parentDisabled});
required this.parentDisabled,
required this.parentAdaptive});

@override
State<BottomAppBarControl> createState() => _BottomAppBarControlState();
Expand Down Expand Up @@ -72,7 +74,8 @@ class _BottomAppBarControlState extends State<BottomAppBarControl>
Theme.of(context), widget.control.attrString("bgColor", "")!),
notchMargin: widget.control.attrDouble("notchMargin", 4.0)!,
child: contentCtrls.isNotEmpty
? createControl(widget.control, contentCtrls.first.id, disabled)
? createControl(widget.control, contentCtrls.first.id, disabled,
parentAdaptive: widget.parentAdaptive)
: null,
);
});
Expand Down
5 changes: 4 additions & 1 deletion package/lib/src/controls/bottom_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class BottomSheetControl extends StatefulWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;
final Widget? nextChild;

const BottomSheetControl(
Expand All @@ -19,6 +20,7 @@ class BottomSheetControl extends StatefulWidget {
required this.control,
required this.children,
required this.parentDisabled,
required this.parentAdaptive,
required this.nextChild});

@override
Expand Down Expand Up @@ -65,7 +67,8 @@ class _BottomSheetControlState extends State<BottomSheetControl>
}

var content = createControl(
widget.control, contentCtrls.first.id, disabled);
widget.control, contentCtrls.first.id, disabled,
parentAdaptive: widget.parentAdaptive);

if (content is ErrorControl) {
return content;
Expand Down
7 changes: 5 additions & 2 deletions package/lib/src/controls/canvas.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,15 @@ class CanvasControl extends StatefulWidget {
final Control control;
final List<Control> children;
final bool parentDisabled;
final bool? parentAdaptive;

const CanvasControl(
{super.key,
this.parent,
required this.control,
required this.children,
required this.parentDisabled});
required this.parentDisabled,
required this.parentAdaptive});

@override
State<CanvasControl> createState() => _CanvasControlState();
Expand Down Expand Up @@ -108,7 +110,8 @@ class _CanvasControlState extends State<CanvasControl>
),
child: viewModel.child != null
? createControl(viewModel.control, viewModel.child!.id,
viewModel.control.isDisabled)
viewModel.control.isDisabled,
parentAdaptive: widget.parentAdaptive)
: null,
);

Expand Down

0 comments on commit 417607f

Please sign in to comment.