diff --git a/example/lib/main.dart b/example/lib/main.dart index 628ad00..bcbc2d4 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -10,6 +10,6 @@ class TimetableDemo extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold(body: Timetable()); + return const Scaffold(body: Timetable()); } } diff --git a/lib/src/table.dart b/lib/src/table.dart new file mode 100644 index 0000000..5e95732 --- /dev/null +++ b/lib/src/table.dart @@ -0,0 +1,69 @@ +part of timetable; + +class Table extends StatelessWidget { + const Table({ + required this.startHour, + required this.endHour, + Key? key, + }) : super(key: key); + + final int startHour; + final int endHour; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + for (int i = startHour; i <= endHour; i++) ...[ + SizedBox( + height: i == endHour ? 40 : 80, + child: Column( + children: [ + Row( + children: [ + Text( + '${(i).toString().padLeft(2, '0')}:00', + ), + const SizedBox( + width: 5, + ), + Expanded( + child: Container( + height: 2, + color: Colors.grey.withOpacity(0.5), + ), + ) + ], + ), + if (i != endHour) ...[ + const Spacer(), + Container( + margin: const EdgeInsets.only( + left: 40, + ), + height: 2, + child: Row( + children: [ + for (int i = 0; i < 25; i++) ...[ + Container( + width: + (MediaQuery.of(context).size.width - 40) / 25, + height: 2, + color: i.isEven + ? Colors.grey.withOpacity(0.5) + : Colors.transparent, + ), + ], + ], + ), + ), + const Spacer(), + ], + ], + ), + ), + ], + ], + ); + } +} diff --git a/lib/src/timetable.dart b/lib/src/timetable.dart index 19505ef..e152e94 100644 --- a/lib/src/timetable.dart +++ b/lib/src/timetable.dart @@ -1,15 +1,56 @@ part of timetable; class Timetable extends StatefulWidget { - const Timetable({Key? key}) : super(key: key); + const Timetable({ + this.scrollController, + this.startHour = 0, + this.endHour = 24, + Key? key, + }) : super(key: key); + + /// Hour at which the timetable starts. + final int startHour; + + /// Hour at which the timetable ends. + final int endHour; + + /// The scroll controller to control the scrolling of the timetable. + final ScrollController? scrollController; @override State createState() => _TimetableState(); } class _TimetableState extends State { + late ScrollController _scrollController; + + @override + void initState() { + super.initState(); + _scrollController = widget.scrollController ?? ScrollController(); + } + + @override + void dispose() { + if (widget.scrollController == null) { + _scrollController.dispose(); + } + super.dispose(); + } + @override Widget build(BuildContext context) { - return const Text('timetable'); + return SingleChildScrollView( + physics: const BouncingScrollPhysics(), + controller: _scrollController, + child: Stack( + children: [ + Table( + startHour: widget.startHour, + endHour: widget.endHour, + ), + ], + ), + ); } } diff --git a/lib/timetable.dart b/lib/timetable.dart index 45cfcf6..8df4de3 100644 --- a/lib/timetable.dart +++ b/lib/timetable.dart @@ -3,3 +3,4 @@ library timetable; import 'package:flutter/material.dart'; part 'src/timetable.dart'; +part 'src/table.dart';