65 lines
1.7 KiB
Dart
65 lines
1.7 KiB
Dart
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
|
|
class MenuItemData {
|
|
final IconData icon;
|
|
final String textKey;
|
|
final VoidCallback onPressed;
|
|
|
|
const MenuItemData(this.icon, this.textKey, this.onPressed);
|
|
}
|
|
|
|
class UploadMenu extends StatelessWidget {
|
|
final List<MenuItemData> items;
|
|
final bool isCompact;
|
|
final Color? iconColor;
|
|
|
|
const UploadMenu({
|
|
super.key,
|
|
required this.items,
|
|
this.isCompact = false,
|
|
this.iconColor,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final colorScheme = Theme.of(context).colorScheme;
|
|
|
|
return MenuAnchor(
|
|
builder:
|
|
(context, controller, child) => IconButton(
|
|
onPressed: () {
|
|
if (controller.isOpen) {
|
|
controller.close();
|
|
} else {
|
|
controller.open();
|
|
}
|
|
},
|
|
tooltip: 'uploadFile'.tr(),
|
|
icon: const Icon(Symbols.file_upload),
|
|
color: iconColor ?? colorScheme.primary,
|
|
visualDensity:
|
|
isCompact
|
|
? const VisualDensity(horizontal: -4, vertical: -2)
|
|
: null,
|
|
),
|
|
menuChildren:
|
|
items
|
|
.map(
|
|
(item) => MenuItemButton(
|
|
onPressed: item.onPressed,
|
|
leadingIcon: Icon(item.icon),
|
|
style: ButtonStyle(
|
|
padding: WidgetStatePropertyAll(
|
|
EdgeInsets.symmetric(horizontal: 16, vertical: 20),
|
|
),
|
|
),
|
|
child: Text(item.textKey.tr()),
|
|
),
|
|
)
|
|
.toList(),
|
|
);
|
|
}
|
|
}
|