CalcThemeData.lerp constructor

CalcThemeData.lerp(
  1. CalcThemeData a,
  2. CalcThemeData b,
  3. double t
)

Interpolates every channel (t = 0 gives a, 1 gives b). Discrete values (brightness, fonts, springs) switch at t = 0.5.

Implementation

factory CalcThemeData.lerp(CalcThemeData a, CalcThemeData b, double t) {
  if (identical(a, b)) return a;
  T pick<T>(T x, T y) => t < 0.5 ? x : y;
  Color color(Color x, Color y) => Color.lerp(x, y, t)!;
  double number(double x, double y) => lerpDouble(x, y, t)!;
  return CalcThemeData(
    brightness: pick(a.brightness, b.brightness),
    background: color(a.background, b.background),
    displayText: color(a.displayText, b.displayText),
    previewText: color(a.previewText, b.previewText),
    errorText: color(a.errorText, b.errorText),
    caret: color(a.caret, b.caret),
    focusRing: color(a.focusRing, b.focusRing),
    digitKey: KeyStyle.lerp(a.digitKey, b.digitKey, t),
    operatorKey: KeyStyle.lerp(a.operatorKey, b.operatorKey, t),
    equalsKey: KeyStyle.lerp(a.equalsKey, b.equalsKey, t),
    functionKey: KeyStyle.lerp(a.functionKey, b.functionKey, t),
    keyCornerFraction: number(a.keyCornerFraction, b.keyCornerFraction),
    displayFontFamily: pick(a.displayFontFamily, b.displayFontFamily),
    displayWeight: pick(a.displayWeight, b.displayWeight),
    keyFontFamily: pick(a.keyFontFamily, b.keyFontFamily),
    pressIn: pick(a.pressIn, b.pressIn),
    release: pick(a.release, b.release),
    releaseAlt: pick(a.releaseAlt, b.releaseAlt),
    pressScale: number(a.pressScale, b.pressScale),
    pressedOverlayOpacity: number(
      a.pressedOverlayOpacity,
      b.pressedOverlayOpacity,
    ),
    hoverOverlayOpacity: number(a.hoverOverlayOpacity, b.hoverOverlayOpacity),
    keyFace: pick(a.keyFace, b.keyFace),
    focusRingWidth: number(a.focusRingWidth, b.focusRingWidth),
    backdrop: pick(a.backdrop, b.backdrop),
    displayEntry: pick(a.displayEntry, b.displayEntry),
    releaseHaptic: pick(a.releaseHaptic, b.releaseHaptic),
    displayFace: switch ((a.displayFace, b.displayFace)) {
      (final x?, final y?) => x.lerpTo(y, t),
      (final x, final y) => pick(x, y),
    },
    accessiblePreviewText:
        a.accessiblePreviewText == null && b.accessiblePreviewText == null
        ? null
        : color(a.secondaryText, b.secondaryText),
    chrome: pick(a.chrome, b.chrome),
  );
}