Skip to content

Commit 31fa0f1

Browse files
committed
Container control
1 parent f3171b0 commit 31fa0f1

File tree

14 files changed

+225
-50
lines changed

14 files changed

+225
-50
lines changed

client/lib/controls/container.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ class ContainerControl extends StatelessWidget {
3535

3636
return constrainedControl(
3737
Container(
38-
color: bgColor,
3938
padding: parseEdgeInsets(control, "padding"),
4039
margin: parseEdgeInsets(control, "margin"),
4140
alignment: parseAlignment(control, "alignment"),
41+
decoration: BoxDecoration(
42+
color: bgColor,
43+
border: parseBorder(context, control, "border"),
44+
borderRadius: parseBorderRadius(control, "borderRadius")),
4245
child: createControl(control, contentCtrls.first.id, disabled)),
4346
parent,
4447
control);

client/lib/controls/create_control.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:flet_view/controls/list_view.dart';
77
import 'package:flet_view/controls/snack_bar.dart';
88
import 'package:flet_view/models/control_type.dart';
99
import 'package:flet_view/utils/alignment.dart';
10+
import 'package:flet_view/utils/borders.dart';
1011
import 'package:flet_view/utils/edge_insets.dart';
1112
import 'package:flutter/material.dart';
1213
import 'package:flutter_redux/flutter_redux.dart';
@@ -235,3 +236,23 @@ Alignment? parseAlignment(Control control, String propName) {
235236
final j1 = json.decode(v);
236237
return alignmentFromJson(j1);
237238
}
239+
240+
BorderRadius? parseBorderRadius(Control control, String propName) {
241+
var v = control.attrString(propName, null);
242+
if (v == null) {
243+
return null;
244+
}
245+
246+
final j1 = json.decode(v);
247+
return borderRadiusFromJSON(j1);
248+
}
249+
250+
Border? parseBorder(BuildContext context, Control control, String propName) {
251+
var v = control.attrString(propName, null);
252+
if (v == null) {
253+
return null;
254+
}
255+
256+
final j1 = json.decode(v);
257+
return borderFromJSON(context, j1);
258+
}

client/lib/utils/borders.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:flet_view/utils/colors.dart';
2+
import 'package:flutter/material.dart';
3+
4+
BorderRadius borderRadiusFromJSON(Map<String, dynamic> json) {
5+
return BorderRadius.only(
6+
topLeft: Radius.circular(json['tl'] as double),
7+
topRight: Radius.circular(json['tr'] as double),
8+
bottomLeft: Radius.circular(json['bl'] as double),
9+
bottomRight: Radius.circular(json['br'] as double),
10+
);
11+
}
12+
13+
Border borderFromJSON(BuildContext? context, Map<String, dynamic> json) {
14+
return Border(
15+
top: borderSideFromJSON(context, json['t']),
16+
right: borderSideFromJSON(context, json['r']),
17+
bottom: borderSideFromJSON(context, json['b']),
18+
left: borderSideFromJSON(context, json['l']));
19+
}
20+
21+
BorderSide borderSideFromJSON(
22+
BuildContext? context, Map<String, dynamic> json) {
23+
return BorderSide(
24+
color: json['c'] != null
25+
? HexColor.fromString(context, json['c'] as String) ?? Colors.black
26+
: Colors.black,
27+
width: json['w'] ?? 1,
28+
style: BorderStyle.solid);
29+
}

client/lib/utils/edge_insets.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:flutter/cupertino.dart';
22

33
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);
4+
return EdgeInsets.fromLTRB(json['l'] as double, json['t'] as double,
5+
json['r'] as double, json['b'] as double);
66
}

sdk/python/flet/alert_dialog.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from flet import padding
77
from flet.control import Control, MainAxisAlignment, OptionalNumber, PaddingValue
8+
from flet.embed_json_encoder import EmbedJsonEncoder
89
from flet.ref import Ref
910

1011
try:
@@ -111,7 +112,7 @@ def title_padding(self, value: PaddingValue):
111112
if value and isinstance(value, (int, float)):
112113
value = padding.all(value)
113114
self._set_attr(
114-
"titlePadding", json.dumps(value, default=vars) if value else None
115+
"titlePadding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
115116
)
116117

117118
# content
@@ -135,7 +136,7 @@ def content_padding(self, value: PaddingValue):
135136
if value and isinstance(value, (int, float)):
136137
value = padding.all(value)
137138
self._set_attr(
138-
"contentPadding", json.dumps(value, default=vars) if value else None
139+
"contentPadding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
139140
)
140141

