From cb6d34f93ae371798baa14a4f9035a2655cde86f Mon Sep 17 00:00:00 2001 From: tobias Date: Sun, 19 Oct 2025 16:01:45 +0200 Subject: [PATCH] Basic layout, navigation, first empty pages --- lib/main.dart | 111 +++++++++++++++++++++++++-- lib/screens/calendar_screen.dart | 10 +++ lib/screens/competitions_screen.dart | 10 +++ lib/screens/dashboard_screen.dart | 15 ++++ lib/screens/events_screen.dart | 10 +++ lib/screens/season_screen.dart | 10 +++ 6 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 lib/screens/calendar_screen.dart create mode 100644 lib/screens/competitions_screen.dart create mode 100644 lib/screens/dashboard_screen.dart create mode 100644 lib/screens/events_screen.dart create mode 100644 lib/screens/season_screen.dart diff --git a/lib/main.dart b/lib/main.dart index a725658..d1fca0c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,24 @@ import 'package:flutter/material.dart'; +import 'package:pacelab/screens/calendar_screen.dart'; +import 'package:pacelab/screens/competitions_screen.dart'; +import 'package:pacelab/screens/dashboard_screen.dart'; +import 'package:pacelab/screens/events_screen.dart'; +import 'package:pacelab/screens/season_screen.dart'; + +class Destination { + const Destination(this.label, this.icon); + + final String label; + final IconData icon; +} + +const List destinations = [ + Destination('Dashboard', Icons.dashboard), + Destination('Season', Icons.event), + Destination('Calendar', Icons.calendar_month), + Destination('Competitions', Icons.flag), + Destination('Events', Icons.edit_calendar_rounded), +]; void main() { runApp(const MainApp()); @@ -9,12 +29,93 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), + return MaterialApp(title: "PaceLab", home: PaceLabLayout(), theme: ThemeData.dark()); + } +} + +class PaceLabLayout extends StatefulWidget { + const PaceLabLayout({super.key}); + + @override + State createState() => _PaceLabLayoutState(); +} + +class _PaceLabLayoutState extends State { + int selectedIndex = 0; + + void _onItemTapped(int index) { + setState(() { + selectedIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("PaceLab"), backgroundColor: Colors.red.shade900), + body: Row( + children: [ + navDrawer(), + Navigator( + key: ValueKey(selectedIndex), + onGenerateRoute: (settings) { + Widget page = const DashboardScreen(); + + switch (selectedIndex) { + case 0: + { + page = const DashboardScreen(); + break; + } + case 1: + { + page = SeasonScreen(); + break; + } + case 2: + { + page = CalendarScreen(); + break; + } + case 3: + { + page = CompetitionsScreen(); + break; + } + case 4: + { + page = EventsScreen(); + break; + } + } + + return MaterialPageRoute(builder: (_) => page); + }, + ), + ], ), ); } + + NavigationDrawer navDrawer() { + return NavigationDrawer( + selectedIndex: selectedIndex, + onDestinationSelected: (value) => _onItemTapped(value), + indicatorColor: Colors.grey.shade700, + children: [ + UserAccountsDrawerHeader( + decoration: BoxDecoration(color: Colors.redAccent), + accountName: Text("User name"), // todo + accountEmail: Text("VDOT: 48"), // todo + currentAccountPicture: FlutterLogo(), // todo + ), + ...destinations.map((Destination destination) { + return NavigationDrawerDestination( + icon: Icon(destination.icon), + label: Text(destination.label), + ); + }), + ], + ); + } } diff --git a/lib/screens/calendar_screen.dart b/lib/screens/calendar_screen.dart new file mode 100644 index 0000000..ab79787 --- /dev/null +++ b/lib/screens/calendar_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class CalendarScreen extends StatelessWidget { + const CalendarScreen({super.key}); + + @override + Widget build(BuildContext context) { + return const Text("Calendar"); + } +} \ No newline at end of file diff --git a/lib/screens/competitions_screen.dart b/lib/screens/competitions_screen.dart new file mode 100644 index 0000000..d01db06 --- /dev/null +++ b/lib/screens/competitions_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class CompetitionsScreen extends StatelessWidget { + const CompetitionsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Text("Competitions"); + } +} diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart new file mode 100644 index 0000000..35ff6d8 --- /dev/null +++ b/lib/screens/dashboard_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class DashboardScreen extends StatefulWidget { + const DashboardScreen({super.key}); + + @override + State createState() => _DashboardScreenState(); +} + +class _DashboardScreenState extends State { + @override + Widget build(BuildContext context) { + return const Text("Dashboard"); + } +} \ No newline at end of file diff --git a/lib/screens/events_screen.dart b/lib/screens/events_screen.dart new file mode 100644 index 0000000..41e4462 --- /dev/null +++ b/lib/screens/events_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class EventsScreen extends StatelessWidget { + const EventsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Text("Events"); + } +} \ No newline at end of file diff --git a/lib/screens/season_screen.dart b/lib/screens/season_screen.dart new file mode 100644 index 0000000..06bf73c --- /dev/null +++ b/lib/screens/season_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class SeasonScreen extends StatelessWidget { + const SeasonScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Text("Season"); + } +} \ No newline at end of file