arrange method
List<OrganizedCalendarEventData<T> >
arrange({
- required List<
CalendarEventData< events,T> > - required double height,
- required double width,
- required double heightPerMinute,
override
This method will arrange all the events in and return List of
OrganizedCalendarEventData
.
Implementation
@override
List<OrganizedCalendarEventData<T>> arrange({
required List<CalendarEventData<T>> events,
required double height,
required double width,
required double heightPerMinute,
}) {
final durations = _getEventsDuration(events);
final tempEvents = [...events]..sort((e1, e2) =>
(e1.startTime?.getTotalMinutes ?? 0) -
(e2.startTime?.getTotalMinutes ?? 0));
final table = List.generate(
events.length,
(index) => List.generate(
durations.length,
(index) => null as CalendarEventData<T>?, // ignore: unnecessary_cast
),
);
var eventCounter = 0;
var rowCounter = 0;
while (tempEvents.isNotEmpty && rowCounter < events.length) {
eventCounter = 0;
var end = tempEvents[0].endTime?.getTotalMinutes ?? 0;
_insertIntoTable(table, durations, rowCounter, tempEvents[0]);
tempEvents.removeAt(0);
while (tempEvents.isNotEmpty && eventCounter < tempEvents.length) {
if ((tempEvents[eventCounter].startTime?.getTotalMinutes ?? 0) > end) {
_insertIntoTable(
table, durations, rowCounter, tempEvents[eventCounter]);
end = tempEvents[eventCounter].endTime?.getTotalMinutes ?? 0;
tempEvents.removeAt(eventCounter);
} else {
eventCounter++;
}
}
rowCounter++;
}
final arrangedEvent = <OrganizedCalendarEventData<T>>[];
final widthPerCol = width / rowCounter;
for (var i = 0; i < rowCounter; i++) {
CalendarEventData<T>? event;
for (var j = 0; j < durations.length; j++) {
if (table[i][j] != null && (event == null || table[i][j] != event)) {
event = table[i][j];
final top =
(event!.startTime?.getTotalMinutes ?? 0) * heightPerMinute;
final bottom = height -
((event.endTime?.getTotalMinutes ?? 0) * heightPerMinute);
final left = widthPerCol * i;
final right = width - (left + widthPerCol);
final index = _containsEvent(arrangedEvent, event);
if (index == -1) {
final eventData = OrganizedCalendarEventData<T>(
top: top,
bottom: bottom,
events: [event],
left: left,
right: right,
startDuration: event.startTime ?? DateTime.now(),
endDuration: event.endTime ?? DateTime.now(),
);
arrangedEvent.add(eventData);
} else {
arrangedEvent[index] = arrangedEvent[index]
.getWithUpdatedRight(arrangedEvent[index].right - widthPerCol);
}
} else {
continue;
}
}
}
return arrangedEvent;
}