Enhance navigation and structure: integrate SettingsScreen into main app flow, update HomeScreen to open settings, and improve UI elements for better user experience.
This commit is contained in:
+92
-6
@@ -7,6 +7,7 @@ import 'package:notas/data/note_repository.dart';
|
||||
import 'package:notas/platform/app_platform.dart';
|
||||
import 'package:notas/platform/window_state.dart';
|
||||
import 'package:notas/screens/home_screen.dart';
|
||||
import 'package:notas/screens/settings_screen.dart';
|
||||
import 'package:notas/screens/vault_access_screen.dart';
|
||||
import 'package:notas/theme/app_theme.dart';
|
||||
import 'package:notas/widgets/app_title_bar.dart';
|
||||
@@ -14,6 +15,11 @@ import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
enum _AppSection {
|
||||
home,
|
||||
settings,
|
||||
}
|
||||
|
||||
class NotesApp extends StatefulWidget {
|
||||
const NotesApp({super.key});
|
||||
|
||||
@@ -22,6 +28,8 @@ class NotesApp extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _NotesAppState extends State<NotesApp> with WindowListener {
|
||||
static const Duration _screenTransitionDuration = Duration(milliseconds: 280);
|
||||
|
||||
final LocalVaultService _vaultService = LocalVaultService.instance;
|
||||
final GlobalKey<ScaffoldMessengerState> _scaffoldMessengerKey =
|
||||
GlobalKey<ScaffoldMessengerState>();
|
||||
@@ -30,6 +38,7 @@ class _NotesAppState extends State<NotesApp> with WindowListener {
|
||||
NoteRepository? _repository;
|
||||
bool _isBootstrapping = true;
|
||||
bool _isUnlocking = false;
|
||||
_AppSection _currentSection = _AppSection.home;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -80,6 +89,26 @@ class _NotesAppState extends State<NotesApp> with WindowListener {
|
||||
});
|
||||
}
|
||||
|
||||
void _openSettings() {
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_currentSection = _AppSection.settings;
|
||||
});
|
||||
}
|
||||
|
||||
void _openHome() {
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_currentSection = _AppSection.home;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _resetLocalVaultData() async {
|
||||
final AppDatabase? database = _database;
|
||||
|
||||
@@ -207,6 +236,68 @@ class _NotesAppState extends State<NotesApp> with WindowListener {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildMainShell(NoteRepository repository) {
|
||||
final Widget activeScreen = _currentSection == _AppSection.home
|
||||
? HomeScreen(
|
||||
key: const ValueKey<String>('home-screen'),
|
||||
repository: repository,
|
||||
onOpenSettings: _openSettings,
|
||||
)
|
||||
: SettingsScreen(
|
||||
key: const ValueKey<String>('settings-screen'),
|
||||
onDeleteAllData: _resetLocalVaultData,
|
||||
onBackToHome: _openHome,
|
||||
);
|
||||
|
||||
return MaterialApp(
|
||||
title: 'Mis Notas',
|
||||
debugShowCheckedModeBanner: false,
|
||||
scaffoldMessengerKey: _scaffoldMessengerKey,
|
||||
theme: AppTheme.theme,
|
||||
home: Scaffold(
|
||||
body: Container(
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Color(0xFF191A1D),
|
||||
Color(0xFF222326),
|
||||
Color(0xFF101114),
|
||||
],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
),
|
||||
),
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
const AppTitleBar(),
|
||||
Expanded(
|
||||
child: AnimatedSwitcher(
|
||||
duration: _screenTransitionDuration,
|
||||
switchInCurve: Curves.easeOutCubic,
|
||||
switchOutCurve: Curves.easeInCubic,
|
||||
transitionBuilder: (Widget child, Animation<double> animation) {
|
||||
final Animation<Offset> offsetAnimation = Tween<Offset>(
|
||||
begin: const Offset(0.08, 0.0),
|
||||
end: Offset.zero,
|
||||
).animate(animation);
|
||||
|
||||
return FadeTransition(
|
||||
opacity: animation,
|
||||
child: SlideTransition(position: offsetAnimation, child: child),
|
||||
);
|
||||
},
|
||||
child: activeScreen,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void onWindowResize() {
|
||||
_saveWindowSize();
|
||||
@@ -226,12 +317,7 @@ class _NotesAppState extends State<NotesApp> with WindowListener {
|
||||
final NoteRepository? repository = _repository;
|
||||
|
||||
if (repository != null) {
|
||||
return _buildAppShell(
|
||||
home: HomeScreen(
|
||||
repository: repository,
|
||||
onDeleteAllData: _resetLocalVaultData,
|
||||
),
|
||||
);
|
||||
return _buildMainShell(repository);
|
||||
}
|
||||
|
||||
return _buildAppShell(
|
||||
|
||||
@@ -6,27 +6,19 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:notas/data/note_repository.dart';
|
||||
import 'package:notas/models/note.dart';
|
||||
import 'package:notas/screens/note_editor_screen.dart';
|
||||
import 'package:notas/widgets/app_title_bar.dart';
|
||||
import 'package:notas/widgets/menu_drawer.dart';
|
||||
import 'package:notas/screens/settings_screen.dart';
|
||||
import 'package:notas/widgets/note_card.dart';
|
||||
import 'package:notas/widgets/search_app_bar.dart';
|
||||
|
||||
// HomeScreen: main entry showing notes in a responsive masonry grid.
|
||||
// Key behaviors implemented here:
|
||||
// - Load/save notes via `NoteRepository` (SQLite through Drift)
|
||||
// - Open `NoteEditorScreen` for create/edit
|
||||
// - Drag & drop reordering (updates `index` in the database)
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({
|
||||
super.key,
|
||||
required this.repository,
|
||||
required this.onDeleteAllData,
|
||||
required this.onOpenSettings,
|
||||
});
|
||||
|
||||
final NoteRepository repository;
|
||||
final Future<void> Function() onDeleteAllData;
|
||||
final VoidCallback onOpenSettings;
|
||||
|
||||
@override
|
||||
State<HomeScreen> createState() => _HomeScreenState();
|
||||
@@ -315,7 +307,6 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
const AppTitleBar(),
|
||||
SearchAppBar(
|
||||
onMenuPressed: () {
|
||||
setState(() {
|
||||
@@ -335,7 +326,6 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
|
||||
child: body,
|
||||
),
|
||||
// Dark overlay when menu is open; clicking it closes the menu.
|
||||
Positioned.fill(
|
||||
child: IgnorePointer(
|
||||
ignoring: !_isMenuOpen,
|
||||
@@ -350,9 +340,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
_isMenuOpen = false;
|
||||
});
|
||||
},
|
||||
child: Container(
|
||||
color: Colors.black,
|
||||
),
|
||||
child: Container(color: Colors.black),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -374,13 +362,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
});
|
||||
|
||||
if (item == 'settings') {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => SettingsScreen(
|
||||
onDeleteAllData: widget.onDeleteAllData,
|
||||
),
|
||||
),
|
||||
);
|
||||
widget.onOpenSettings();
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
@@ -21,7 +21,7 @@ class NoteEditorScreen extends StatefulWidget {
|
||||
return showGeneralDialog<dynamic>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||
barrierColor: const Color.fromARGB(127, 0, 0, 0).withValues(alpha: 0.5),
|
||||
transitionDuration: const Duration(milliseconds: 200),
|
||||
pageBuilder: (context, animation, secondaryAnimation) {
|
||||
return NoteEditorScreen(note: note);
|
||||
@@ -142,8 +142,9 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
|
||||
child: Container(
|
||||
constraints: const BoxConstraints(maxWidth: 600),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF202124),
|
||||
color: const Color.fromRGBO(24, 25, 26, 1),
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
border: Border.all(color: Colors.white24, width: 1),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withValues(alpha: 0.5),
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:notas/widgets/app_title_bar.dart';
|
||||
import 'package:notas/widgets/search_app_bar.dart';
|
||||
|
||||
class SettingsScreen extends StatefulWidget {
|
||||
const SettingsScreen({
|
||||
super.key,
|
||||
required this.onDeleteAllData,
|
||||
required this.onBackToHome,
|
||||
});
|
||||
|
||||
final Future<void> Function() onDeleteAllData;
|
||||
final VoidCallback onBackToHome;
|
||||
|
||||
@override
|
||||
State<SettingsScreen> createState() => _SettingsScreenState();
|
||||
@@ -44,8 +45,6 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('Todos los datos locales han sido eliminados.')),
|
||||
);
|
||||
|
||||
Navigator.of(context).pop();
|
||||
} catch (error) {
|
||||
if (!mounted) return;
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
@@ -77,9 +76,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
const AppTitleBar(),
|
||||
SearchAppBar(
|
||||
onLeadingPressed: () => Navigator.of(context).pop(),
|
||||
onLeadingPressed: widget.onBackToHome,
|
||||
leadingIcon: Icons.arrow_back,
|
||||
leadingTooltip: 'Atrás',
|
||||
showSearch: false,
|
||||
|
||||
Reference in New Issue
Block a user