|  |  | 
 |  |  |     Divider, | 
 |  |  | } from '@mui/material'; | 
 |  |  | import MuiInput from '@mui/material/Input'; | 
 |  |  | import { styled } from '@mui/material/styles'; | 
 |  |  | import { useTranslate } from 'react-admin'; | 
 |  |  |  | 
 |  |  | const Input = styled(MuiInput)` | 
 |  |  |   width: 42px; | 
 |  |  | `; | 
 |  |  | import * as Tool from '../tool'; | 
 |  |  | import ConfirmButton from '../../page/components/ConfirmButton'; | 
 |  |  |  | 
 |  |  | const MapSettings = (props) => { | 
 |  |  |     const { sprite, onSubmit } = props; | 
 |  |  |     const { sprite, setSpriteSettings, onSubmit } = props; | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |  | 
 |  |  |     const { control, handleSubmit, reset, watch } = useForm({ | 
 |  |  | 
 |  |  |             rotation: (sprite?.rotation * 180) / Math.PI || 0, | 
 |  |  |             copyDirection: 'right', | 
 |  |  |             copyCount: 1, | 
 |  |  |             // 其他默认值... | 
 |  |  |         }, | 
 |  |  |     }); | 
 |  |  |  | 
 |  |  |     // 监听所有字段的变化 | 
 |  |  |     const watchAllFields = watch(); | 
 |  |  |  | 
 |  |  |     useEffect(() => { | 
 |  |  | 
 |  |  |                 scaleX: sprite.scale.x, | 
 |  |  |                 scaleY: sprite.scale.y, | 
 |  |  |                 rotation: (sprite.rotation * 180) / Math.PI, | 
 |  |  |                 // 设置其他字段的初始值 | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |     }, [sprite, reset]); | 
 |  |  |  | 
 |  |  |     // 更新精灵属性的函数 | 
 |  |  |     const updateSprite = (data) => { | 
 |  |  |         if (sprite) { | 
 |  |  |             sprite.position.x = data.x; | 
 |  |  | 
 |  |  |             sprite.scale.x = data.scaleX; | 
 |  |  |             sprite.scale.y = data.scaleY; | 
 |  |  |             sprite.rotation = (data.rotation * Math.PI) / 180; | 
 |  |  |             // 更新其他属性... | 
 |  |  |         } | 
 |  |  |     }; | 
 |  |  |  | 
 |  |  |     // 处理表单提交 | 
 |  |  |     const onFormSubmit = (data) => { | 
 |  |  |         updateSprite(data); | 
 |  |  |         if (onSubmit) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |     }; | 
 |  |  |  | 
 |  |  |     // 旋转滑块的刻度 | 
 |  |  |     const rotationMarks = [ | 
 |  |  |         { value: 0, label: '0°' }, | 
 |  |  |         { value: 90, label: '90°' }, | 
 |  |  |         { value: 180, label: '180°' }, | 
 |  |  |         { value: 270, label: '270°' }, | 
 |  |  |         { value: 360, label: '360°' }, | 
 |  |  |     ]; | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}> | 
 |  |  |             <Grid container spacing={2}> | 
 |  |  |                 {/* 位置 */} | 
 |  |  |             <Grid container spacing={1.4}> | 
 |  |  |                 {/* position */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Typography variant="inherit"> | 
 |  |  |                         {translate('page.map.settings.map.base.position')} | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} pt={0} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="x" | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="y" | 
 |  |  | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 {/* 缩放 */} | 
 |  |  |                 {/* scale */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Typography variant="inherit"> | 
 |  |  |                         {translate('page.map.settings.map.base.scale')} | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="scaleX" | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="scaleY" | 
 |  |  | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 {/* 旋转 */} | 
 |  |  |                 {/* rotation */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Typography variant="inherit"> | 
 |  |  |                         {translate('page.map.settings.map.base.rotation')} | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Box display="flex" alignItems="center"> | 
 |  |  |                         <Box flex={1} mr={2}> | 
 |  |  |                         <Box flex={1} mr={3}> | 
 |  |  |                             <Controller | 
 |  |  |                                 name="rotation" | 
 |  |  |                                 control={control} | 
 |  |  |                                 render={({ field }) => ( | 
 |  |  |                                     <Slider | 
 |  |  |                                         {...field} | 
 |  |  |                                         size="small" | 
 |  |  |                                         // size="small" | 
 |  |  |                                         min={0} | 
 |  |  |                                         max={360} | 
 |  |  |                                         step={1} | 
 |  |  | 
 |  |  |                                 )} | 
 |  |  |                             /> | 
 |  |  |                         </Box> | 
 |  |  |                         <Box width={80}> | 
 |  |  |                         <Box > | 
 |  |  |                             <Controller | 
 |  |  |                                 name="rotation" | 
 |  |  |                                 control={control} | 
 |  |  |                                 render={({ field }) => ( | 
 |  |  |                                     <TextField | 
 |  |  |                                     <MuiInput | 
 |  |  |                                         {...field} | 
 |  |  |                                         label="" | 
 |  |  |                                         type="number" | 
 |  |  |                                         fullWidth | 
 |  |  |                                         inputProps={{ min: 0, max: 360 }} | 
 |  |  |                                         size="small" | 
 |  |  |                                         value={field.value} | 
 |  |  |                                         onChange={(e) => { | 
 |  |  |                                             const value = parseFloat(e.target.value); | 
 |  |  |                                             const value = e.target.value === '' ? 0 : Number(e.target.value); | 
 |  |  |                                             if (!isNaN(value)) { | 
 |  |  |                                                 field.onChange(value); | 
 |  |  |                                                 updateSprite({ ...watchAllFields, rotation: value }); | 
 |  |  |                                             } | 
 |  |  |                                         }} | 
 |  |  |                                         onBlur={() => { | 
 |  |  |                                             if (field.value < 0) { | 
 |  |  |                                                 field.onChange(0); | 
 |  |  |                                             } else if (field.value > 360) { | 
 |  |  |                                                 field.onChange(360); | 
 |  |  |                                             } | 
 |  |  |                                         }} | 
 |  |  |                                         inputProps={{ | 
 |  |  |                                             step: 1, | 
 |  |  |                                             min: 0, | 
 |  |  |                                             max: 360, | 
 |  |  |                                             type: 'number', | 
 |  |  |                                             'aria-labelledby': 'input-slider', | 
 |  |  |                                         }} | 
 |  |  |                                     /> | 
 |  |  |                                 )} | 
 |  |  | 
 |  |  |                         </Box> | 
 |  |  |                     </Box> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Divider /> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 {/* 复制 */} | 
 |  |  |                 {/* copy */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Typography variant="inherit"> | 
 |  |  |                         {translate('page.map.settings.map.copy.title')} | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="copyDirection" | 
 |  |  | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={6} sx={{ | 
 |  |  |                     paddingTop: '8px !important', | 
 |  |  |                     paddingLeft: '8px !important', | 
 |  |  |                 }}> | 
 |  |  |                     <Controller | 
 |  |  |                         name="copyCount" | 
 |  |  | 
 |  |  |                         )} | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 {/* 提交按钮 */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Stack direction="row" spacing={2}> | 
 |  |  |                         <Button type="submit" variant="contained" color="primary"> | 
 |  |  |                             {translate('ra.action.confirm')} | 
 |  |  |                         <Button variant="contained" color="primary"> | 
 |  |  |                             {translate('page.map.settings.map.copy.execute')} | 
 |  |  |                         </Button> | 
 |  |  |                         <Button variant="outlined" color="secondary" onClick={() => reset()}> | 
 |  |  |                             {translate('common.action.reset')} | 
 |  |  |                         <Button variant="text" color="primary"> | 
 |  |  |                             {translate('page.map.settings.map.copy.reverse')} | 
 |  |  |                         </Button> | 
 |  |  |                     </Stack> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Divider /> | 
 |  |  |                 </Grid> | 
 |  |  |  | 
 |  |  |                 {/* more */} | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Typography variant="inherit"> | 
 |  |  |                         {translate('page.map.settings.map.more.title')} | 
 |  |  |                     </Typography> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={12}> | 
 |  |  |                     <Stack direction="row" spacing={2}> | 
 |  |  |                         <Button variant="outlined" color="error" onClick={() => { | 
 |  |  |                             Tool.getMapContainer().removeChild(sprite); | 
 |  |  |                             setSpriteSettings(null); | 
 |  |  |                             Tool.removeSelectedEffect(); | 
 |  |  |                             reset(); | 
 |  |  |                         }}> | 
 |  |  |                             {translate('ra.action.delete')} | 
 |  |  |                         </Button> | 
 |  |  |                         {/* <ConfirmButton /> */} | 
 |  |  |                     </Stack> | 
 |  |  |                 </Grid> | 
 |  |  |             </Grid> | 
 |  |  |         </Box> | 
 |  |  |     ); |