#
luxiaotao1123
2024-10-11 54d940c0bfabe90700d0bcc9e72dc93bc8bafaad
zy-acs-flow/src/map/settings/MapSettings.jsx
@@ -12,14 +12,18 @@
    InputLabel,
    FormControl,
    Stack,
    Divider,
} from '@mui/material';
import MuiInput from '@mui/material/Input';
import { useTranslate } from 'react-admin';
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, setValue } = useForm({
    const { control, handleSubmit, reset, watch } = useForm({
        defaultValues: {
            x: sprite?.position.x || 0,
            y: sprite?.position.y || 0,
@@ -28,11 +32,9 @@
            rotation: (sprite?.rotation * 180) / Math.PI || 0,
            copyDirection: 'right',
            copyCount: 1,
            // 其他默认值...
        },
    });
    // 监听所有字段的变化
    const watchAllFields = watch();
    useEffect(() => {
@@ -43,12 +45,10 @@
                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;
@@ -56,11 +56,9 @@
            sprite.scale.x = data.scaleX;
            sprite.scale.y = data.scaleY;
            sprite.rotation = (data.rotation * Math.PI) / 180;
            // 更新其他属性...
        }
    };
    // 处理表单提交
    const onFormSubmit = (data) => {
        updateSprite(data);
        if (onSubmit) {
@@ -68,25 +66,18 @@
        }
    };
    // 旋转滑块的刻度
    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={1}>
                {/* 位置 */}
            <Grid container spacing={1.4}>
                {/* position */}
                <Grid item xs={12}>
                    <Typography variant="button">
                    <Typography variant="inherit">
                        {translate('page.map.settings.map.base.position')}
                    </Typography>
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} pt={0} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="x"
                        control={control}
@@ -97,14 +88,19 @@
                                type="number"
                                fullWidth
                                onChange={(e) => {
                                    const value = parseFloat(e.target.value);
                                    field.onChange(e);
                                    updateSprite({ ...watchAllFields, x: parseFloat(e.target.value) });
                                    if (!isNaN(value)) {
                                        updateSprite({ ...watchAllFields, x: value });
                                    }
                                }}
                            />
                        )}
                    />
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="y"
                        control={control}
@@ -115,113 +111,151 @@
                                type="number"
                                fullWidth
                                onChange={(e) => {
                                    const value = parseFloat(e.target.value);
                                    field.onChange(e);
                                    updateSprite({ ...watchAllFields, y: parseFloat(e.target.value) });
                                    if (!isNaN(value)) {
                                        updateSprite({ ...watchAllFields, y: value });
                                    }
                                }}
                            />
                        )}
                    />
                </Grid>
                {/* 缩放 */}
                {/* scale */}
                <Grid item xs={12}>
                    <Typography variant="button">
                    <Typography variant="inherit">
                        {translate('page.map.settings.map.base.scale')}
                    </Typography>
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="scaleX"
                        control={control}
                        render={({ field }) => (
                            <TextField
                                {...field}
                                label="Scale X"
                                label="X"
                                type="number"
                                fullWidth
                                inputProps={{ step: 0.1, min: 0.1, max: 10 }}
                                onChange={(e) => {
                                    const value = parseFloat(e.target.value);
                                    field.onChange(e);
                                    updateSprite({ ...watchAllFields, scaleX: parseFloat(e.target.value) });
                                    if (!isNaN(value)) {
                                        updateSprite({ ...watchAllFields, scaleX: value });
                                    }
                                }}
                            />
                        )}
                    />
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="scaleY"
                        control={control}
                        render={({ field }) => (
                            <TextField
                                {...field}
                                label="Scale Y"
                                label="Y"
                                type="number"
                                fullWidth
                                inputProps={{ step: 0.1, min: 0.1, max: 10 }}
                                onChange={(e) => {
                                    const value = parseFloat(e.target.value);
                                    field.onChange(e);
                                    updateSprite({ ...watchAllFields, scaleY: parseFloat(e.target.value) });
                                    if (!isNaN(value)) {
                                        updateSprite({ ...watchAllFields, scaleY: value });
                                    }
                                }}
                            />
                        )}
                    />
                </Grid>
                {/* 旋转 */}
                {/* rotation */}
                <Grid item xs={12}>
                    <Typography variant="button">
                    <Typography variant="inherit">
                        {translate('page.map.settings.map.base.rotation')}
                    </Typography>
                </Grid>
                <Grid item xs={8}>
                    <Controller
                        name="rotation"
                        control={control}
                        render={({ field }) => (
                            <Slider
                                {...field}
                                min={0}
                                max={360}
                                step={1}
                                marks={rotationMarks}
                                valueLabelDisplay="auto"
                                valueLabelFormat={(value) => `${value}°`}
                                onChange={(e, value) => {
                                    field.onChange(value);
                                    updateSprite({ ...watchAllFields, rotation: value });
                                }}
                <Grid item xs={12}>
                    <Box display="flex" alignItems="center">
                        <Box flex={1} mr={3}>
                            <Controller
                                name="rotation"
                                control={control}
                                render={({ field }) => (
                                    <Slider
                                        {...field}
                                        // size="small"
                                        min={0}
                                        max={360}
                                        step={1}
                                        valueLabelDisplay="auto"
                                        valueLabelFormat={(value) => `${value}°`}
                                        onChange={(e, value) => {
                                            field.onChange(value);
                                            updateSprite({ ...watchAllFields, rotation: value });
                                        }}
                                    />
                                )}
                            />
                        )}
                    />
                </Grid>
                <Grid item xs={4}>
                    <Controller
                        name="rotation"
                        control={control}
                        render={({ field }) => (
                            <TextField
                                {...field}
                                label={`${translate('page.map.settings.map.base.rotation')} (°)`}
                                type="number"
                                fullWidth
                                inputProps={{ min: 0, max: 360 }}
                                onChange={(e) => {
                                    field.onChange(e);
                                    updateSprite({ ...watchAllFields, rotation: parseFloat(e.target.value) });
                                }}
                        </Box>
                        <Box >
                            <Controller
                                name="rotation"
                                control={control}
                                render={({ field }) => (
                                    <MuiInput
                                        {...field}
                                        size="small"
                                        value={field.value}
                                        onChange={(e) => {
                                            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}>
                    <Typography variant="button">
                    <Divider />
                </Grid>
                {/* copy */}
                <Grid item xs={12}>
                    <Typography variant="inherit">
                        {translate('page.map.settings.map.copy.title')}
                    </Typography>
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="copyDirection"
                        control={control}
@@ -251,7 +285,9 @@
                        )}
                    />
                </Grid>
                <Grid item xs={6}>
                <Grid item xs={6} sx={{
                    paddingTop: '8px !important',
                }}>
                    <Controller
                        name="copyCount"
                        control={control}
@@ -266,18 +302,40 @@
                        )}
                    />
                </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>
    );