-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdrawOccupancyZones.ts
88 lines (80 loc) · 2.62 KB
/
drawOccupancyZones.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { drawOccupancyZonesTexts } from './drawOccupancyZonesTexts';
import {
TRACK_HEIGHT_CONTAINER,
CANVAS_PADDING,
OCCUPANCY_ZONE_START,
OCCUPANCY_ZONE_HEIGHT,
COLORS,
} from '../../consts';
import type { OccupancyZone, Track } from '../../types';
type DrawZone = {
ctx: CanvasRenderingContext2D;
arrivalTime: number;
departureTime: number;
};
const drawDefaultZone = ({ ctx, arrivalTime, departureTime }: DrawZone) => {
ctx.beginPath();
ctx.rect(arrivalTime, OCCUPANCY_ZONE_START, departureTime! - arrivalTime, OCCUPANCY_ZONE_HEIGHT);
ctx.fill();
ctx.stroke();
};
const drawThroughTrain = ({ ctx, arrivalTime }: Omit<DrawZone, 'departureTime'>) => {
ctx.beginPath();
ctx.moveTo(arrivalTime - 1, OCCUPANCY_ZONE_START + 1.5);
ctx.lineTo(arrivalTime - 4.5, OCCUPANCY_ZONE_START - 3.5);
ctx.lineTo(arrivalTime + 4.5, OCCUPANCY_ZONE_START - 3.5);
ctx.lineTo(arrivalTime + 1, OCCUPANCY_ZONE_START + 1.5);
ctx.lineTo(arrivalTime + 4.5, OCCUPANCY_ZONE_START + 6.5);
ctx.lineTo(arrivalTime - 4.5, OCCUPANCY_ZONE_START + 6.5);
ctx.lineTo(arrivalTime - 1, OCCUPANCY_ZONE_START + 1.5);
ctx.fill();
ctx.moveTo(arrivalTime - 1, OCCUPANCY_ZONE_START + 1.5);
ctx.lineTo(arrivalTime + 1, OCCUPANCY_ZONE_START + 1.5);
ctx.stroke();
};
export const drawOccupancyZones = ({
ctx,
width,
height,
tracks,
occupancyZones,
getTimePixel,
}: {
ctx: CanvasRenderingContext2D;
width: number;
height: number;
tracks: Track[] | undefined;
occupancyZones: OccupancyZone[] | undefined;
getTimePixel: (time: number) => number;
}) => {
ctx.clearRect(0, 0, width, height);
tracks?.forEach((track, index) => {
const trackTranslate = index === 0 ? CANVAS_PADDING : TRACK_HEIGHT_CONTAINER;
ctx.translate(0, trackTranslate);
const filteredOccupancyZone = occupancyZones?.filter((zone) => zone.trackId === track.id);
if (filteredOccupancyZone) {
filteredOccupancyZone.forEach((zone) => {
const arrivalTime = getTimePixel(zone.arrivalTime.getTime());
const departureTime = getTimePixel(zone.departureTime.getTime());
const isThroughTrain = arrivalTime === departureTime;
ctx.fillStyle = zone.color;
ctx.strokeStyle = COLORS.WHITE_100;
ctx.lineWidth = 1;
ctx.lineJoin = 'round';
ctx.lineCap = 'round';
if (isThroughTrain) {
drawThroughTrain({ ctx, arrivalTime });
} else {
drawDefaultZone({ ctx, arrivalTime, departureTime });
}
drawOccupancyZonesTexts({
ctx,
zone,
arrivalTime,
departureTime,
isThroughTrain,
});
});
}
});
};