feat: Implement menu open/close functionality in HomeScreen for improved user interaction
This commit is contained in:
@@ -50,6 +50,26 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
bool _showDeletedNotes = false;
|
||||
PointerDeviceKind _lastPointerKind = PointerDeviceKind.mouse;
|
||||
|
||||
void _openMenu() {
|
||||
if (_isMenuOpen) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_isMenuOpen = true;
|
||||
});
|
||||
}
|
||||
|
||||
void _closeMenu() {
|
||||
if (!_isMenuOpen) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_isMenuOpen = false;
|
||||
});
|
||||
}
|
||||
|
||||
bool _requiresLongPressToDrag(PointerDeviceKind kind) {
|
||||
return kind == PointerDeviceKind.touch ||
|
||||
kind == PointerDeviceKind.stylus ||
|
||||
@@ -172,9 +192,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
}
|
||||
|
||||
Future<void> _handleMenuItemTapped(String item) async {
|
||||
setState(() {
|
||||
_isMenuOpen = false;
|
||||
});
|
||||
_closeMenu();
|
||||
|
||||
if (item == 'settings') {
|
||||
widget.onOpenSettings();
|
||||
@@ -546,6 +564,16 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Listener(
|
||||
onPointerDown: (PointerDownEvent event) {
|
||||
if (_lastPointerKind == event.kind) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_lastPointerKind = event.kind;
|
||||
});
|
||||
},
|
||||
child: Stack(
|
||||
children: [
|
||||
Padding(
|
||||
@@ -555,6 +583,27 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
child: body,
|
||||
),
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
bottom: 0,
|
||||
width: 28,
|
||||
child: IgnorePointer(
|
||||
ignoring:
|
||||
_isMenuOpen ||
|
||||
!_requiresLongPressToDrag(_lastPointerKind),
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onHorizontalDragUpdate:
|
||||
(DragUpdateDetails details) {
|
||||
if ((details.primaryDelta ?? 0) > 6) {
|
||||
_openMenu();
|
||||
}
|
||||
},
|
||||
child: const SizedBox.expand(),
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: IgnorePointer(
|
||||
ignoring: !_isMenuOpen,
|
||||
@@ -564,11 +613,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
curve: Curves.easeOutCubic,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_isMenuOpen = false;
|
||||
});
|
||||
},
|
||||
onTap: _closeMenu,
|
||||
child: Container(color: Colors.black),
|
||||
),
|
||||
),
|
||||
@@ -595,6 +640,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user