Skip to content

Commit 656ec78

Browse files
committed
Add "multiview"
Based on 4x4 grid layout Squeeze camera and overlay views to half height in order to fit prompter. Use checkerboard pattern for backgrounds to emphasise transparent nature of overlay window
1 parent ca4cef2 commit 656ec78

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

packages/webui/src/client/ui/ClockView/ClockView.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { CameraScreen } from './CameraScreen/index.js'
1414
import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
1515
import { useTranslation } from 'react-i18next'
1616
import { ClockViewIndex } from './ClockViewIndex.js'
17+
import { MultiviewScreen } from './MultiviewScreen.js'
1718

1819
export function ClockView({ studioId }: Readonly<{ studioId: StudioId }>): JSX.Element {
1920
useSubscription(MeteorPubSub.rundownPlaylistForStudio, studioId, true)
@@ -62,6 +63,9 @@ export function ClockView({ studioId }: Readonly<{ studioId: StudioId }>): JSX.E
6263
<CameraScreen playlist={playlist} studioId={studioId} />
6364
</RundownTimingProvider>
6465
</Route>
66+
<Route path="/countdowns/:studioId/multiview">
67+
<MultiviewScreen studioId={studioId} />
68+
</Route>
6569
<Route path="/countdowns/:studioId">
6670
<ClockViewIndex studioId={studioId} />
6771
</Route>

packages/webui/src/client/ui/ClockView/ClockViewIndex.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export function ClockViewIndex({ studioId }: Readonly<{ studioId: StudioId }>):
3232
<li>
3333
<Link to={`/activeRundown/${studioId}`}>{t('Active Rundown')}</Link>
3434
</li>
35+
<li>
36+
<Link to={`/countdowns/${studioId}/multiview`}>{t('Multiview (All Screens)')}</Link>
37+
</li>
3538
</ul>
3639
</section>
3740
</section>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
.multiview-grid {
2+
display: grid;
3+
grid-template-columns: 1fr 1fr 1fr 1fr;
4+
grid-template-rows: 1fr 1fr 1fr 1fr;
5+
gap: 10px;
6+
height: 100vh;
7+
width: 100vw;
8+
padding: 10px;
9+
box-sizing: border-box;
10+
background: black;
11+
}
12+
13+
.multiview-item {
14+
display: flex;
15+
flex-direction: column;
16+
border: 2px solid #cc0;
17+
18+
iframe {
19+
flex: 1;
20+
width: 100%;
21+
border: none;
22+
background: repeating-conic-gradient(#ddd 0% 25%, #eee 0% 50%) 50% / 40px 40px;
23+
}
24+
}
25+
26+
.multiview-label {
27+
padding: 8px;
28+
text-align: center;
29+
background-color: #f0f0f0;
30+
font-weight: bold;
31+
}
32+
33+
.multiview-presenter {
34+
grid-column: 1 / 3;
35+
grid-row: 1 / 3;
36+
}
37+
38+
.multiview-director {
39+
grid-column: 3 / 5;
40+
grid-row: 1 / 3;
41+
}
42+
43+
.multiview-prompter {
44+
grid-column: 1 / 3;
45+
grid-row: 3 / 5;
46+
}
47+
48+
.multiview-overlay {
49+
grid-column: 3 / 5;
50+
grid-row: 3 / 4;
51+
}
52+
53+
.multiview-camera {
54+
grid-column: 3 / 5;
55+
grid-row: 4 / 5;
56+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids'
2+
import './MultiviewScreen.scss'
3+
4+
interface MultiviewScreenProps {
5+
studioId: StudioId
6+
}
7+
8+
export function MultiviewScreen({ studioId }: Readonly<MultiviewScreenProps>): JSX.Element {
9+
return (
10+
<div className="multiview-grid">
11+
<div className="multiview-item multiview-presenter">
12+
<iframe src={`/countdowns/${studioId}/presenter`} title="Presenter Screen" />
13+
<div className="multiview-label">Presenter Screen</div>
14+
</div>
15+
<div className="multiview-item multiview-director">
16+
<iframe src={`/countdowns/${studioId}/director`} title="Director Screen" />
17+
<div className="multiview-label">Director Screen</div>
18+
</div>
19+
<div className="multiview-item multiview-prompter">
20+
<iframe src={`/prompter/${studioId}`} title="Prompter" />
21+
<div className="multiview-label">Prompter</div>
22+
</div>
23+
<div className="multiview-item multiview-overlay">
24+
<iframe src={`/countdowns/${studioId}/overlay`} title="Overlay Screen" />
25+
<div className="multiview-label">Overlay Screen</div>
26+
</div>
27+
<div className="multiview-item multiview-camera">
28+
<iframe src={`/countdowns/${studioId}/camera`} title="Camera Screen" />
29+
<div className="multiview-label">Camera Screen</div>
30+
</div>
31+
</div>
32+
)
33+
}

0 commit comments

Comments
 (0)