Skip to content

Commit 36b0198

Browse files
authored
add checkbox border side state (#2973)
1 parent 556f492 commit 36b0198

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

packages/flet/lib/src/controls/checkbox.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import 'dart:convert';
2+
13
import 'package:flutter/material.dart';
24

35
import '../flet_control_backend.dart';
46
import '../models/control.dart';
57
import '../utils/borders.dart';
68
import '../utils/colors.dart';
9+
import '../utils/material_state.dart';
710
import '../utils/mouse.dart';
811
import '../utils/text.dart';
912
import '../utils/theme.dart';
@@ -117,15 +120,17 @@ class _CheckboxControlState extends State<CheckboxControl> with FletStoreMixin {
117120
labelStyle = labelStyle.apply(color: Theme.of(context).disabledColor);
118121
}
119122

123+
MaterialStateBorderSide? side = parseMaterialStateBorderSide(
124+
Theme.of(context), widget.control, "borderSide");
125+
120126
var checkbox = Checkbox(
121127
autofocus: autofocus,
122128
focusNode: _focusNode,
123129
value: _value,
124130
isError: widget.control.attrBool("isError", false)!,
125131
semanticLabel: widget.control.attrString("semanticsLabel"),
126132
shape: parseOutlinedBorder(widget.control, "shape"),
127-
side:
128-
parseBorderSide(Theme.of(context), widget.control, "borderSide"),
133+
side: side,
129134
splashRadius: widget.control.attrDouble("splashRadius"),
130135
activeColor: widget.control.attrColor("activeColor", context),
131136
focusColor: widget.control.attrColor("focusColor", context),

packages/flet/lib/src/utils/borders.dart

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,56 @@ OutlinedBorder? outlinedBorderFromJSON(Map<String, dynamic> json) {
120120
}
121121
return null;
122122
}
123+
124+
MaterialStateBorderSide? parseMaterialStateBorderSide(
125+
ThemeData theme, Control control, String propName) {
126+
var v = control.attrString(propName, null);
127+
if (v == null) {
128+
return null;
129+
}
130+
131+
var j = json.decode(v);
132+
if (j is Map<String, dynamic> && (j.containsKey("w") || j.containsKey("c"))) {
133+
j = {"": j};
134+
}
135+
136+
return MaterialStateBorderSideFromJSON(
137+
j, (jv) => borderSideFromJSON(theme, jv, null), BorderSide.none);
138+
}
139+
140+
class MaterialStateBorderSideFromJSON extends MaterialStateBorderSide {
141+
late final Map<String, BorderSide?> _states;
142+
late final BorderSide _defaultValue;
143+
144+
MaterialStateBorderSideFromJSON(
145+
Map<String, dynamic>? jsonDictValue,
146+
BorderSide? Function(dynamic) converterFromJson,
147+
BorderSide defaultValue) {
148+
_defaultValue = defaultValue;
149+
_states = {};
150+
if (jsonDictValue != null) {
151+
jsonDictValue.forEach((stateStr, jv) {
152+
stateStr.split(",").map((s) => s.trim().toLowerCase()).forEach((state) {
153+
_states[state] = converterFromJson(jv);
154+
});
155+
});
156+
}
157+
}
158+
159+
@override
160+
BorderSide? resolve(Set<MaterialState> states) {
161+
// find specific state
162+
for (var state in states) {
163+
if (_states.containsKey(state.name)) {
164+
return _states[state.name];
165+
}
166+
}
167+
168+
// catch-all value
169+
if (_states.containsKey("")) {
170+
return _states[""];
171+
}
172+
173+
return _defaultValue;
174+
}
175+
}

sdk/python/packages/flet-core/src/flet_core/checkbox.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(
7171
semantics_label: Optional[str] = None,
7272
shape: Optional[OutlinedBorder] = None,
7373
splash_radius: OptionalNumber = None,
74-
border_side: Optional[BorderSide] = None,
74+
border_side: Union[None, BorderSide, Dict[MaterialState, BorderSide]] = None,
7575
is_error: Optional[bool] = None,
7676
visual_density: Optional[ThemeVisualDensity] = None,
7777
mouse_cursor: Optional[MouseCursor] = None,
@@ -174,10 +174,9 @@ def before_update(self):
174174
self._set_attr_json("fillColor", self.__fill_color)
175175
self._set_attr_json("overlayColor", self.__overlay_color)
176176
self._set_attr_json("shape", self.__shape)
177+
self._set_attr_json("borderSide", self.__border_side)
177178
if isinstance(self.__label_style, TextStyle):
178179
self._set_attr_json("labelStyle", self.__label_style)
179-
if isinstance(self.__border_side, BorderSide):
180-
self._set_attr_json("borderSide", self.__border_side)
181180

182181
# value
183182
@property
@@ -356,11 +355,13 @@ def is_error(self, value: Optional[bool]):
356355

357356
# border_side
358357
@property
359-
def border_side(self) -> Optional[BorderSide]:
358+
def border_side(self) -> Union[None, BorderSide, Dict[MaterialState, BorderSide]]:
360359
return self.__border_side
361360

362361
@border_side.setter
363-
def border_side(self, value: Optional[BorderSide]):
362+
def border_side(
363+
self, value: Union[None, BorderSide, Dict[MaterialState, BorderSide]]
364+
):
364365
self.__border_side = value
365366

366367
# on_change

0 commit comments

Comments
 (0)