// 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.

// This file serves as the interface between the public and private APIs for
// animated icons.
// The AnimatedIcons class is public and is used to specify available icons,
// while the _AnimatedIconData interface which used to deliver the icon data is
// kept private.

part of material_animated_icons;

/// Identifier for the supported Material Design animated icons.
///
/// Use with [AnimatedIcon] class to show specific animated icons.
///
/// {@tool dartpad}
/// This example shows how to create an animated icon. The icon is animated
/// forward and reverse in a loop.
///
/// ** See code in examples/api/lib/material/animated_icon/animated_icons_data.0.dart **
/// {@end-tool}
///
/// See also:
///
///  * [Icons], for the list of available static Material Icons.
abstract class AnimatedIcons {

  /// The Material Design add to event icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/add_event.mp4}
  static const AnimatedIconData add_event = _$add_event;

  /// The Material Design arrow to menu icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/arrow_menu.mp4}
  static const AnimatedIconData arrow_menu = _$arrow_menu;

  /// The Material Design close to menu icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/close_menu.mp4}
  static const AnimatedIconData close_menu = _$close_menu;

  /// The Material Design ellipsis to search icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/ellipsis_search.mp4}
  static const AnimatedIconData ellipsis_search = _$ellipsis_search;

  /// The Material Design event to add icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/event_add.mp4}
  static const AnimatedIconData event_add = _$event_add;

  /// The Material Design home to menu icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/home_menu.mp4}
  static const AnimatedIconData home_menu = _$home_menu;

  /// The Material Design list to view icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/list_view.mp4}
  static const AnimatedIconData list_view = _$list_view;

  /// The Material Design menu to arrow icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/menu_arrow.mp4}
  static const AnimatedIconData menu_arrow = _$menu_arrow;

  /// The Material Design menu to close icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/menu_close.mp4}
  static const AnimatedIconData menu_close = _$menu_close;

  /// The Material Design menu to home icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/menu_home.mp4}
  static const AnimatedIconData menu_home = _$menu_home;

  /// The Material Design pause to play icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/pause_play.mp4}
  static const AnimatedIconData pause_play = _$pause_play;

  /// The Material Design play to pause icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/play_pause.mp4}
  static const AnimatedIconData play_pause = _$play_pause;

  /// The Material Design search to ellipsis icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/search_ellipsis.mp4}
  static const AnimatedIconData search_ellipsis = _$search_ellipsis;

  /// The Material Design view to list icon animation.
  ///
  /// {@animation 72 72 https://flutter.github.io/assets-for-api-docs/assets/widgets/view_list.mp4}
  static const AnimatedIconData view_list = _$view_list;
}

/// Vector graphics data for icons used by [AnimatedIcon].
///
/// Instances of this class are currently opaque because we have not committed to a specific
/// animated vector graphics format.
///
/// See also:
///
///  * [AnimatedIcons], a class that contains constants that implement this interface.
abstract class AnimatedIconData {
  /// Abstract const constructor. This constructor enables subclasses to provide
  /// const constructors so that they can be used in const expressions.
  const AnimatedIconData();

  /// Whether this icon should be mirrored horizontally when text direction is
  /// right-to-left.
  ///
  /// See also:
  ///
  ///  * [TextDirection], which discusses concerns regarding reading direction
  ///    in Flutter.
  ///  * [Directionality], a widget which determines the ambient directionality.
  bool get matchTextDirection;
}

class _AnimatedIconData extends AnimatedIconData {
  const _AnimatedIconData(this.size, this.paths, {this.matchTextDirection = false});

  final Size size;
  final List<_PathFrames> paths;

  @override
  final bool matchTextDirection;
}
