pogdark-app-flutter/lib/custom_menu.dart
whysman 4ce7efb5a5
All checks were successful
Build Flutter Web and Docker Image for Local Registry / Build Flutter Web App (push) Successful in 3m12s
adding menu with dialog and moving dialog text to l10n
2024-11-13 23:11:47 -05:00

179 lines
4.9 KiB
Dart

// custom_menu_icon.dart
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class CustomMenu extends StatefulWidget {
const CustomMenu({super.key});
@override
CustomMenuState createState() => CustomMenuState();
}
class CustomMenuState extends State<CustomMenu> {
OverlayEntry? _menuOverlay;
void _toggleMenuOverlay() {
if (_menuOverlay == null) {
final RenderBox renderBox = context.findRenderObject() as RenderBox;
final position = renderBox.localToGlobal(Offset.zero);
_menuOverlay = OverlayEntry(
builder: (context) => Stack(
children: [
// Detect taps outside the menu
GestureDetector(
onTap: _removeMenuOverlay,
behavior: HitTestBehavior.translucent,
child: Container(
color: Colors.transparent,
),
),
// Positioned menu overlay
Positioned(
top: position.dy + 60,
left: position.dx + 10,
child: Material(
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.95),
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black26,
blurRadius: 10,
offset: Offset(0, 4),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
_buildMenuItem('Home', Icons.home, _showHomeDialog),
_buildDivider(),
_buildMenuItem(
'Profile', Icons.person, _showProfileDialog),
_buildDivider(),
_buildMenuItem(
'Settings', Icons.settings, _showSettingsDialog),
_buildDivider(),
_buildMenuItem('Logout', Icons.logout, _showLogoutDialog),
],
),
),
),
),
],
),
);
Overlay.of(context).insert(_menuOverlay!);
} else {
_removeMenuOverlay();
}
}
void _removeMenuOverlay() {
_menuOverlay?.remove();
_menuOverlay = null;
}
Widget _buildMenuItem(String text, IconData icon, VoidCallback onTap) {
return InkWell(
onTap: () {
_removeMenuOverlay();
onTap();
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
children: [
Icon(icon, size: 24, color: Colors.blueAccent),
const SizedBox(width: 12),
Text(
text,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
],
),
),
);
}
Widget _buildDivider() {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Divider(
color: Colors.grey.shade300,
thickness: 1,
height: 1,
),
);
}
void _showHomeDialog() {
_showDialog('Home', AppLocalizations.of(context)!.homeDialogContent);
}
void _showProfileDialog() {
_showDialog('Profile', AppLocalizations.of(context)!.profileDialogContent);
}
void _showSettingsDialog() {
_showDialog(
'Settings', AppLocalizations.of(context)!.settingsDialogContent);
}
void _showLogoutDialog() {
_showDialog('Logout', AppLocalizations.of(context)!.logoutDialogContent,
isLogout: true);
}
void _showDialog(String title, String content, {bool isLogout = false}) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(title),
content: Text(content),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(isLogout ? 'Cancel' : 'Close'),
),
if (isLogout)
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Logout', style: TextStyle(color: Colors.red)),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: _toggleMenuOverlay,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/logo.png',
height: 40,
width: 40,
),
),
);
}
@override
void dispose() {
_removeMenuOverlay();
super.dispose();
}
}