/
magnusroot
/
flutter
Обзор
Документация
Войти
/
magnusroot
/
flutter
Код
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
dev/tools/gen_defaults/lib/button_template.dart
191 строка
6 KB
Camille Simon
[Material] Change default mouse cursor of buttons to basic arrow instead of click (except on web) (#171796)
24 окт 2025, 01:24
Не верифицирован
24 окт 2025, 01:24
7fd228f
Код
Авторство
О чём код?
// 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 ButtonTemplate extends TokenTemplate { const ButtonTemplate( this.tokenGroup, super.blockName, super.fileName, super.tokens, { super.colorSchemePrefix = '_colors.', }); final String tokenGroup; String _backgroundColor() { if (tokenAvailable('$tokenGroup.container.color')) { return ''' WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.disabled)) { return ${componentColor('$tokenGroup.disabled.container')}; } return ${componentColor('$tokenGroup.container')}; })'''; } return ''' const MaterialStatePropertyAll<Color>(Colors.transparent)'''; } String _elevation() { if (tokenAvailable('$tokenGroup.container.elevation')) { return ''' WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.disabled)) { return ${elevation("$tokenGroup.disabled.container")}; } if (states.contains(WidgetState.pressed)) { return ${elevation("$tokenGroup.pressed.container")}; } if (states.contains(WidgetState.hovered)) { return ${elevation("$tokenGroup.hover.container")}; } if (states.contains(WidgetState.focused)) { return ${elevation("$tokenGroup.focus.container")}; } return ${elevation("$tokenGroup.container")}; })'''; } return ''' const MaterialStatePropertyAll<double>(0.0)'''; } String _elevationColor(String token) { if (tokenAvailable(token)) { return 'MaterialStatePropertyAll<Color>(${color(token)})'; } else { return 'const MaterialStatePropertyAll<Color>(Colors.transparent)'; } } @override String generate() => ''' class _${blockName}DefaultsM3 extends ButtonStyle { _${blockName}DefaultsM3(this.context) : super( animationDuration: kThemeChangeDuration, enableFeedback: true, alignment: Alignment.center, ); final BuildContext context; late final ColorScheme _colors = Theme.of(context).colorScheme; @override WidgetStateProperty<TextStyle?> get textStyle => MaterialStatePropertyAll<TextStyle?>(${textStyle("$tokenGroup.label-text")}); @override WidgetStateProperty<Color?>? get backgroundColor =>${_backgroundColor()}; @override WidgetStateProperty<Color?>? get foregroundColor => WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.disabled)) { return ${componentColor('$tokenGroup.disabled.label-text')}; } return ${componentColor('$tokenGroup.label-text')}; }); @override WidgetStateProperty<Color?>? get overlayColor => WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.pressed)) { return ${componentColor('$tokenGroup.pressed.state-layer')}; } if (states.contains(WidgetState.hovered)) { return ${componentColor('$tokenGroup.hover.state-layer')}; } if (states.contains(WidgetState.focused)) { return ${componentColor('$tokenGroup.focus.state-layer')}; } return null; }); @override WidgetStateProperty<Color>? get shadowColor => ${_elevationColor("$tokenGroup.container.shadow-color")}; @override WidgetStateProperty<Color>? get surfaceTintColor => ${_elevationColor("$tokenGroup.container.surface-tint-layer.color")}; @override WidgetStateProperty<double>? get elevation =>${_elevation()}; @override WidgetStateProperty<EdgeInsetsGeometry>? get padding => MaterialStatePropertyAll<EdgeInsetsGeometry>(_scaledPadding(context)); @override WidgetStateProperty<Size>? get minimumSize => const MaterialStatePropertyAll<Size>(Size(64.0, ${getToken("$tokenGroup.container.height")})); // No default fixedSize @override WidgetStateProperty<double>? get iconSize => const MaterialStatePropertyAll<double>(${getToken("$tokenGroup.with-icon.icon.size")}); @override WidgetStateProperty<Color>? get iconColor { return WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.disabled)) { return ${color('$tokenGroup.with-icon.disabled.icon.color')}.withOpacity(${opacity("$tokenGroup.with-icon.disabled.icon.opacity")}); } if (states.contains(WidgetState.pressed)) { return ${color('$tokenGroup.with-icon.pressed.icon.color')}; } if (states.contains(WidgetState.hovered)) { return ${color('$tokenGroup.with-icon.hover.icon.color')}; } if (states.contains(WidgetState.focused)) { return ${color('$tokenGroup.with-icon.focus.icon.color')}; } return ${color('$tokenGroup.with-icon.icon.color')}; }); } @override WidgetStateProperty<Size>? get maximumSize => const MaterialStatePropertyAll<Size>(Size.infinite); ${tokenAvailable("$tokenGroup.outline.color") ? ''' @override WidgetStateProperty<BorderSide>? get side => WidgetStateProperty.resolveWith((Set<WidgetState> states) { if (states.contains(WidgetState.disabled)) { return ${border("$tokenGroup.disabled.outline")}; } if (states.contains(WidgetState.focused)) { return ${border('$tokenGroup.focus.outline')}; } return ${border("$tokenGroup.outline")}; });''' : ''' // No default side'''} @override WidgetStateProperty<OutlinedBorder>? get shape => const MaterialStatePropertyAll<OutlinedBorder>(${shape("$tokenGroup.container", '')}); @override WidgetStateProperty<MouseCursor?>? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; @override VisualDensity? get visualDensity => Theme.of(context).visualDensity; @override MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; @override InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; } '''; }