2022-11-01 09:46:23 +01:00
|
|
|
// SPDX-FileCopyrightText: 2022 Iconica
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
2022-08-24 09:39:36 +02:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:timetable/timetable.dart';
|
|
|
|
|
|
|
|
void main() {
|
2022-08-26 09:04:08 +02:00
|
|
|
runApp(const MaterialApp(home: TimetableDemo()));
|
2022-08-24 09:39:36 +02:00
|
|
|
}
|
|
|
|
|
2022-08-24 12:03:32 +02:00
|
|
|
class TimetableDemo extends StatefulWidget {
|
2022-08-24 09:39:36 +02:00
|
|
|
const TimetableDemo({Key? key}) : super(key: key);
|
|
|
|
|
2022-08-24 12:03:32 +02:00
|
|
|
@override
|
|
|
|
State<TimetableDemo> createState() => _TimetableDemoState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _TimetableDemoState extends State<TimetableDemo> {
|
2022-08-24 16:02:07 +02:00
|
|
|
bool _grouped = false;
|
2022-11-08 10:33:48 +01:00
|
|
|
bool _horizontal = true;
|
2022-08-24 12:03:32 +02:00
|
|
|
final ScrollController _scrollController = ScrollController();
|
|
|
|
final List<TimeBlock> blocks = [
|
2022-08-24 16:02:07 +02:00
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 14, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 15, minute: 0),
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 0,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 8, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 9, minute: 0),
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 1,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 9, minute: 15),
|
|
|
|
end: const TimeOfDay(hour: 10, minute: 0),
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 1,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 10, minute: 15),
|
|
|
|
end: const TimeOfDay(hour: 11, minute: 0),
|
2022-08-24 16:02:07 +02:00
|
|
|
child: Container(color: Colors.purple, height: 300, width: 50),
|
2022-11-08 10:33:48 +01:00
|
|
|
childDimension: 300,
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 2,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 6, minute: 15),
|
|
|
|
end: const TimeOfDay(hour: 7, minute: 0),
|
2022-11-08 10:33:48 +01:00
|
|
|
child: Container(color: Colors.blue, height: 300, width: 300),
|
|
|
|
childDimension: 300,
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 2,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 18, minute: 0),
|
2022-11-08 10:33:48 +01:00
|
|
|
end: const TimeOfDay(hour: 18, minute: 30),
|
|
|
|
child:
|
|
|
|
const SizedBox(width: 60, height: 60, child: const Text('High Tea')),
|
|
|
|
childDimension: 60,
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 10,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 18, minute: 0),
|
2022-11-08 10:33:48 +01:00
|
|
|
end: const TimeOfDay(hour: 18, minute: 30),
|
|
|
|
child: const SizedBox(
|
|
|
|
height: 60,
|
|
|
|
width: 60,
|
|
|
|
child: const Text('High Tea'),
|
|
|
|
),
|
|
|
|
childDimension: 60,
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 10,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 18, minute: 0),
|
2022-11-08 10:33:48 +01:00
|
|
|
end: const TimeOfDay(hour: 18, minute: 30),
|
|
|
|
child: const SizedBox(
|
|
|
|
height: 60,
|
|
|
|
width: 60,
|
|
|
|
child: const Text('High Tea'),
|
|
|
|
),
|
|
|
|
childDimension: 60,
|
2022-08-24 16:02:07 +02:00
|
|
|
id: 10,
|
|
|
|
),
|
2022-08-24 17:14:50 +02:00
|
|
|
TimeBlock(
|
2022-08-26 09:04:08 +02:00
|
|
|
start: const TimeOfDay(hour: 18, minute: 0),
|
2022-11-08 10:33:48 +01:00
|
|
|
end: const TimeOfDay(hour: 18, minute: 30),
|
|
|
|
child: const SizedBox(
|
|
|
|
height: 50,
|
|
|
|
width: 50,
|
|
|
|
child: const Text('High Tea'),
|
|
|
|
),
|
|
|
|
childDimension: 60,
|
2022-08-24 17:14:50 +02:00
|
|
|
id: 0,
|
|
|
|
),
|
2022-11-08 10:33:48 +01:00
|
|
|
TimeBlock(
|
|
|
|
start: const TimeOfDay(hour: 14, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 15, minute: 0),
|
|
|
|
id: 100,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
|
|
|
start: const TimeOfDay(hour: 14, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 15, minute: 0),
|
|
|
|
id: 101,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
|
|
|
start: const TimeOfDay(hour: 14, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 15, minute: 0),
|
|
|
|
id: 102,
|
|
|
|
),
|
|
|
|
TimeBlock(
|
|
|
|
start: const TimeOfDay(hour: 14, minute: 0),
|
|
|
|
end: const TimeOfDay(hour: 15, minute: 0),
|
|
|
|
id: 103,
|
|
|
|
),
|
2022-08-24 12:03:32 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
_scrollController.dispose();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
2022-08-24 09:39:36 +02:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2022-11-18 14:22:05 +01:00
|
|
|
var size = MediaQuery.of(context).size;
|
2022-08-24 12:03:32 +02:00
|
|
|
return Scaffold(
|
2022-11-18 14:22:05 +01:00
|
|
|
// backgroundColor: Colors.green,
|
2022-08-24 12:03:32 +02:00
|
|
|
body: Padding(
|
|
|
|
padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
|
2022-11-18 14:22:05 +01:00
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
// toggle between horizontal and vertical
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: [
|
|
|
|
TextButton(
|
|
|
|
onPressed: () {
|
|
|
|
setState(() {
|
|
|
|
_horizontal = !_horizontal;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
child: Text(_horizontal ? 'Horizontal' : 'Vertical'),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
// toggle between grouped and ungrouped blocks
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
const Text('Grouped'),
|
|
|
|
Switch(
|
|
|
|
value: _grouped,
|
|
|
|
onChanged: (value) {
|
|
|
|
setState(() {
|
|
|
|
_grouped = value;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
Container(
|
|
|
|
color: Colors.white,
|
|
|
|
child: Timetable(
|
|
|
|
size: Size(size.width, size.height * 0.64),
|
2022-11-08 10:33:48 +01:00
|
|
|
tableDirection: _horizontal ? Axis.horizontal : Axis.vertical,
|
|
|
|
startHour: 3,
|
2022-11-18 14:22:05 +01:00
|
|
|
endHour: 24,
|
2022-11-08 10:33:48 +01:00
|
|
|
timeBlocks: blocks,
|
|
|
|
scrollController: _scrollController,
|
|
|
|
combineBlocks: true,
|
|
|
|
mergeBlocks: _grouped,
|
|
|
|
theme: const TableTheme(
|
|
|
|
tablePaddingStart: 0,
|
|
|
|
blockPaddingBetween: 10,
|
2022-08-24 16:02:07 +02:00
|
|
|
),
|
2022-11-08 10:33:48 +01:00
|
|
|
),
|
2022-11-18 14:22:05 +01:00
|
|
|
),
|
|
|
|
],
|
2022-08-24 12:03:32 +02:00
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
2022-08-24 09:39:36 +02:00
|
|
|
}
|
|
|
|
}
|