Moved custom menu to it's own file, modified image and favicon

This commit is contained in:
whysman 2024-11-13 22:44:32 -05:00
parent 321eaf0bbc
commit 4023225af7
4 changed files with 239 additions and 6 deletions

BIN
assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

222
lib/custom_menu.dart Normal file
View File

@ -0,0 +1,222 @@
// custom_menu_icon.dart
import 'package:flutter/material.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, // Ensures taps are detected
child: Container(
color: Colors
.transparent, // Transparent background for full-screen detection
),
),
// Positioned menu overlay
Positioned(
top: position.dy + 60, // Position below the icon
left: position.dx + 10,
child: Material(
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: Colors.white
.withOpacity(0.95), // Slightly transparent background
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black26,
blurRadius: 10,
offset: Offset(0, 4), // Shadow under the menu
),
],
),
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(); // Open the specific dialog for this menu item
},
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,
),
);
}
// Dialog for "Home" option
void _showHomeDialog() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Home'),
content: Text('This is the Home dialog. Add your home content here.'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Close'),
),
],
);
},
);
}
// Dialog for "Profile" option
void _showProfileDialog() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Profile'),
content: Text(
'This is the Profile dialog. Add your profile content here.'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Close'),
),
],
);
},
);
}
// Dialog for "Settings" option
void _showSettingsDialog() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Settings'),
content: Text(
'This is the Settings dialog. Add your settings content here.'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Close'),
),
],
);
},
);
}
// Dialog for "Logout" option
void _showLogoutDialog() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Logout'),
content: Text('Are you sure you want to log out?'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Cancel'),
),
TextButton(
onPressed: () {
// Add your logout functionality here
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', // Your custom icon path
height: 40,
width: 40,
),
),
);
}
@override
void dispose() {
_removeMenuOverlay();
super.dispose();
}
}

View File

@ -8,6 +8,7 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'shared_preferences_provider.dart';
import 'custom_menu.dart';
class StatusPage extends StatefulWidget {
final VoidCallback toggleProfile;
@ -260,16 +261,26 @@ class StatusPageState extends State<StatusPage> with WidgetsBindingObserver {
return Scaffold(
appBar: AppBar(
title: Row(
mainAxisAlignment: MainAxisAlignment.start,
backgroundColor: Colors.blueAccent,
centerTitle: true,
title: Stack(
alignment: Alignment.center,
children: [
Image.asset(
'assets/pogdark_logo.png',
height: 40,
// Menu icon in the top left
Align(
alignment: Alignment.centerLeft,
child: CustomMenu(),
),
// Centered Pogdark logo
Align(
alignment: Alignment.center,
child: Image.asset(
'assets/pogdark_logo.png',
height: 40,
),
),
],
),
backgroundColor: Colors.blueAccent,
),
body: StreamBuilder(
stream: controller.stream,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 858 KiB

After

Width:  |  Height:  |  Size: 336 KiB