button_template.dart 5.28 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 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, String fileName, Map<String, dynamic> tokens)
    : super(fileName, tokens,
        colorSchemePrefix: '_colors.',
      );

  final String tokenGroup;

  String _backgroundColor() {
    if (tokens.containsKey('$tokenGroup.container.color')) {
      return '''

    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
20
      if (states.contains(MaterialState.disabled)) {
21
        return ${componentColor('$tokenGroup.disabled.container')};
22
      }
23 24 25 26 27 28 29 30 31 32 33 34 35
      return ${componentColor('$tokenGroup.container')};
    })''';
    }
    return '''

    ButtonStyleButton.allOrNull<Color>(Colors.transparent)''';
  }

  String _elevation() {
    if (tokens.containsKey('$tokenGroup.container.elevation')) {
      return '''

    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
36
      if (states.contains(MaterialState.disabled)) {
37
        return ${elevation("$tokenGroup.disabled.container")};
38 39
      }
      if (states.contains(MaterialState.hovered)) {
40
        return ${elevation("$tokenGroup.hover.container")};
41 42
      }
      if (states.contains(MaterialState.focused)) {
43
        return ${elevation("$tokenGroup.focus.container")};
44 45
      }
      if (states.contains(MaterialState.pressed)) {
46
        return ${elevation("$tokenGroup.pressed.container")};
47
      }
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
      return ${elevation("$tokenGroup.container")};
    })''';
    }
    return '''

    ButtonStyleButton.allOrNull<double>(0.0)''';
  }

  @override
  String generate() => '''
// Generated version ${tokens["version"]}
class _TokenDefaultsM3 extends ButtonStyle {
  _TokenDefaultsM3(this.context)
   : super(
       animationDuration: kThemeChangeDuration,
       enableFeedback: true,
       alignment: Alignment.center,
     );

  final BuildContext context;
  late final ColorScheme _colors = Theme.of(context).colorScheme;

  @override
  MaterialStateProperty<TextStyle?> get textStyle =>
72
    MaterialStatePropertyAll<TextStyle?>(${textStyle("$tokenGroup.label-text")});
73 74 75 76 77 78 79

  @override
  MaterialStateProperty<Color?>? get backgroundColor =>${_backgroundColor()};

  @override
  MaterialStateProperty<Color?>? get foregroundColor =>
    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
80
      if (states.contains(MaterialState.disabled)) {
81
        return ${componentColor('$tokenGroup.disabled.label-text')};
82
      }
83 84 85 86 87 88
      return ${componentColor('$tokenGroup.label-text')};
    });

  @override
  MaterialStateProperty<Color?>? get overlayColor =>
    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
89
      if (states.contains(MaterialState.hovered)) {
90
        return ${componentColor('$tokenGroup.hover.state-layer')};
91 92
      }
      if (states.contains(MaterialState.focused)) {
93
        return ${componentColor('$tokenGroup.focus.state-layer')};
94 95
      }
      if (states.contains(MaterialState.pressed)) {
96
        return ${componentColor('$tokenGroup.pressed.state-layer')};
97
      }
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
      return null;
    });

${tokens.containsKey("$tokenGroup.container.shadow-color") ? '''
  @override
  MaterialStateProperty<Color>? get shadowColor =>
    ButtonStyleButton.allOrNull<Color>(${color("$tokenGroup.container.shadow-color")});''' : '''
  // No default shadow color'''}

${tokens.containsKey("$tokenGroup.container.surface-tint-layer.color") ? '''
  @override
  MaterialStateProperty<Color>? get surfaceTintColor =>
    ButtonStyleButton.allOrNull<Color>(${color("$tokenGroup.container.surface-tint-layer.color")});''' : '''
  // No default surface tint color'''}

  @override
  MaterialStateProperty<double>? get elevation =>${_elevation()};

  @override
  MaterialStateProperty<EdgeInsetsGeometry>? get padding =>
    ButtonStyleButton.allOrNull<EdgeInsetsGeometry>(_scaledPadding(context));

  @override
  MaterialStateProperty<Size>? get minimumSize =>
    ButtonStyleButton.allOrNull<Size>(const Size(64.0, ${tokens["$tokenGroup.container.height"]}));

  // No default fixedSize

  @override
  MaterialStateProperty<Size>? get maximumSize =>
    ButtonStyleButton.allOrNull<Size>(Size.infinite);

${tokens.containsKey("$tokenGroup.outline.color") ? '''
  @override
  MaterialStateProperty<BorderSide>? get side =>
    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
134
    if (states.contains(MaterialState.disabled)) {
135
      return ${border("$tokenGroup.disabled.outline")};
136
    }
137 138 139 140 141 142 143 144 145 146 147
    return ${border("$tokenGroup.outline")};
  });''' : '''
  // No default side'''}

  @override
  MaterialStateProperty<OutlinedBorder>? get shape =>
    ButtonStyleButton.allOrNull<OutlinedBorder>(${shape("$tokenGroup.container")});

  @override
  MaterialStateProperty<MouseCursor?>? get mouseCursor =>
    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
148
      if (states.contains(MaterialState.disabled)) {
149
        return SystemMouseCursors.basic;
150
      }
151 152 153 154 155 156 157 158 159 160 161 162 163 164
      return SystemMouseCursors.click;
    });

  @override
  VisualDensity? get visualDensity => Theme.of(context).visualDensity;

  @override
  MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize;

  @override
  InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory;
}
''';
}