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