campusMapBuildingAt function

CampusMapBuilding? campusMapBuildingAt({
  1. required CampusMapPoint point,
  2. required List<CampusMapBuilding> buildings,
  3. required String? selectedBuildingCode,
  4. required List<CampusMapRoom> visibleRooms,
})

Finds an unambiguous new building under the camera center.

Downloaded geometry for the visible floor takes precedence over first-floor building outlines: upper floors can extend into a neighbouring footprint. Polygon holes remain outside, so courtyards do not trap the selection.

Implementation

CampusMapBuilding? campusMapBuildingAt({
  required CampusMapPoint point,
  required List<CampusMapBuilding> buildings,
  required String? selectedBuildingCode,
  required List<CampusMapRoom> visibleRooms,
}) {
  if (selectedBuildingCode != null &&
      visibleRooms.any(
        (room) =>
            room.buildingCode == selectedBuildingCode &&
            room.polygons.any(
              (polygon) => campusMapContainsPoint(polygon, point),
            ),
      )) {
    return null;
  }
  final matches = buildings
      .where(
        (building) => building.polygons.any(
          (polygon) => campusMapContainsPoint(polygon, point),
        ),
      )
      .toList();
  if (matches.length != 1 || matches.single.code == selectedBuildingCode) {
    return null;
  }
  return matches.single;
}