arrange method

  1. @override
List<OrganizedCalendarEventData<T>> arrange({
  1. required List<CalendarEventData<T>> events,
  2. required double height,
  3. required double width,
  4. 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;
}