import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/material.dart'; import 'local_popupmenu.dart'; typedef PopupMenuCallback = Function(LocalPopupMenu popupMenu); class LocalPopupMenuButton extends StatefulWidget { final PopupMenuCallback popupMenuCallback; final List popmenus; final bool multiSelect; final IconData buttonIcon; const LocalPopupMenuButton( {Key key, this.popupMenuCallback, this.popmenus, this.buttonIcon, this.multiSelect = false}) : super(key: key); @override _LocalPopupMenuButtonState createState() => _LocalPopupMenuButtonState(); } class _LocalPopupMenuButtonState extends State { List popmenus; @override void initState() { popmenus = widget.popmenus; super.initState(); } @override Widget build(BuildContext context) { bool hightlight = _needHighlight(); return PopupMenuButton( elevation: 3.2, onSelected: (selected) { if (!widget.multiSelect) { setState(() { popmenus.forEach((e) { if (e.id != selected.id) e.selected = false; else e.selected = true; }); }); selected.selected = true; } else { setState(() { popmenus.forEach((e) { if (e.id == selected.id) e.selected = !e.selected; }); }); selected.selected = !selected.selected; } if (widget.popupMenuCallback != null) widget.popupMenuCallback(selected); }, icon: Container( width: 30, height: 30, decoration: new BoxDecoration( shape: BoxShape.circle, color: Colors.white, ), child: Stack( fit: StackFit.expand, children: [ Icon( widget.buttonIcon ?? Icons.filter_list, color: primaryColor, ), hightlight ? Positioned( bottom: 0, right: 0, child: Container( width: 10, height: 10, decoration: new BoxDecoration( shape: BoxShape.circle, color: secondaryColor, ), ), ) : Container() ], )), itemBuilder: (BuildContext context) { return popmenus.map((LocalPopupMenu choice) { return PopupMenuItem( value: choice, child: Row( children: [ LocalText(context, choice.textKey, color: primaryColor), SizedBox( width: 10, ), choice.selected ? Icon( Icons.check, color: Colors.grey, ) : Container(), ], ), ); }).toList(); }); } bool _needHighlight() { popmenus.forEach((e) { if (e.selected && e.highlight) return true; }); return false; } }