@@ -5,10 +5,18 @@ import type { ISourceLayerUi, IOutputLayerUi, PartUi } from '../SegmentTimelineC
55import { RundownUtils } from '../../../lib/rundown.js'
66import { faCut } from '@fortawesome/free-solid-svg-icons'
77import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
8- import { PieceLifespan , type VTContent } from '@sofie-automation/blueprints-integration'
8+ import { PieceLifespan , UserEditingType , type VTContent } from '@sofie-automation/blueprints-integration'
99import type { OffsetPosition } from '../../../utils/positions.js'
1010import { LoopingPieceIcon } from '../../../lib/ui/icons/looping.js'
1111import type { PieceUi } from '@sofie-automation/corelib/src/dataModel/Piece.js'
12+ import { BlueprintAssetIcon } from '../../../lib/Components/BlueprintAssetIcon.js'
13+ import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep.js'
14+ import {
15+ CoreUserEditingDefinitionAction ,
16+ CoreUserEditingDefinitionForm ,
17+ CoreUserEditingDefinitionSofie ,
18+ CoreUserEditingDefinitionState ,
19+ } from '@sofie-automation/corelib/dist/dataModel/UserEditingDefinitions'
1220
1321export type SourceDurationLabelAlignment = 'left' | 'right'
1422
@@ -118,6 +126,39 @@ export class CustomLayerItemRenderer<IProps extends ICustomLayerItemProps, IStat
118126 return < LoopingPieceIcon className = "segment-timeline__piece__label-icon" playing = { this . props . showPreviewPopUp } />
119127 }
120128
129+ protected renderCustomPieceIcons ( ) : JSX . Element | null {
130+ if (
131+ ! this . props . piece . instance . piece . userEditOperations ||
132+ this . props . piece . instance . piece . userEditOperations . length === 0
133+ )
134+ return null
135+
136+ function operationWithUsefulIcon (
137+ op :
138+ | ReadonlyObjectDeep < CoreUserEditingDefinitionState >
139+ | ReadonlyObjectDeep < CoreUserEditingDefinitionAction >
140+ | ReadonlyObjectDeep < CoreUserEditingDefinitionForm >
141+ | ReadonlyObjectDeep < CoreUserEditingDefinitionSofie >
142+ ) : op is ReadonlyObjectDeep < CoreUserEditingDefinitionState > | ReadonlyObjectDeep < CoreUserEditingDefinitionAction > {
143+ return (
144+ ( ( op . type === UserEditingType . ACTION || op . type === UserEditingType . STATE ) &&
145+ ( ( op . icon && op . isActive ) || ( op . iconInactive && ! op . isActive ) ) ) ||
146+ false
147+ )
148+ }
149+
150+ return (
151+ < >
152+ { this . props . piece . instance . piece . userEditOperations . filter ( operationWithUsefulIcon ) . map ( ( op ) => (
153+ < div className = "segment-timeline__piece__label label-icon label-custom-icon" key = { op . id } >
154+ { op . isActive && op . icon && < BlueprintAssetIcon src = { op . icon } /> }
155+ { ! op . isActive && op . iconInactive && < BlueprintAssetIcon src = { op . iconInactive } /> }
156+ </ div >
157+ ) ) }
158+ </ >
159+ )
160+ }
161+
121162 protected renderOverflowTimeLabel ( ) : JSX . Element | null {
122163 const overflowTime = this . doesOverflowTime ( )
123164 if (
0 commit comments