diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 51c2c43..90167f9 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:notas/widgets/app_title_bar.dart'; -import 'package:notas/widgets/menu_drawer.dart'; import 'package:notas/widgets/search_app_bar.dart'; class SettingsScreen extends StatefulWidget { @@ -17,38 +16,6 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { bool _isBusy = false; - bool _isMenuOpen = false; - final GlobalKey _headerKey = GlobalKey(); - double _menuTopInset = 0; - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - _updateMenuTopInset(); - }); - } - - void _updateMenuTopInset() { - final BuildContext? headerContext = _headerKey.currentContext; - if (headerContext == null) { - return; - } - - final RenderObject? renderObject = headerContext.findRenderObject(); - if (renderObject is! RenderBox) { - return; - } - - final double newInset = renderObject.size.height; - if ((newInset - _menuTopInset).abs() < 0.5) { - return; - } - - setState(() { - _menuTopInset = newInset; - }); - } Future _confirmAndDeleteAll() async { final bool? confirmed = await showDialog( @@ -92,22 +59,8 @@ class _SettingsScreenState extends State { } } - void _handleMenuItemTapped(String item) { - setState(() { - _isMenuOpen = false; - }); - - if (item == 'all_notes') { - Navigator.of(context).pop(); - } - } - @override Widget build(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _updateMenuTopInset(); - }); - return Scaffold( body: Container( decoration: const BoxDecoration( @@ -122,80 +75,35 @@ class _SettingsScreenState extends State { ), ), child: SafeArea( - child: Stack( - children: [ - Column( - children: [ - Column( - key: _headerKey, - mainAxisSize: MainAxisSize.min, - children: [ - const AppTitleBar(), - SearchAppBar( - onMenuPressed: () { - setState(() { - _isMenuOpen = !_isMenuOpen; - }); - }, - showSearch: false, - titleText: 'Configuración', - ), - ], - ), - Expanded( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ElevatedButton.icon( - style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent), - onPressed: _isBusy ? null : _confirmAndDeleteAll, - icon: _isBusy ? const SizedBox(width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2)) : const Icon(Icons.delete_forever), - label: const Text('Borrar todos los datos'), - ), - const SizedBox(height: 16), - const Text('Esto cerrará el vault actual y eliminará la base de datos local junto con la clave de cifrado.'), - ], - ), - ), - ), - ], - ), - Positioned.fill( - top: _menuTopInset, - child: IgnorePointer( - ignoring: !_isMenuOpen, - child: AnimatedOpacity( - duration: const Duration(milliseconds: 300), - opacity: _isMenuOpen ? 0.5 : 0.0, - curve: Curves.easeOutCubic, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - setState(() { - _isMenuOpen = false; - }); - }, - child: Container(color: Colors.black), + child: Column( + children: [ + const AppTitleBar(), + SearchAppBar( + onLeadingPressed: () => Navigator.of(context).pop(), + leadingIcon: Icons.arrow_back, + leadingTooltip: 'Atrás', + showSearch: false, + titleText: 'Configuración', + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ElevatedButton.icon( + style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent), + onPressed: _isBusy ? null : _confirmAndDeleteAll, + icon: _isBusy ? const SizedBox(width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2)) : const Icon(Icons.delete_forever), + label: const Text('Borrar todos los datos'), + ), + const SizedBox(height: 16), + const Text('Esto cerrará el vault actual y eliminará la base de datos local junto con la clave de cifrado.'), + ], ), ), ), - ), - AnimatedPositioned( - duration: const Duration(milliseconds: 300), - curve: Curves.easeOutCubic, - left: _isMenuOpen ? 0 : -280, - top: _menuTopInset, - bottom: 0, - width: 280, - child: Material( - color: const Color.fromRGBO(24, 25, 26, 1), - elevation: 8, - child: MenuDrawer(onMenuItemTapped: _handleMenuItemTapped), - ), - ), - ], + ], ), ), ), diff --git a/lib/widgets/search_app_bar.dart b/lib/widgets/search_app_bar.dart index e70b19f..358553a 100644 --- a/lib/widgets/search_app_bar.dart +++ b/lib/widgets/search_app_bar.dart @@ -4,6 +4,9 @@ class SearchAppBar extends StatefulWidget { const SearchAppBar({ super.key, this.onMenuPressed, + this.onLeadingPressed, + this.leadingIcon = Icons.menu, + this.leadingTooltip = 'Menú', this.onSearchChanged, this.searchHint = 'Buscar notas...', this.showSearch = true, @@ -11,6 +14,9 @@ class SearchAppBar extends StatefulWidget { }); final VoidCallback? onMenuPressed; + final VoidCallback? onLeadingPressed; + final IconData leadingIcon; + final String leadingTooltip; final ValueChanged? onSearchChanged; final String searchHint; final bool showSearch; @@ -50,11 +56,10 @@ class _SearchAppBarState extends State { padding: const EdgeInsets.only(left: 16, right: 16, top: 7, bottom: 7), child: Row( children: [ - // Menu button (fixed on left) IconButton( - onPressed: widget.onMenuPressed, - icon: const Icon(Icons.menu, color: Colors.white70, size: 20), - tooltip: 'Menú', + onPressed: widget.onLeadingPressed ?? widget.onMenuPressed, + icon: Icon(widget.leadingIcon, color: Colors.white70, size: 20), + tooltip: widget.leadingTooltip, splashRadius: 18, constraints: const BoxConstraints(minWidth: 40, minHeight: 40), ),