66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:material_symbols_icons/symbols.dart';
 | 
						|
 | 
						|
class UploadMenuItemData {
 | 
						|
  final IconData icon;
 | 
						|
  final String textKey;
 | 
						|
  final VoidCallback onPressed;
 | 
						|
 | 
						|
  const UploadMenuItemData(this.icon, this.textKey, this.onPressed);
 | 
						|
}
 | 
						|
 | 
						|
class UploadMenu extends StatelessWidget {
 | 
						|
  final List<UploadMenuItemData> 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(
 | 
						|
                    visualDensity: VisualDensity.compact,
 | 
						|
                    padding: WidgetStatePropertyAll(
 | 
						|
                      EdgeInsets.only(left: 12, right: 16, top: 20, bottom: 20),
 | 
						|
                    ),
 | 
						|
                  ),
 | 
						|
                  child: Text(item.textKey.tr()),
 | 
						|
                ),
 | 
						|
              )
 | 
						|
              .toList(),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |