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 bool selectable; final IconData buttonIcon; final Color buttonColor; const LocalPopupMenuButton( {Key key, this.popupMenuCallback, this.popmenus, this.buttonIcon, this.selectable = true, this.multiSelect = false, this.buttonColor = primaryColor}) : 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.selectable) { 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 (selected.enabled && 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: widget.buttonColor ?? 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) { if (choice == null) return null; return PopupMenuItem( value: choice, child: Row( children: [ LocalText(context, choice.textKey, color: choice?.enabled ?? true ? primaryColor : Colors.grey), SizedBox( width: 10, ), choice.selected ? Icon( Icons.check, color: Colors.grey, ) : Container(), ], ), ); }).toList(); }); } bool _needHighlight() { popmenus.forEach((e) { if (e == null) return false; if (e.selected && e.highlight) return true; }); return false; } }