Skip to content

Commit f3171b0

Browse files
committed
Container, padding, margin from JSON
1 parent c7198d7 commit f3171b0

File tree

15 files changed

+303
-65
lines changed

15 files changed

+303
-65
lines changed

client/lib/controls/container.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'package:flet_view/controls/create_control.dart';
2+
import 'package:flet_view/controls/error.dart';
3+
import 'package:flet_view/utils/colors.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter/widgets.dart';
6+
7+
import '../models/control.dart';
8+
9+
class ContainerControl extends StatelessWidget {
10+
final Control? parent;
11+
final Control control;
12+
final List<Control> children;
13+
final bool parentDisabled;
14+
15+
const ContainerControl(
16+
{Key? key,
17+
this.parent,
18+
required this.control,
19+
required this.children,
20+
required this.parentDisabled})
21+
: super(key: key);
22+
23+
@override
24+
Widget build(BuildContext context) {
25+
debugPrint("Icon build: ${control.id}");
26+
27+
var bgColor =
28+
HexColor.fromString(context, control.attrString("bgColor", "")!);
29+
var contentCtrls = children.where((c) => c.name == "content");
30+
bool disabled = control.isDisabled || parentDisabled;
31+
32+
if (contentCtrls.isEmpty) {
33+
return const ErrorControl("Container does not contain any content.");
34+
}
35+
36+
return constrainedControl(
37+
Container(
38+
color: bgColor,
39+
padding: parseEdgeInsets(control, "padding"),
40+
margin: parseEdgeInsets(control, "margin"),
41+
alignment: parseAlignment(control, "alignment"),
42+
child: createControl(control, contentCtrls.first.id, disabled)),
43+
parent,
44+
control);
45+
}
46+
}

client/lib/controls/create_control.dart

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import 'dart:convert';
22

3+
import 'package:flet_view/controls/container.dart';
34
import 'package:flet_view/controls/icon.dart';
45
import 'package:flet_view/controls/image.dart';
56
import 'package:flet_view/controls/list_view.dart';
67
import 'package:flet_view/controls/snack_bar.dart';
78
import 'package:flet_view/models/control_type.dart';
9+
import 'package:flet_view/utils/alignment.dart';
10+
import 'package:flet_view/utils/edge_insets.dart';
811
import 'package:flutter/material.dart';
912
import 'package:flutter_redux/flutter_redux.dart';
1013

@@ -88,6 +91,12 @@ Widget createControl(Control? parent, String id, bool parentDisabled) {
8891
control: controlView.control,
8992
children: controlView.children,
9093
parentDisabled: parentDisabled);
94+
case ControlType.container:
95+
return ContainerControl(
96+
parent: parent,
97+
control: controlView.control,
98+
children: controlView.children,
99+
parentDisabled: parentDisabled);
91100
case ControlType.listView:
92101
return ListViewControl(
93102
parent: parent,
@@ -197,20 +206,32 @@ WrapCrossAlignment parseWrapCrossAlignment(
197206
orElse: () => defValue);
198207
}
199208

