-
Notifications
You must be signed in to change notification settings - Fork 2
/
DefaultViewOverlay.tsx
111 lines (103 loc) · 3.77 KB
/
DefaultViewOverlay.tsx
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module ContentView
*/
import "./DefaultViewOverlay.scss";
import * as React from "react";
import type { ScreenViewport } from "@itwin/core-frontend";
import {
SolarTimeline,
TimelineComponent,
} from "@itwin/imodel-components-react";
import { useScheduleAnimationDataProvider } from "../hooks/useScheduleAnimationDataProvider";
import { useActiveViewport } from "../hooks/useActiveViewport";
import { useSolarDataProvider } from "../hooks/useSolarDataProvider";
import { useAnalysisAnimationDataProvider } from "../hooks/useAnalysisAnimationDataProvider";
/** Props of Viewport Overlay Control that show timelines
* @public
*/
export interface ViewOverlayProps {
viewport: ScreenViewport;
onPlayPause?: (playing: boolean) => void; // callback with play/pause button is pressed
featureOptions?: { [key: string]: any };
}
/**
* Default viewport overlay that examines ViewState of the active view for a schedule script, analysis data, or solar data. If one of these is detected, the corresponding
* data provider is attached to the TimelineComponent and the overlay is made visible.
* @public
*/
// istanbul ignore next
export function DefaultViewOverlay({
viewport,
onPlayPause,
featureOptions,
}: ViewOverlayProps) {
const solarDataTimelineProvider = useSolarDataProvider(viewport);
const analysisAnimationTimelineDataProvider =
useAnalysisAnimationDataProvider(viewport);
const scheduleTimelineDataProvider =
useScheduleAnimationDataProvider(viewport);
const currentViewport = useActiveViewport();
if (!currentViewport) return null;
// Solar gets first shot
if (
solarDataTimelineProvider &&
!!featureOptions?.defaultViewOverlay?.enableSolarTimelineViewOverlay
) {
return (
<div className="uifw-view-overlay">
<div className="uifw-animation-overlay">
<SolarTimeline dataProvider={solarDataTimelineProvider} />
</div>
</div>
);
}
if (
analysisAnimationTimelineDataProvider &&
!!featureOptions?.defaultViewOverlay?.enableAnalysisTimelineViewOverlay
) {
return (
<div className="uifw-view-overlay">
<div className="uifw-animation-overlay">
<TimelineComponent
startDate={analysisAnimationTimelineDataProvider.start}
endDate={analysisAnimationTimelineDataProvider.end}
initialDuration={
analysisAnimationTimelineDataProvider.initialDuration
}
totalDuration={analysisAnimationTimelineDataProvider.duration}
minimized={true}
onChange={
analysisAnimationTimelineDataProvider.onAnimationFractionChanged
}
onPlayPause={onPlayPause}
/>
</div>
</div>
);
}
if (
scheduleTimelineDataProvider &&
!!featureOptions?.defaultViewOverlay?.enableScheduleAnimationViewOverlay
) {
return (
<div className="uifw-view-overlay">
<div className="uifw-animation-overlay">
<TimelineComponent
startDate={scheduleTimelineDataProvider.start}
endDate={scheduleTimelineDataProvider.end}
initialDuration={scheduleTimelineDataProvider.initialDuration}
totalDuration={scheduleTimelineDataProvider.duration}
minimized={true}
onChange={scheduleTimelineDataProvider.onAnimationFractionChanged}
onPlayPause={onPlayPause}
/>
</div>
</div>
);
}
return null;
}