1- import { TextField } from '@mui/material'
1+ import { MenuItem , TextField } from '@mui/material'
22import React , { useCallback , useContext , useEffect , useState } from 'react'
33import { TextBtn } from '../../../../components/inputs/textBtn/TextBtn.js'
44import { AtemOptions , CasparCGOptions , DeviceType , OBSOptions , OSCDeviceType } from 'timeline-state-resolver-types'
@@ -13,6 +13,17 @@ import { TSRDeviceId, unprotectString } from '@shared/models'
1313
1414const MIN_PORT = 1
1515const MAX_PORT = 65535
16+ const FPS_OPTIONS = [
17+ { label : 'Auto (default)' , value : '' } ,
18+ { label : '23.98 (24000/1001)' , value : 24000 / 1001 } ,
19+ { label : '24' , value : 24 } ,
20+ { label : '25' , value : 25 } ,
21+ { label : '29.97 (30000/1001)' , value : 30000 / 1001 } ,
22+ { label : '30' , value : 30 } ,
23+ { label : '50' , value : 50 } ,
24+ { label : '59.94 (60000/1001)' , value : 60000 / 1001 } ,
25+ { label : '60' , value : 60 } ,
26+ ]
1627
1728export const DeviceItemContent : React . FC < {
1829 bridge : Bridge
@@ -215,24 +226,26 @@ export const DeviceItemContent: React.FC<{
215226 < TextField
216227 label = "FPS"
217228 value = { fps }
229+ select
218230 size = "small"
219231 margin = "dense"
220- type = "number"
221- InputProps = { { inputProps : { min : 1 , max : 120 , step : 0.01 } } }
222232 onChange = { ( event ) => {
223- const parsed = event . target . value === '' ? '' : parseFloat ( event . target . value )
224- setFps ( Number . isNaN ( parsed ) ? '' : parsed )
233+ const raw = event . target . value
234+ const parsed = raw === '' ? '' : parseFloat ( String ( raw ) )
235+ const next = Number . isNaN ( parsed ) ? '' : parsed
236+ setFps ( next )
237+ handleFpsChange ( next )
225238 } }
226- onBlur = { ( ) => {
227- handleFpsChange ( fps )
228- } }
229- onKeyUp = { ( e ) => {
230- if ( e . key === 'Enter' ) {
231- handleFpsChange ( fps )
232- ; ( document . activeElement as HTMLInputElement ) . blur ( )
233- }
234- } }
235- / >
239+ >
240+ { FPS_OPTIONS . map ( ( option ) => (
241+ < MenuItem key = { option . label } value = { option . value } >
242+ { option . label }
243+ </ MenuItem >
244+ ) ) }
245+ { fps !== '' && ! FPS_OPTIONS . some ( ( option ) => option . value === fps ) && (
246+ < MenuItem value = { fps } > Custom ( { fps } ) </ MenuItem >
247+ ) }
248+ </ TextField >
236249 </ div >
237250 ) }
238251 </ >
0 commit comments