Files
fcs/lib/pages/widgets/local_popup_menu_button.dart
2025-03-12 17:49:27 +06:30

138 lines
4.1 KiB
Dart

import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/widgets/local_text.dart';
import 'package:flutter/material.dart';
import '../../domain/vo/local_popupmenu.dart';
typedef PopupMenuCallback = Function(LocalPopupMenu popupMenu);
class LocalPopupMenuButton extends StatefulWidget {
final PopupMenuCallback? popupMenuCallback;
final List<LocalPopupMenu>? popmenus;
final bool multiSelect;
final bool selectable;
final IconData? buttonIcon;
final Color buttonColor;
const LocalPopupMenuButton(
{super.key,
this.popupMenuCallback,
this.popmenus,
this.buttonIcon,
this.selectable = true,
this.multiSelect = false,
this.buttonColor = primaryColor});
@override
_LocalPopupMenuButtonState createState() => _LocalPopupMenuButtonState();
}
class _LocalPopupMenuButtonState extends State<LocalPopupMenuButton> {
late List<LocalPopupMenu> popmenus;
@override
void initState() {
popmenus = widget.popmenus!;
super.initState();
}
@override
Widget build(BuildContext context) {
bool hightlight = _needHighlight();
return PopupMenuButton<LocalPopupMenu>(
elevation: 3.2,
onSelected: (selected) {
if (widget.selectable) {
if (!widget.multiSelect) {
setState(() {
for (var e in popmenus) {
if (e.id != selected.id) {
e.selected = false;
} else {
e.selected = true;
}
}
});
selected.selected = true;
} else {
setState(() {
for (var e in popmenus) {
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: BoxDecoration(
shape: BoxShape.circle,
//color: Colors.white,
),
child: Stack(
alignment: Alignment.center,
children: <Widget>[
Icon(
widget.buttonIcon ?? Icons.filter_list,
color: Colors.white,
),
hightlight
? Positioned(
bottom: 15,
right: 0,
child: Container(
width: 10,
height: 10,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: secondaryColor,
),
),
)
: Container()
],
)),
itemBuilder: (BuildContext context) {
return popmenus.map((LocalPopupMenu choice) {
return PopupMenuItem<LocalPopupMenu>(
value: choice,
child: Row(
children: <Widget>[
choice.text != null
? Text(choice.text!,
style: TextStyle(
fontSize: 14,
color:
choice.enabled ? Colors.black : Colors.grey))
: LocalText(context, choice.textKey ?? "",
color: choice.enabled ? Colors.black : Colors.grey,
fontSize: 14),
SizedBox(
width: 10,
),
choice.selected
? Icon(
Icons.check,
color: Colors.grey,
)
: Container(),
],
),
);
}).toList();
});
}
bool _needHighlight() {
for (var e in popmenus) {
if (e.selected && e.highlight) continue;
}
return false;
}
}