141142
# actions
@@ -159,7 +160,7 @@ def actions_padding(self, value: PaddingValue):
159160
if value and isinstance(value, (int, float)):
160161
value = padding.all(value)
161162
self._set_attr(
162-
"actionsPadding", json.dumps(value, default=vars) if value else None
163+
"actionsPadding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
163164
)
164165

165166
# actions_alignment

sdk/python/flet/banner.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from flet import padding
77
from flet.control import Control, MainAxisAlignment, OptionalNumber, PaddingValue
8+
from flet.embed_json_encoder import EmbedJsonEncoder
89
from flet.ref import Ref
910

1011
try:
@@ -109,7 +110,7 @@ def leading_padding(self, value: PaddingValue):
109110
if value and isinstance(value, (int, float)):
110111
value = padding.all(value)
111112
self._set_attr(
112-
"leadingPadding", json.dumps(value, default=vars) if value else None
113+
"leadingPadding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
113114
)
114115

115116
# content
@@ -133,7 +134,7 @@ def content_padding(self, value: PaddingValue):
133134
if value and isinstance(value, (int, float)):
134135
value = padding.all(value)
135136
self._set_attr(
136-
"contentPadding", json.dumps(value, default=vars) if value else None
137+
"contentPadding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
137138
)
138139

139140
# actions

sdk/python/flet/border.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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 BorderSide:
10+
width: Union[None, float, int]
11+
color: str = dataclasses.field(default=None)
12+
13+
14+
@beartype
15+
@dataclasses.dataclass
16+
class Border:
17+
top: BorderSide
18+
right: BorderSide
19+
bottom: BorderSide
20+
left: BorderSide
21+
22+
23+
def all(width: float = None, color: str = None):
24+
bs = BorderSide(width, color)
25+
return Border(left=bs, top=bs, right=bs, bottom=bs)
26+
27+
28+
def symmetric(vertical: BorderSide = None, horizontal: BorderSide = None):
29+
return Border(left=horizontal, top=vertical, right=horizontal, bottom=vertical)
30+
31+
32+
def only(
33+
left: BorderSide = None,
34+
top: BorderSide = None,
35+
right: BorderSide = None,
36+
bottom: BorderSide = None,
37+
):
38+
return Border(left=left, top=top, right=right, bottom=bottom)

sdk/python/flet/border_radius.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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 BorderRadius:
10+
topLeft: Union[float, int]
11+
topRight: Union[float, int]
12+
bottomLeft: Union[float, int]
13+
bottomRight: Union[float, int]
14+
15+
16+
def all(value: float):
17+
return BorderRadius(
18+
topLeft=value, topRight=value, bottomLeft=value, bottomRight=value
19+
)
20+
21+
22+
def horizontal(left: float = 0, right: float = 0):
23+
return BorderRadius(
24+
topLeft=left, topRight=right, bottomLeft=left, bottomRight=right
25+
)
26+
27+
28+
def vertical(top: float = 0, bottom: float = 0):
29+
return BorderRadius(
30+
topLeft=top, topRight=top, bottomLeft=bottom, bottomRight=bottom
31+
)
32+
33+
34+
def only(
35+
topLeft: float = 0,
36+
topRight: float = 0,
37+
bottomLeft: float = 0,
38+
bottomRight: float = 0,
39+
):
40+
return BorderRadius(
41+
topLeft=topLeft,
42+
topRight=topRight,
43+
bottomLeft=bottomLeft,
44+
bottomRight=bottomRight,
45+
)

sdk/python/flet/container.py

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33

44
from beartype import beartype
55

6-
from flet import margin, padding
6+
from flet import border_radius, margin, padding
77
from flet.alignment import Alignment
8+
from flet.border import Border
9+
from flet.border_radius import BorderRadius
810
from flet.constrained_control import ConstrainedControl
911
from flet.control import BorderStyle, Control, MarginValue, OptionalNumber, PaddingValue
12+
from flet.embed_json_encoder import EmbedJsonEncoder
1013
from flet.ref import Ref
1114

