Skip to content

Commit

Permalink
Customize colors of Checkbox and Radio
Browse files Browse the repository at this point in the history
Fix #320
  • Loading branch information
FeodorFitsner committed Oct 6, 2022
1 parent fcfc57d commit 2235996
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 3 deletions.
6 changes: 6 additions & 0 deletions package/lib/src/controls/checkbox.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import '../flet_app_services.dart';
import '../models/app_state.dart';
import '../models/control.dart';
import '../protocol/update_control_props_payload.dart';
import '../utils/buttons.dart';
import '../utils/colors.dart';
import 'create_control.dart';

enum LabelPosition { right, left }
Expand Down Expand Up @@ -100,6 +102,10 @@ class _CheckboxControlState extends State<CheckboxControl> {
autofocus: autofocus,
focusNode: _focusNode,
value: _value,
checkColor: HexColor.fromString(Theme.of(context),
widget.control.attrString("checkColor", "")!),
fillColor: parseMaterialStateColor(
Theme.of(context), widget.control, "fillColor"),
tristate: tristate,
onChanged: !disabled
? (bool? value) {
Expand Down
3 changes: 3 additions & 0 deletions package/lib/src/controls/radio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import '../models/control.dart';
import '../models/control_ancestor_view_model.dart';
import '../models/control_type.dart';
import '../protocol/update_control_props_payload.dart';
import '../utils/buttons.dart';
import 'create_control.dart';
import 'error.dart';

Expand Down Expand Up @@ -103,6 +104,8 @@ class _RadioControlState extends State<RadioControl> {
focusNode: _focusNode,
groupValue: groupValue,
value: value,
fillColor: parseMaterialStateColor(
Theme.of(context), widget.control, "fillColor"),
onChanged: !disabled
? (String? value) {
onChange(value);
Expand Down
18 changes: 15 additions & 3 deletions package/lib/src/utils/buttons.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'dart:convert';

import 'borders.dart';
import 'edge_insets.dart';
import 'numbers.dart';
import 'package:flutter/material.dart';

import '../models/control.dart';
import 'borders.dart';
import 'colors.dart';
import 'edge_insets.dart';
import 'numbers.dart';

ButtonStyle? parseButtonStyle(ThemeData theme, Control control, String propName,
{required Color defaultForegroundColor,
Expand Down Expand Up @@ -38,6 +38,18 @@ ButtonStyle? parseButtonStyle(ThemeData theme, Control control, String propName,
defaultShape);
}

MaterialStateProperty<Color?>? parseMaterialStateColor(
ThemeData theme, Control control, String propName) {
var v = control.attrString(propName, null);
if (v == null) {
return null;
}

final j1 = json.decode(v);
return getMaterialStateProperty(
j1, (jv) => HexColor.fromString(theme, jv as String), null);
}

ButtonStyle? buttonStyleFromJSON(
ThemeData theme,
Map<String, dynamic> json,
Expand Down
32 changes: 32 additions & 0 deletions sdk/python/flet/checkbox.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from typing import Any, Optional, Union

from beartype import beartype
from beartype.typing import Dict

from flet.buttons import MaterialState
from flet.constrained_control import ConstrainedControl
from flet.control import OptionalNumber
from flet.ref import Ref
Expand Down Expand Up @@ -50,6 +52,8 @@ def __init__(
value: Optional[bool] = None,
tristate: Optional[bool] = None,
autofocus: Optional[bool] = None,
fill_color: Union[None, str, Dict[MaterialState, str]] = None,
check_color: Optional[str] = None,
on_change=None,
on_focus=None,
on_blur=None,
Expand Down Expand Up @@ -85,13 +89,22 @@ def __init__(
self.label = label
self.label_position = label_position
self.autofocus = autofocus
self.check_color = check_color
self.fill_color = fill_color
self.on_change = on_change
self.on_focus = on_focus
self.on_blur = on_blur

def _get_control_name(self):
return "checkbox"

def _before_build_command(self):
super()._before_build_command()
fc = self.__fill_color
if fc is not None and not isinstance(fc, Dict):
fc = {"": fc}
self._set_attr_json("fillColor", fc)

# value
@property
def value(self) -> Optional[bool]:
Expand Down Expand Up @@ -143,6 +156,25 @@ def autofocus(self) -> Optional[bool]:
def autofocus(self, value: Optional[bool]):
self._set_attr("autofocus", value)

# check_color
@property
def check_color(self):
return self._get_attr("checkColor")

@check_color.setter
def check_color(self, value):
self._set_attr("checkColor", value)

# fill_color
@property
def fill_color(self) -> Union[None, str, Dict[MaterialState, str]]:
return self.__fill_color

@fill_color.setter
@beartype
def fill_color(self, value: Union[None, str, Dict[MaterialState, str]]):
self.__fill_color = value

# on_change
@property
def on_change(self):
Expand Down
21 changes: 21 additions & 0 deletions sdk/python/flet/radio.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from typing import Any, Optional, Union

from beartype import beartype
from beartype.typing import Dict

from flet.buttons import MaterialState
from flet.constrained_control import ConstrainedControl
from flet.control import OptionalNumber
from flet.ref import Ref
Expand Down Expand Up @@ -49,6 +51,7 @@ def __init__(
label_position: LabelPosition = None,
value: Optional[str] = None,
autofocus: Optional[bool] = None,
fill_color: Union[None, str, Dict[MaterialState, str]] = None,
on_focus=None,
on_blur=None,
):
Expand Down Expand Up @@ -82,12 +85,20 @@ def __init__(
self.label = label
self.label_position = label_position
self.autofocus = autofocus
self.fill_color = fill_color
self.on_focus = on_focus
self.on_blur = on_blur

def _get_control_name(self):
return "radio"

def _before_build_command(self):
super()._before_build_command()
fc = self.__fill_color
if fc is not None and not isinstance(fc, Dict):
fc = {"": fc}
self._set_attr_json("fillColor", fc)

# value
@property
def value(self):
Expand Down Expand Up @@ -116,6 +127,16 @@ def label_position(self) -> LabelPosition:
def label_position(self, value: LabelPosition):
self._set_attr("labelPosition", value)

# fill_color
@property
def fill_color(self) -> Union[None, str, Dict[MaterialState, str]]:
return self.__fill_color

@fill_color.setter
@beartype
def fill_color(self, value: Union[None, str, Dict[MaterialState, str]]):
self.__fill_color = value

# on_focus
@property
def on_focus(self):
Expand Down

0 comments on commit 2235996

Please sign in to comment.