// 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 'package:flutter/material.dart';

/// Flutter code sample for [PopupMenuButton].

void main() => runApp(const PopupMenuApp());

class PopupMenuApp extends StatelessWidget {
  const PopupMenuApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: PopupMenuExample(),
    );
  }
}

enum AnimationStyles { defaultStyle, custom, none }
const List<(AnimationStyles, String)> animationStyleSegments = <(AnimationStyles, String)>[
  (AnimationStyles.defaultStyle, 'Default'),
  (AnimationStyles.custom, 'Custom'),
  (AnimationStyles.none, 'None'),
];

enum Menu { preview, share, getLink, remove, download }

class PopupMenuExample extends StatefulWidget {
  const PopupMenuExample({super.key});

  @override
  State<PopupMenuExample> createState() => _PopupMenuExampleState();
}

class _PopupMenuExampleState extends State<PopupMenuExample> {
  Set<AnimationStyles> _animationStyleSelection = <AnimationStyles>{AnimationStyles.defaultStyle};
  AnimationStyle? _animationStyle;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.only(top: 50),
          child: Align(
            alignment: Alignment.topCenter,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                SegmentedButton<AnimationStyles>(
                  selected: _animationStyleSelection,
                  onSelectionChanged: (Set<AnimationStyles> styles) {
                    setState(() {
                      _animationStyleSelection = styles;
                      switch (styles.first) {
                        case AnimationStyles.defaultStyle:
                          _animationStyle = null;
                        case AnimationStyles.custom:
                          _animationStyle = AnimationStyle(
                            curve: Easing.emphasizedDecelerate,
                            duration: const Duration(seconds: 3),
                          );
                        case AnimationStyles.none:
                          _animationStyle = AnimationStyle.noAnimation;
                      }
                    });
                  },
                  segments: animationStyleSegments
                    .map<ButtonSegment<AnimationStyles>>(((AnimationStyles, String) shirt) {
                      return ButtonSegment<AnimationStyles>(value: shirt.$1, label: Text(shirt.$2));
                    })
                    .toList(),
                ),
                const SizedBox(height: 10),
                PopupMenuButton<Menu>(
                  popUpAnimationStyle: _animationStyle,
                  icon: const Icon(Icons.more_vert),
                  onSelected: (Menu item) { },
                  itemBuilder: (BuildContext context) => <PopupMenuEntry<Menu>>[
                    const PopupMenuItem<Menu>(
                      value: Menu.preview,
                      child: ListTile(
                        leading: Icon(Icons.visibility_outlined),
                        title: Text('Preview'),
                      ),
                    ),
                    const PopupMenuItem<Menu>(
                      value: Menu.share,
                      child: ListTile(
                        leading: Icon(Icons.share_outlined),
                        title: Text('Share'),
                      ),
                    ),
                    const PopupMenuItem<Menu>(
                      value: Menu.getLink,
                      child: ListTile(
                        leading: Icon(Icons.link_outlined),
                        title: Text('Get link'),
                      ),
                    ),
                    const PopupMenuDivider(),
                    const PopupMenuItem<Menu>(
                      value: Menu.remove,
                      child: ListTile(
                        leading: Icon(Icons.delete_outline),
                        title: Text('Remove'),
                      ),
                    ),
                    const PopupMenuItem<Menu>(
                      value: Menu.download,
                      child: ListTile(
                        leading: Icon(Icons.download_outlined),
                        title: Text('Download'),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}