Skip to content

Commit daa657d

Browse files
author
Mint de Wit
committed
chore: update StoryBoard view with new previews
1 parent 956152c commit daa657d

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

packages/webui/src/client/ui/PreviewPopUp/PreviewPopUpContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function convertSourceLayerItemToPreview(
6868
piece: PieceUi,
6969
contentStatus?: ReadonlyObjectDeep<PieceContentStatusObj>
7070
): PreviewContent[] {
71-
if (sourceLayerType === SourceLayerType.VT) {
71+
if (sourceLayerType === SourceLayerType.VT || sourceLayerType === SourceLayerType.LIVE_SPEAK) {
7272
const content = piece.instance.piece.content as VTContent
7373

7474
return _.compact([

packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/StoryboardSecondaryPiece.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef, useState } from 'react'
1+
import React, { useContext, useRef, useState } from 'react'
22
import { RundownUtils } from '../../../lib/rundown'
33
import { ISourceLayer, SourceLayerType } from '@sofie-automation/blueprints-integration'
44
import { PieceUi } from '../../SegmentContainer/withResolvedSegment'
@@ -12,6 +12,13 @@ import { SplitsRenderer } from './Renderers/SplitsRenderer'
1212
import { PieceElement } from '../../SegmentContainer/PieceElement'
1313
import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios'
1414
import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids'
15+
import { useContentStatusForPieceInstance } from '../../SegmentTimeline/withMediaObjectStatus'
16+
import {
17+
convertPreviewToContents,
18+
convertSourceLayerItemToPreview,
19+
IPreviewPopUpSession,
20+
PreviewPopUpContext,
21+
} from '../../PreviewPopUp/PreviewPopUpContext'
1522

1623
interface IProps {
1724
layer: ISourceLayer
@@ -82,10 +89,17 @@ export function StoryboardSecondaryPiece(props: IProps): JSX.Element {
8289

8390
const typeClass = piece?.sourceLayer?.type ? RundownUtils.getSourceLayerClassName(piece?.sourceLayer?.type) : ''
8491

92+
const previewContext = useContext(PreviewPopUpContext)
93+
const previewSession = useRef<IPreviewPopUpSession | null>(null)
94+
const contentStatus = useContentStatusForPieceInstance(piece.instance)
95+
const previewContents = piece.instance.piece.content.popUpPreview
96+
? convertPreviewToContents(piece.instance.piece.content.popUpPreview, contentStatus)
97+
: convertSourceLayerItemToPreview(props.layer.type, piece, contentStatus)
98+
8599
const onPointerEnter = (e: React.PointerEvent<HTMLDivElement>) => {
86100
if (e.pointerType !== 'mouse') return
87101

88-
setHovering({ pageX: e.pageX, pageY: e.pageY })
102+
// setHovering({ pageX: e.pageX, pageY: e.pageY })
89103
if (!element.current) return
90104

91105
const offset = getElementDocumentOffset(element.current)
@@ -98,12 +112,22 @@ export function StoryboardSecondaryPiece(props: IProps): JSX.Element {
98112
width,
99113
})
100114

115+
if (previewContents.length > 0)
116+
previewSession.current = previewContext.requestPreview(e.target as any, previewContents, {
117+
startCoordinate: e.screenX,
118+
})
119+
101120
if (onPointerEnterCallback) onPointerEnterCallback(e)
102121
}
103122

104123
const onPointerLeave = (e: React.PointerEvent<HTMLDivElement>) => {
105124
setHovering(null)
106125

126+
if (previewSession.current) {
127+
previewSession.current.close()
128+
previewSession.current = null
129+
}
130+
107131
if (onPointerLeaveCallback) onPointerLeaveCallback(e)
108132
}
109133

packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartThumbnail/StoryboardPartThumbnailInner.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef, useState } from 'react'
1+
import React, { useContext, useRef, useState } from 'react'
22
import { ISourceLayer } from '@sofie-automation/blueprints-integration'
33
import { PieceExtended } from '../../../lib/RundownResolver'
44
import { getElementDocumentOffset, OffsetPosition } from '../../../utils/positions'
@@ -7,6 +7,13 @@ import { ThumbnailRenderer } from './Renderers/ThumbnailRendererFactory'
77
import { PieceElement } from '../../SegmentContainer/PieceElement'
88
import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios'
99
import { PartId, PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
10+
import { useContentStatusForPieceInstance } from '../../SegmentTimeline/withMediaObjectStatus'
11+
import {
12+
convertPreviewToContents,
13+
convertSourceLayerItemToPreview,
14+
IPreviewPopUpSession,
15+
PreviewPopUpContext,
16+
} from '../../PreviewPopUp/PreviewPopUpContext'
1017

1118
interface IProps {
1219
partId: PartId
@@ -40,11 +47,21 @@ export function StoryboardPartThumbnailInner({
4047
const [mousePosition, setMousePosition] = useState(0)
4148
const thumbnailEl = useRef<HTMLDivElement>(null)
4249

50+
const previewContext = useContext(PreviewPopUpContext)
51+
const previewSession = useRef<IPreviewPopUpSession | null>(null)
52+
53+
const contentStatus = useContentStatusForPieceInstance(piece.instance)
54+
const previewContents = piece.instance.piece.content.popUpPreview
55+
? convertPreviewToContents(piece.instance.piece.content.popUpPreview, contentStatus)
56+
: layer
57+
? convertSourceLayerItemToPreview(layer.type, piece, contentStatus)
58+
: []
59+
4360
const onPointerEnter = (e: React.PointerEvent<HTMLDivElement>) => {
4461
if (e.pointerType !== 'mouse') {
4562
return
4663
}
47-
setHover(true)
64+
// setHover(true)
4865

4966
const newOffset = thumbnailEl.current && getElementDocumentOffset(thumbnailEl.current)
5067
if (newOffset !== null) {
@@ -58,13 +75,24 @@ export function StoryboardPartThumbnailInner({
5875
if (newHeight !== null) {
5976
setHeight(newHeight)
6077
}
78+
79+
if (previewContents.length > 0)
80+
previewSession.current = previewContext.requestPreview(e.target as any, previewContents, {
81+
time: mousePosition * (piece.instance.piece.content.sourceDuration || 0),
82+
startCoordinate: e.screenX,
83+
})
6184
}
6285

6386
const onPointerLeave = (e: React.PointerEvent<HTMLDivElement>) => {
6487
if (e.pointerType !== 'mouse') {
6588
return
6689
}
6790
setHover(false)
91+
92+
if (previewSession.current) {
93+
previewSession.current.close()
94+
previewSession.current = null
95+
}
6896
}
6997

7098
const onPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {
@@ -73,6 +101,9 @@ export function StoryboardPartThumbnailInner({
73101
}
74102
const newMousePosition = Math.max(0, Math.min(1, (e.pageX - origin.left - 5) / (width - 10)))
75103
setMousePosition(newMousePosition)
104+
previewSession.current?.setPointerTime(
105+
mousePosition * (piece.instance.piece.content.sourceDuration ?? contentStatus?.contentDuration ?? 0)
106+
)
76107
}
77108

78109
return (

0 commit comments

Comments
 (0)