200-
EdgeInsetsGeometry? parseEdgeInsets(Control control, String propName) {
201-
var d = control.attrDouble(propName, null);
202-
if (d == null) {
209+
ThemeData? parseTheme(Control control, String propName) {
210+
var v = control.attrString(propName, null);
211+
if (v == null) {
212+
return null;
213+
}
214+
215+
final j1 = json.decode(v);
216+
return themeFromJson(j1);
217+
}
218+
219+
EdgeInsets? parseEdgeInsets(Control control, String propName) {
220+
var v = control.attrString(propName, null);
221+
if (v == null) {
203222
return null;
204223
}
205-
return EdgeInsets.all(d);
224+
225+
final j1 = json.decode(v);
226+
return edgeInsetsFromJson(j1);
206227
}
207228

208-
ThemeData? parseTheme(Control control, String propName) {
229+
Alignment? parseAlignment(Control control, String propName) {
209230
var v = control.attrString(propName, null);
210231
if (v == null) {
211232
return null;
212233
}
213234

214235
final j1 = json.decode(v);
215-
return themeFromJson(j1);
236+
return alignmentFromJson(j1);
216237
}

client/lib/utils/alignment.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:flutter/cupertino.dart';
2+
3+
Alignment alignmentFromJson(Map<String, dynamic> json) {
4+
return Alignment(json['x'] as double, json['y'] as double);
5+
}

client/lib/utils/edge_insets.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:flutter/cupertino.dart';
2+
3+
EdgeInsets edgeInsetsFromJson(Map<String, dynamic> json) {
4+
return EdgeInsets.fromLTRB(json['left'] as double, json['top'] as double,
5+
json['right'] as double, json['bottom'] as double);
6+
}

sdk/python/flet/alert_dialog.py

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import json
12
from typing import List, Optional
23

34
from beartype import beartype
45

5-
from flet.control import Control, MainAxisAlignment, OptionalNumber
6+
from flet import padding
7+
from flet.control import Control, MainAxisAlignment, OptionalNumber, PaddingValue
68
from flet.ref import Ref
79

810
try:
@@ -24,11 +26,11 @@ def __init__(
2426
open: bool = False,
2527
modal: bool = False,
2628
title: Control = None,
27-
title_padding: OptionalNumber = None,
29+
title_padding: PaddingValue = None,
2830
content: Control = None,
29-
content_padding: OptionalNumber = None,
31+
content_padding: PaddingValue = None,
3032
actions: List[Control] = None,
31-
actions_padding: OptionalNumber = None,
33+
actions_padding: PaddingValue = None,
3234
actions_alignment: MainAxisAlignment = None,
3335
):
3436

@@ -100,11 +102,17 @@ def title(self, value):
100102
# title_padding
101103
@property
102104
def title_padding(self):
103-
return self._get_attr("titlePadding")
105+
return self.__title_padding
104106

105107
@title_padding.setter
106-
def title_padding(self, value):
107-
self._set_attr("titlePadding", value)
108+
@beartype
109+
def title_padding(self, value: PaddingValue):
110+
self.__title_padding = value
111+
if value and isinstance(value, (int, float)):
112+
value = padding.all(value)
113+
self._set_attr(
114+
"titlePadding", json.dumps(value, default=vars) if value else None
115+
)
108116

109117
# content
110118
@property
@@ -118,11 +126,17 @@ def content(self, value):
118126
# content_padding
119127
@property
120128
def content_padding(self):
121-
return self._get_attr("contentPadding")
129+
return self.__content_padding
122130

123131
@content_padding.setter
124-
def content_padding(self, value):
125-
self._set_attr("contentPadding", value)
132+
@beartype
133+
def content_padding(self, value: PaddingValue):
134+
self.__content_padding = value
135+
if value and isinstance(value, (int, float)):
136+
value = padding.all(value)
137+
self._set_attr(
138+
"contentPadding", json.dumps(value, default=vars) if value else None
139+
)
126140

127141
# actions
128142
@property
@@ -136,11 +150,17 @@ def actions(self, value):
136150
# actions_padding
137151
@property
138152
def actions_padding(self):
139-
return self._get_attr("actionsPadding")
153+
return self.__actions_padding
140154

141155
@actions_padding.setter
142-
def actions_padding(self, value):
143-
self._set_attr("actionsPadding", value)
156+
@beartype
157+
def actions_padding(self, value: PaddingValue):
158+
self.__actions_padding = value
159+
if value and isinstance(value, (int, float)):
160+
value = padding.all(value)
161+
self._set_attr(
162+
"actionsPadding", json.dumps(value, default=vars) if value else None
163+
)
144164

145165
# actions_alignment
146166
@property

sdk/python/flet/alignment.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import dataclasses
2+
from typing import Union
3+
4+
from beartype._decor.main import beartype
5+
6+
7+
@beartype
8+
@dataclasses.dataclass
9+
class Alignment:
10+
x: Union[float, int]
11+
y: Union[float, int]
12+
13+
14+
bottom_center = Alignment(0, 1)
15+
bottom_left = Alignment(-1, 1)
16+
bottom_right = Alignment(1, 1)
17+
center = Alignment(0, 0)
18+
center_left = Alignment(-1, 0)
19+
center_right = Alignment(1, 0)
20+
top_center = Alignment(0, -1)
21+
top_left = Alignment(-1, -1)
22+
top_right = Alignment(1, -1)

sdk/python/flet/banner.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import json
12
from typing import List, Optional
23

34
from beartype import beartype
45

5-
from flet.control import Control, MainAxisAlignment, OptionalNumber
6+
from flet import padding
7+
from flet.control import Control, MainAxisAlignment, OptionalNumber, PaddingValue
68
from flet.ref import Ref
79

810
try:
@@ -23,9 +25,9 @@ def __init__(
2325
#
2426
open: bool = False,
2527
leading: Control = None,
26-
leading_padding: OptionalNumber = None,
28+
leading_padding: PaddingValue = None,
2729
content: Control = None,
28-
content_padding: OptionalNumber = None,
30+
content_padding: PaddingValue = None,
2931
actions: List[Control] = None,
3032
force_actions_below: bool = None,
3133
bgcolor: str = None,
@@ -98,11 +100,17 @@ def leading(self, value):
98100
# leading_padding
99101
@property
100102
def leading_padding(self):
101-
return self._get_attr("titlePadding")
103+
return self.__leading_padding
102104

103105
@leading_padding.setter
104-
def leading_padding(self, value):
105-
self._set_attr("titlePadding", value)
106+
@beartype
107+
def leading_padding(self, value: PaddingValue):
108+
self.__leading_padding = value
109+
if value and isinstance(value, (int, float)):
110+
value = padding.all(value)
111+
self._set_attr(
112+
"leadingPadding", json.dumps(value, default=vars) if value else None
113+
)
106114

107115
# content
108116
@property
@@ -116,11 +124,17 @@ def content(self, value):
116124
# content_padding
117125
@property
118126
def content_padding(self):
119-
return self._get_attr("contentPadding")
127+
return self.__content_padding
120128

121129
@content_padding.setter
122-
def content_padding(self, value):
123-
self._set_attr("contentPadding", value)
130+
@beartype
131+
def content_padding(self, value: PaddingValue):
132+
self.__content_padding = value
133+
if value and isinstance(value, (int, float)):
134+
value = padding.all(value)
135+
self._set_attr(
136+
"contentPadding", json.dumps(value, default=vars) if value else None
137+
)
124138

125139
# actions
126140
@property

0 commit comments

Comments
 (0)