From b436752580ecaf9e0d71b418d6213a6797ff224f Mon Sep 17 00:00:00 2001 From: doodlezucc <electerminator@gmail.com> Date: Tue, 21 Nov 2023 13:53:37 +0100 Subject: [PATCH] introduce view page for rooms and lectures --- lib/context.dart | 6 -- lib/main.dart | 102 +---------------------------- lib/pages/home_page.dart | 106 +++++++++++++++++++++++++++++++ lib/pages/view_page.dart | 60 +++++++++++++++++ lib/timetable/lesson_dialog.dart | 11 +++- 5 files changed, 177 insertions(+), 108 deletions(-) create mode 100644 lib/pages/home_page.dart create mode 100644 lib/pages/view_page.dart diff --git a/lib/context.dart b/lib/context.dart index 70c1ed7..a0c24a7 100644 --- a/lib/context.dart +++ b/lib/context.dart @@ -4,17 +4,12 @@ import 'untis/lecture.dart'; import 'user/profile.dart'; import 'user/save_state.dart'; import 'util/listenable.dart'; -import 'views/mixed_class_view.dart'; -import 'views/view.dart'; class AppContext { final UntisFetch untis; final SaveManager _saveManager; final Listenable<Profile?> profile = Listenable(null); final Listenable<DateTime> date = Listenable(DateTime.now()); - final Listenable<TimetableView> view = Listenable( - MixedClassView(classIds: {}), - ); List<Class>? classes; List<Lecture>? lectures; @@ -29,6 +24,5 @@ class AppContext { profile.value! ..hiddenLectures.onChange.listen((_) => save()) ..selectedClasses.onChange.listen((_) => save()); - view.value = MixedClassView(classIds: profile.value!.selectedClasses); } } diff --git a/lib/main.dart b/lib/main.dart index 6297a60..c9d9b04 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,18 +1,10 @@ -import 'dart:async'; -import 'dart:io'; - import 'package:flutter/material.dart'; import 'branding.dart'; import 'context.dart'; -import 'dialogs/error_dialog.dart'; -import 'drawer/drawer.dart'; -import 'timetable/timetable.dart'; -import 'toolbar/toolbar.dart'; +import 'pages/home_page.dart'; import 'untis/fetch.dart'; -import 'untis/timetable.dart'; import 'user/save_state.dart'; -import 'util/listenable.dart'; void main() { runApp(const MyApp()); @@ -41,97 +33,7 @@ class _MyAppState extends State<MyApp> { return MaterialApp( title: appName, theme: theme, - home: MyHomePage(appContext: appContext), - ); - } -} - -class MyHomePage extends StatefulWidget { - final AppContext appContext; - - const MyHomePage({super.key, required this.appContext}); - - @override - State<MyHomePage> createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State<MyHomePage> { - late List<StreamSubscription> _subscriptions; - - TimetableData? timetable; - - AppContext get appContext => widget.appContext; - UntisFetch get untis => appContext.untis; - - @override - void initState() { - super.initState(); - loadProfile().onError((error, _) { - _showErrorDialog('Failed to connect', error); - }); - } - - @override - void dispose() { - for (var subscription in _subscriptions) { - subscription.cancel(); - } - super.dispose(); - } - - void _showErrorDialog(String title, Object? error) { - stderr.write(error); - showDialog( - context: context, - builder: (context) => ErrorDialog(title: title, error: error), - ); - } - - Future<void> loadProfile() async { - final profile = await appContext.profile.firstNotNull; - final classes = await untis.allClasses.fetched; - - appContext.profile.value = profile; - appContext.classes = classes; - fetchTimetable(); - - _subscriptions = [ - profile.selectedClasses.onChange.listen((_) => fetchTimetable()), - appContext.date.onChange.listen((_) => fetchTimetable()), - appContext.view.onChange.listen((_) => fetchTimetable()), - ]; - - setState(() {}); - } - - Future<void> fetchTimetable() async { - final date = appContext.date.value; - final view = appContext.view.value; - final fetchedTimetable = await view.timetableOf(date, untis: untis); - - setState(() { - timetable = fetchedTimetable; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text(appName), - ), - drawer: ClassDrawer(appContext: appContext), - body: Column( - children: [ - Toolbar(appContext: appContext), - Expanded( - child: Timetable( - data: timetable, - appContext: appContext, - ), - ), - ], - ), + home: HomePage(appContext: appContext), ); } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..f6360dd --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,106 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../branding.dart'; +import '../context.dart'; +import '../dialogs/error_dialog.dart'; +import '../drawer/drawer.dart'; +import '../timetable/timetable.dart'; +import '../toolbar/toolbar.dart'; +import '../untis/fetch.dart'; +import '../untis/timetable.dart'; +import '../util/listenable.dart'; +import '../views/mixed_class_view.dart'; + +class HomePage extends StatefulWidget { + final AppContext appContext; + + const HomePage({super.key, required this.appContext}); + + @override + State<HomePage> createState() => _HomePageState(); +} + +class _HomePageState extends State<HomePage> { + late List<StreamSubscription> _subscriptions; + + TimetableData? timetable; + + AppContext get appContext => widget.appContext; + UntisFetch get untis => appContext.untis; + + @override + void initState() { + super.initState(); + loadProfile().onError((error, _) { + _showErrorDialog('Failed to connect', error); + }); + } + + @override + void dispose() { + for (var subscription in _subscriptions) { + subscription.cancel(); + } + super.dispose(); + } + + void _showErrorDialog(String title, Object? error) { + stderr.write(error); + showDialog( + context: context, + builder: (context) => ErrorDialog(title: title, error: error), + ); + } + + Future<void> loadProfile() async { + final profile = await appContext.profile.firstNotNull; + final classes = await untis.allClasses.fetched; + + appContext.profile.value = profile; + appContext.classes = classes; + fetchTimetable(); + + _subscriptions = [ + profile.selectedClasses.onChange.listen((_) => fetchTimetable()), + appContext.date.onChange.listen((_) => fetchTimetable()), + ]; + + setState(() {}); + } + + Future<void> fetchTimetable() async { + final profile = await appContext.profile.firstNotNull; + final view = MixedClassView(classIds: profile.selectedClasses); + + final date = appContext.date.value; + final fetchedTimetable = await view.timetableOf(date, untis: untis); + + setState(() { + timetable = fetchedTimetable; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text(appName), + ), + drawer: ClassDrawer(appContext: appContext), + body: Column( + children: [ + Toolbar(appContext: appContext), + Expanded( + child: Timetable( + data: timetable, + appContext: appContext, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/view_page.dart b/lib/pages/view_page.dart new file mode 100644 index 0000000..b969d9a --- /dev/null +++ b/lib/pages/view_page.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +import '../context.dart'; +import '../timetable/timetable.dart'; +import '../toolbar/toolbar.dart'; +import '../untis/fetch.dart'; +import '../untis/timetable.dart'; +import '../views/view.dart'; + +class ViewPage extends StatefulWidget { + final TimetableView view; + final AppContext appContext; + + const ViewPage({super.key, required this.view, required this.appContext}); + + @override + State<ViewPage> createState() => _ViewPageState(); +} + +class _ViewPageState extends State<ViewPage> { + TimetableData? timetable; + + AppContext get appContext => widget.appContext; + UntisFetch get untis => appContext.untis; + + @override + void initState() { + super.initState(); + fetchTimetable(); + } + + Future<void> fetchTimetable() async { + final date = appContext.date.value; + final fetchedTimetable = await widget.view.timetableOf(date, untis: untis); + + setState(() { + timetable = fetchedTimetable; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('View Page'), + ), + body: Column( + children: [ + Toolbar(appContext: appContext), + Expanded( + child: Timetable( + data: timetable, + appContext: appContext, + ), + ), + ], + ), + ); + } +} diff --git a/lib/timetable/lesson_dialog.dart b/lib/timetable/lesson_dialog.dart index f29c5dc..c873466 100644 --- a/lib/timetable/lesson_dialog.dart +++ b/lib/timetable/lesson_dialog.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import '../branding.dart'; import '../context.dart'; +import '../pages/view_page.dart'; import '../untis/lesson.dart'; import '../util/set_extension.dart'; import '../views/lecture_view.dart'; @@ -53,8 +54,14 @@ class _LessonDialogState extends State<LessonDialog> { } void changeView(TimetableView view) { - widget.appContext.view.value = view; - Navigator.pop(context); + Navigator.of(context) + ..pop() + ..push(MaterialPageRoute( + builder: (context) => ViewPage( + appContext: widget.appContext, + view: view, + ), + )); } @override -- GitLab