| // Copyright 2015 The Chromium 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 'dart:ui' show Color, hashValues; |
| import 'dart:ui' as ui show lerpDouble; |
| |
| import 'package:flutter/foundation.dart'; |
| |
| /// Defines the color, opacity, and size of icons. |
| /// |
| /// Used by [IconTheme] to control the color, opacity, and size of icons in a |
| /// widget subtree. |
| /// |
| /// To obtain the current icon theme, use [IconTheme.of]. To convert an icon |
| /// theme to a version with all the fields filled in, use [new |
| /// IconThemeData.fallback]. |
| class IconThemeData extends Diagnosticable { |
| /// Creates an icon theme data. |
| /// |
| /// The opacity applies to both explicit and default icon colors. The value |
| /// is clamped between 0.0 and 1.0. |
| const IconThemeData({this.color, double opacity, this.size}) : _opacity = opacity; |
| |
| /// Creates an icon them with some reasonable default values. |
| /// |
| /// The [color] is black, the [opacity] is 1.0, and the [size] is 24.0. |
| const IconThemeData.fallback() |
| : color = const Color(0xFF000000), |
| _opacity = 1.0, |
| size = 24.0; |
| |
| /// Creates a copy of this icon theme but with the given fields replaced with |
| /// the new values. |
| IconThemeData copyWith({Color color, double opacity, double size}) { |
| return new IconThemeData( |
| color: color ?? this.color, |
| opacity: opacity ?? this.opacity, |
| size: size ?? this.size, |
| ); |
| } |
| |
| /// Returns a new icon theme that matches this icon theme but with some values |
| /// replaced by the non-null parameters of the given icon theme. If the given |
| /// icon theme is null, simply returns this icon theme. |
| IconThemeData merge(IconThemeData other) { |
| if (other == null) |
| return this; |
| return copyWith( |
| color: other.color, |
| opacity: other.opacity, |
| size: other.size, |
| ); |
| } |
| |
| /// Whether all the properties of this object are non-null. |
| bool get isConcrete => color != null && opacity != null && size != null; |
| |
| /// The default color for icons. |
| final Color color; |
| |
| /// An opacity to apply to both explicit and default icon colors. |
| double get opacity => _opacity?.clamp(0.0, 1.0); |
| final double _opacity; |
| |
| /// The default size for icons. |
| final double size; |
| |
| /// Linearly interpolate between two icon theme data objects. |
| /// |
| /// The `t` argument represents position on the timeline, with 0.0 meaning |
| /// that the interpolation has not started, returning `a` (or something |
| /// equivalent to `a`), 1.0 meaning that the interpolation has finished, |
| /// returning `b` (or something equivalent to `b`), and values in between |
| /// meaning that the interpolation is at the relevant point on the timeline |
| /// between `a` and `b`. The interpolation can be extrapolated beyond 0.0 and |
| /// 1.0, so negative values and values greater than 1.0 are valid (and can |
| /// easily be generated by curves such as [Curves.elasticInOut]). |
| /// |
| /// Values for `t` are usually obtained from an [Animation<double>], such as |
| /// an [AnimationController]. |
| static IconThemeData lerp(IconThemeData a, IconThemeData b, double t) { |
| assert(t != null); |
| return new IconThemeData( |
| color: Color.lerp(a.color, b.color, t), |
| opacity: ui.lerpDouble(a.opacity, b.opacity, t), |
| size: ui.lerpDouble(a.size, b.size, t), |
| ); |
| } |
| |
| @override |
| bool operator ==(dynamic other) { |
| if (other.runtimeType != runtimeType) |
| return false; |
| final IconThemeData typedOther = other; |
| return color == typedOther.color |
| && opacity == typedOther.opacity |
| && size == typedOther.size; |
| } |
| |
| @override |
| int get hashCode => hashValues(color, opacity, size); |
| |
| @override |
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { |
| super.debugFillProperties(properties); |
| properties.add(new DiagnosticsProperty<Color>('color', color, defaultValue: null)); |
| properties.add(new DoubleProperty('opacity', opacity, defaultValue: null)); |
| properties.add(new DoubleProperty('size', size, defaultValue: null)); |
| } |
| } |