| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'template.dart'; |
| |
| class SwitchTemplate extends TokenTemplate { |
| const SwitchTemplate(super.blockName, super.fileName, super.tokens, { |
| super.colorSchemePrefix = '_colors.', |
| }); |
| |
| @override |
| String generate() => ''' |
| class _${blockName}DefaultsM3 extends SwitchThemeData { |
| _${blockName}DefaultsM3(BuildContext context) |
| : _colors = Theme.of(context).colorScheme; |
| |
| final ColorScheme _colors; |
| |
| @override |
| MaterialStateProperty<Color> get thumbColor { |
| return MaterialStateProperty.resolveWith((Set<MaterialState> states) { |
| if (states.contains(MaterialState.disabled)) { |
| if (states.contains(MaterialState.selected)) { |
| return ${componentColor('md.comp.switch.disabled.selected.handle')}; |
| } |
| return ${componentColor('md.comp.switch.disabled.unselected.handle')}; |
| } |
| if (states.contains(MaterialState.selected)) { |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.selected.pressed.handle')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.selected.hover.handle')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.selected.focus.handle')}; |
| } |
| return ${componentColor('md.comp.switch.selected.handle')}; |
| } |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.unselected.pressed.handle')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.unselected.hover.handle')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.unselected.focus.handle')}; |
| } |
| return ${componentColor('md.comp.switch.unselected.handle')}; |
| }); |
| } |
| |
| @override |
| MaterialStateProperty<Color> get trackColor { |
| return MaterialStateProperty.resolveWith((Set<MaterialState> states) { |
| if (states.contains(MaterialState.disabled)) { |
| if (states.contains(MaterialState.selected)) { |
| return ${componentColor('md.comp.switch.disabled.selected.track')}.withOpacity(${opacity('md.comp.switch.disabled.track.opacity')}); |
| } |
| return ${componentColor('md.comp.switch.disabled.unselected.track')}.withOpacity(${opacity('md.comp.switch.disabled.track.opacity')}); |
| } |
| if (states.contains(MaterialState.selected)) { |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.selected.pressed.track')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.selected.hover.track')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.selected.focus.track')}; |
| } |
| return ${componentColor('md.comp.switch.selected.track')}; |
| } |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.unselected.pressed.track')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.unselected.hover.track')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.unselected.focus.track')}; |
| } |
| return ${componentColor('md.comp.switch.unselected.track')}; |
| }); |
| } |
| |
| @override |
| MaterialStateProperty<Color?> get overlayColor { |
| return MaterialStateProperty.resolveWith((Set<MaterialState> states) { |
| if (states.contains(MaterialState.selected)) { |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.selected.pressed.state-layer')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.selected.hover.state-layer')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.selected.focus.state-layer')}; |
| } |
| return null; |
| } |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.unselected.pressed.state-layer')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.unselected.hover.state-layer')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.unselected.focus.state-layer')}; |
| } |
| return null; |
| }); |
| } |
| |
| @override |
| double get splashRadius => ${tokens['md.comp.switch.state-layer.size']} / 2; |
| } |
| |
| class _SwitchConfigM3 with _SwitchConfig { |
| _SwitchConfigM3(this.context) |
| : _colors = Theme.of(context).colorScheme; |
| |
| BuildContext context; |
| final ColorScheme _colors; |
| |
| static const double iconSize = ${tokens['md.comp.switch.unselected.icon.size']}; |
| |
| @override |
| double get activeThumbRadius => ${tokens['md.comp.switch.selected.handle.width']} / 2; |
| |
| @override |
| MaterialStateProperty<Color> get iconColor { |
| return MaterialStateProperty.resolveWith((Set<MaterialState> states) { |
| if (states.contains(MaterialState.disabled)) { |
| if (states.contains(MaterialState.selected)) { |
| return ${componentColor('md.comp.switch.disabled.selected.icon')}; |
| } |
| return ${componentColor('md.comp.switch.disabled.unselected.icon')}; |
| } |
| if (states.contains(MaterialState.selected)) { |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.selected.pressed.icon')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.selected.hover.icon')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.selected.focus.icon')}; |
| } |
| return ${componentColor('md.comp.switch.selected.icon')}; |
| } |
| if (states.contains(MaterialState.pressed)) { |
| return ${componentColor('md.comp.switch.unselected.pressed.icon')}; |
| } |
| if (states.contains(MaterialState.hovered)) { |
| return ${componentColor('md.comp.switch.unselected.hover.icon')}; |
| } |
| if (states.contains(MaterialState.focused)) { |
| return ${componentColor('md.comp.switch.unselected.focus.icon')}; |
| } |
| return ${componentColor('md.comp.switch.unselected.icon')}; |
| }); |
| } |
| |
| @override |
| double get inactiveThumbRadius => ${tokens['md.comp.switch.unselected.handle.width']} / 2; |
| |
| @override |
| double get pressedThumbRadius => ${tokens['md.comp.switch.pressed.handle.width']} / 2; |
| |
| @override |
| double get switchHeight => _kSwitchMinSize + 8.0; |
| |
| @override |
| double get switchHeightCollapsed => _kSwitchMinSize; |
| |
| @override |
| double get switchWidth => trackWidth - 2 * (trackHeight / 2.0) + _kSwitchMinSize; |
| |
| @override |
| double get thumbRadiusWithIcon => ${tokens['md.comp.switch.with-icon.handle.width']} / 2; |
| |
| @override |
| List<BoxShadow>? get thumbShadow => kElevationToShadow[0]; |
| |
| @override |
| double get trackHeight => ${tokens['md.comp.switch.track.height']}; |
| |
| @override |
| MaterialStateProperty<Color?> get trackOutlineColor { |
| return MaterialStateProperty.resolveWith((Set<MaterialState> states) { |
| if (states.contains(MaterialState.selected)) { |
| return null; |
| } |
| if (states.contains(MaterialState.disabled)) { |
| return ${componentColor('md.comp.switch.disabled.unselected.track.outline')}.withOpacity(${opacity('md.comp.switch.disabled.track.opacity')}); |
| } |
| return ${componentColor('md.comp.switch.unselected.track.outline')}; |
| }); |
| } |
| |
| @override |
| double get trackWidth => ${tokens['md.comp.switch.track.width']}; |
| } |
| '''; |
| |
| } |