Implemented TimeTable
This commit is contained in:
35
lib/app.dart
35
lib/app.dart
@ -37,19 +37,28 @@ class _AppState extends State<App> {
|
||||
)
|
||||
],
|
||||
),
|
||||
body: PageView(
|
||||
controller: pageController,
|
||||
children: const [
|
||||
Timetable(),
|
||||
Talk(),
|
||||
Files(),
|
||||
Overhang(),
|
||||
body: Stack(
|
||||
children: [
|
||||
PageView(
|
||||
controller: pageController,
|
||||
children: const [
|
||||
Timetable(),
|
||||
Talk(),
|
||||
Files(),
|
||||
Overhang(),
|
||||
],
|
||||
onPageChanged: (page) {
|
||||
setState(() {
|
||||
currentPage = page;
|
||||
});
|
||||
},
|
||||
),
|
||||
// LinearProgressIndicator(
|
||||
// backgroundColor: Colors.transparent,
|
||||
// valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor),
|
||||
// minHeight: 5,
|
||||
// ),
|
||||
],
|
||||
onPageChanged: (page) {
|
||||
setState(() {
|
||||
currentPage = page;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
bottomNavigationBar: BottomNavigationBar(
|
||||
@ -91,7 +100,7 @@ class _AppState extends State<App> {
|
||||
],
|
||||
), label: "Talk"),
|
||||
const BottomNavigationBarItem(icon: Icon(Icons.folder), label: "Dateien"),
|
||||
const BottomNavigationBarItem(icon: Icon(Icons.list), label: "Mehr"),
|
||||
const BottomNavigationBarItem(icon: Icon(Icons.more_horiz), label: "Mehr"),
|
||||
],
|
||||
selectedItemColor: Theme.of(context).primaryColor,
|
||||
unselectedItemColor: Colors.grey,
|
||||
|
@ -8,19 +8,20 @@ import 'package:marianum_mobile/data/socketConnection.dart';
|
||||
class IncomingPacket extends ChangeNotifier {
|
||||
|
||||
String packetId;
|
||||
bool useJsonDecode;
|
||||
|
||||
bool _isReceived = false;
|
||||
bool get isReceived => _isReceived;
|
||||
|
||||
IncomingPacket(this.packetId) {
|
||||
log("PACKETLISTENER ERSTELLT!");
|
||||
IncomingPacket(this.packetId, {this.useJsonDecode = true}) {
|
||||
SocketConnection.read.listen((event) {
|
||||
if(event.startsWith("$packetId:")) {
|
||||
_isReceived = true;
|
||||
|
||||
// THIS listener handles the incomming request
|
||||
log("$packetId is handled!");
|
||||
handle(jsonDecode(event.split("$packetId:")[1]));
|
||||
String content = event.split("$packetId:")[1];
|
||||
handle(useJsonDecode ? jsonDecode(content) : content);
|
||||
}
|
||||
notifyListeners();
|
||||
});
|
||||
|
21
lib/data/incommingPackets/errorPacket.dart
Normal file
21
lib/data/incommingPackets/errorPacket.dart
Normal file
@ -0,0 +1,21 @@
|
||||
import 'package:marianum_mobile/data/incomingPacket.dart';
|
||||
|
||||
class ErrorPacket extends IncomingPacket {
|
||||
ErrorPacket() : super("error", useJsonDecode: false);
|
||||
|
||||
bool _errorDismissed = true;
|
||||
bool get errorDismissed => _errorDismissed;
|
||||
set errorDismissed(bool value) {
|
||||
_errorDismissed = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String _errorText = "";
|
||||
String get errorText => _errorText;
|
||||
|
||||
@override
|
||||
void handle(data) {
|
||||
_errorDismissed = false;
|
||||
_errorText = data;
|
||||
}
|
||||
}
|
71
lib/data/incommingPackets/timetablePacket.dart
Normal file
71
lib/data/incommingPackets/timetablePacket.dart
Normal file
@ -0,0 +1,71 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:marianum_mobile/data/socketConnection.dart';
|
||||
|
||||
import '../incomingPacket.dart';
|
||||
|
||||
class TimetablePacket extends IncomingPacket {
|
||||
TimetablePacket() : super('timetable');
|
||||
|
||||
TimeTableData _timeTable = TimeTableData();
|
||||
TimeTableData get timeTable => _timeTable;
|
||||
|
||||
@override
|
||||
void handle(data) {
|
||||
_timeTable = TimeTableData();
|
||||
data.forEach((day) {
|
||||
TimeTableDay dayData = TimeTableDay(List<TimeTableEntry>.empty(growable: true), day['title']);
|
||||
day['tiles'].forEach((tile) {
|
||||
dayData._entries.add(TimeTableEntry(
|
||||
tile['title'], tile['title'], tile['room'], tile['title'],
|
||||
TimeTableEntryTime(tile['begin']['hour'], tile['begin']['minute']),
|
||||
TimeTableEntryTime(tile['end']['hour'], tile['end']['minute'])
|
||||
));
|
||||
});
|
||||
|
||||
_timeTable._days.add(dayData);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class TimeTableData {
|
||||
List<TimeTableDay> _days = [];
|
||||
|
||||
List<TimeTableDay> get days => _days;
|
||||
|
||||
set days(List<TimeTableDay> value) {
|
||||
_days = value;
|
||||
}
|
||||
}
|
||||
|
||||
class TimeTableDay {
|
||||
List<TimeTableEntry> _entries;
|
||||
String _name;
|
||||
|
||||
TimeTableDay(this._entries, this._name);
|
||||
|
||||
List<TimeTableEntry> get entries => _entries;
|
||||
String get name => _name;
|
||||
|
||||
}
|
||||
|
||||
class TimeTableEntry {
|
||||
late String subject;
|
||||
late String teacher;
|
||||
late String room;
|
||||
late String classes;
|
||||
|
||||
late TimeTableEntryTime start;
|
||||
late TimeTableEntryTime end;
|
||||
|
||||
TimeTableEntry(this.subject, this.teacher, this.room, this.classes,
|
||||
this.start, this.end);
|
||||
}
|
||||
|
||||
class TimeTableEntryTime {
|
||||
int hour;
|
||||
int minute;
|
||||
|
||||
TimeTableEntryTime(this.hour, this.minute);
|
||||
}
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:marianum_mobile/data/accountModel.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/authenticatePacket.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/errorPacket.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/fileListPacket.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/talkChatPacket.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart';
|
||||
@ -17,6 +18,7 @@ import 'package:web_socket_channel/web_socket_channel.dart';
|
||||
import 'app.dart';
|
||||
import 'data/incommingPackets/serverInfoPacket.dart';
|
||||
import 'data/incommingPackets/talkContactsPacket.dart';
|
||||
import 'data/incommingPackets/timetablePacket.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
@ -30,11 +32,13 @@ Future<void> main() async {
|
||||
MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider(create: (context) => AccountModel()),
|
||||
ChangeNotifierProvider(create: (context) => ErrorPacket()),
|
||||
ChangeNotifierProvider(create: (context) => ServerInfoPacket()),
|
||||
ChangeNotifierProvider(create: (context) => TalkContactsPaket()),
|
||||
ChangeNotifierProvider(create: (context) => TalkNotificationsPacket()),
|
||||
ChangeNotifierProvider(create: (context) => FileListPacket()),
|
||||
ChangeNotifierProvider(create: (context) => TalkChatPacket()),
|
||||
ChangeNotifierProvider(create: (context) => TimetablePacket()),
|
||||
],
|
||||
child: const Main(),
|
||||
)
|
||||
@ -89,9 +93,17 @@ class _MainState extends State<Main> {
|
||||
|
||||
if(snapshot.hasData) {
|
||||
|
||||
return Consumer<AccountModel>(
|
||||
builder: (context, value, child) {
|
||||
return value.isLoggedIn ? const App() : const Login();
|
||||
return Consumer2<AccountModel, ErrorPacket>(
|
||||
builder: (context, accountModel, errorPacket, child) {
|
||||
if(errorPacket.errorDismissed) {
|
||||
return accountModel.isLoggedIn ? const App() : const Login();
|
||||
} else {
|
||||
return AlertDialog(title: const Text("Serverseitige Fehlermeldung"), content: Text(errorPacket.errorText), actions: [
|
||||
TextButton(onPressed: () {
|
||||
Provider.of<ErrorPacket>(context, listen: false).errorDismissed = true;
|
||||
}, child: const Text("Weiter"))
|
||||
]);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
|
@ -1,6 +1,12 @@
|
||||
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
|
||||
import 'package:marianum_mobile/widget/loadingPacket.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:timetable_view/timetable_view.dart';
|
||||
|
||||
class Timetable extends StatefulWidget {
|
||||
const Timetable({Key? key}) : super(key: key);
|
||||
@ -13,15 +19,87 @@ class _TimetableState extends State<Timetable> {
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
Provider.of<TimetablePacket>(context, listen: false).invoke();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<ListTile> chats = List<ListTile>.empty(growable: true);
|
||||
return Consumer<TimetablePacket>(
|
||||
builder: (context, data, child) {
|
||||
|
||||
return const Center(
|
||||
child: Text("Not supported"),
|
||||
return LoadingPacket(packet: data, child: TimetableView(
|
||||
laneEventsList: _buildLaneEvents(context, data),
|
||||
onEventTap: (TableEvent event) {},
|
||||
timetableStyle: CustomTableStyle(context),
|
||||
onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
List<LaneEvents> _buildLaneEvents(context, TimetablePacket data) {
|
||||
List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
|
||||
data.timeTable.days.forEach((day) {
|
||||
List<TableEvent> tableEvents = List<TableEvent>.empty(growable: true);
|
||||
|
||||
day.entries.forEach((element) {
|
||||
tableEvents.add(
|
||||
TableEvent(
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
padding: const EdgeInsets.all(5),
|
||||
title: element.subject,
|
||||
location: "\n${element.room}",
|
||||
eventId: tableEvents.length,
|
||||
laneIndex: tableEvents.length,
|
||||
startTime: TableEventTime(hour: element.start.hour, minute: element.start.minute),
|
||||
endTime: TableEventTime(hour: element.end.hour, minute: element.end.minute)
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
laneEvents.add(
|
||||
LaneEvents(
|
||||
lane: Lane(laneIndex: laneEvents.length, name: day.name, textStyle: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold)),
|
||||
events: tableEvents
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
return laneEvents;
|
||||
}
|
||||
|
||||
void onEventTapCallBack(TableEvent event) {
|
||||
print(
|
||||
"Event Clicked!! LaneIndex ${event.laneIndex} Title: ${event.title} StartHour: ${event.startTime.hour} EndHour: ${event.endTime.hour}");
|
||||
}
|
||||
|
||||
void onTimeSlotTappedCallBack(
|
||||
int laneIndex, TableEventTime start, TableEventTime end) {
|
||||
print(
|
||||
"Empty Slot Clicked !! LaneIndex: $laneIndex StartHour: ${start.hour} EndHour: ${end.hour}");
|
||||
}
|
||||
}
|
||||
|
||||
class CustomTableStyle extends TimetableStyle {
|
||||
dynamic context;
|
||||
CustomTableStyle(context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
int get startHour => 07;
|
||||
@override
|
||||
int get endHour => 17;
|
||||
@override
|
||||
double get laneWidth => 200;
|
||||
@override
|
||||
Color get cornerColor => Theme.of(this.context).primaryColor;
|
||||
@override
|
||||
Color get timeItemTextColor => Theme.of(this.context).primaryColor;
|
||||
@override
|
||||
// TODO: implement timeItemHeight
|
||||
double get timeItemHeight => 60;
|
||||
}
|
@ -19,7 +19,7 @@ class _SettingsState extends State<Settings> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
ServerInfoPacket().invoke();
|
||||
Provider.of<ServerInfoPacket>(context, listen: false).invoke();
|
||||
}
|
||||
|
||||
@override
|
||||
|
Reference in New Issue
Block a user