1215
try:
@@ -34,10 +37,8 @@ def __init__(
3437
margin: MarginValue = None,
3538
alignment: Alignment = None,
3639
bgcolor: str = None,
37-
border_color: str = None,
38-
border_width: OptionalNumber = None,
39-
border_style: BorderStyle = None,
40-
border_radius: OptionalNumber = None,
40+
border: Border = None,
41+
border_radius: BorderRadius = None,
4142
):
4243
ConstrainedControl.__init__(
4344
self,
@@ -56,9 +57,7 @@ def __init__(
5657
self.margin = margin
5758
self.alignment = alignment
5859
self.bgcolor = bgcolor
59-
self.border_color = border_color
60-
self.border_width = border_width
61-
self.border_style = border_style
60+
self.border = border
6261
self.border_radius = border_radius
6362

6463
def _get_control_name(self):
@@ -92,7 +91,9 @@ def padding(self, value: PaddingValue):
9291
self.__padding = value
9392
if value and isinstance(value, (int, float)):
9493
value = padding.all(value)
95-
self._set_attr("padding", json.dumps(value, default=vars) if value else None)
94+
self._set_attr(
95+
"padding", json.dumps(value, cls=EmbedJsonEncoder) if value else None
96+
)
9697

9798
# margin
9899
@property
@@ -105,7 +106,9 @@ def margin(self, value: MarginValue):
105106
self.__margin = value
106107
if value and isinstance(value, (int, float)):
107108
value = margin.all(value)
108-
self._set_attr("margin", json.dumps(value, default=vars) if value else None)
109+
self._set_attr(
110+
"margin", json.dumps(value, cls=EmbedJsonEncoder) if value else None
111+
)
109112

110113
# bgcolor
111114
@property
@@ -116,43 +119,33 @@ def bgcolor(self):
116119
def bgcolor(self, value):
117120
self._set_attr("bgColor", value)
118121

119-
# border_color
122+
# border
120123
@property
121-
def border_color(self):
122-
return self._get_attr("borderColor")
124+
def border(self):
125+
return self.__border
123126

124-
@border_color.setter
125-
def border_color(self, value):
126-
self._set_attr("borderColor", value)
127-
128-
# border_width
129-
@property
130-
def border_width(self) -> OptionalNumber:
131-
return self._get_attr("borderWidth")
132-
133-
@border_width.setter
127+
@border.setter
134128
@beartype
135-
def border_width(self, value: OptionalNumber):
136-
self._set_attr("borderWidth", value)
137-
138-
# border_style
139-
@property
140-
def border_style(self):
141-
return self._get_attr("borderStyle")
142-
143-
@border_style.setter
144-
@beartype
145-
def border_style(self, value: BorderStyle):
146-
self._set_attr("borderStyle", value)
129+
def border(self, value: Optional[Border]):
130+
self.__border = value
131+
self._set_attr(
132+
"border", json.dumps(value, cls=EmbedJsonEncoder) if value else None
133+
)
147134

148135
# border_radius
149136
@property
150137
def border_radius(self):
151-
return self._get_attr("borderRadius")
138+
return self.__border_radius
152139

153140
@border_radius.setter
154-
def border_radius(self, value):
155-
self._set_attr("borderRadius", value)
141+
@beartype
142+
def border_radius(self, value: Optional[BorderRadius]):
143+
self.__border_radius = value
144+
if value and isinstance(value, (int, float)):
145+
value = border_radius.all(value)
146+
self._set_attr(
147+
"borderRadius", json.dumps(value, cls=EmbedJsonEncoder) if value else None
148+
)
156149

157150
# content
158151
@property
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import json
2+
3+
from flet.border import Border, BorderSide
4+
from flet.border_radius import BorderRadius
5+
from flet.margin import Margin
6+
from flet.padding import Padding
7+
8+
9+
class EmbedJsonEncoder(json.JSONEncoder):
10+
def default(self, obj):
11+
if isinstance(obj, BorderSide):
12+
return {
13+
"w": obj.width,
14+
"c": obj.color,
15+
}
16+
elif isinstance(obj, Border):
17+
return {
18+
"l": obj.left,
19+
"t": obj.top,
20+
"r": obj.right,
21+
"b": obj.bottom,
22+
}
23+
elif isinstance(obj, BorderRadius):
24+
return {
25+
"bl": obj.bottomLeft,
26+
"br": obj.bottomRight,
27+
"tl": obj.topLeft,
28+
"tr": obj.topRight,
29+
}
30+
elif isinstance(obj, (Margin, Padding)):
31+
return {
32+
"l": obj.left,
33+
"t": obj.top,
34+
"r": obj.right,
35+
"b": obj.bottom,
36+
}
37+
elif isinstance(obj, object):
38+
return obj.__dict__
39+
return json.JSONEncoder.default(self, obj)

0 commit comments

Comments
 (0)