From 7f70cb15d035f0c233b9e62b9e43aa985317c908 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 04 十一月 2024 10:22:45 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/settings/MapSettings.jsx |  490 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 314 insertions(+), 176 deletions(-)

diff --git a/zy-acs-flow/src/map/settings/MapSettings.jsx b/zy-acs-flow/src/map/settings/MapSettings.jsx
index c0c4a4b..6bc16c2 100644
--- a/zy-acs-flow/src/map/settings/MapSettings.jsx
+++ b/zy-acs-flow/src/map/settings/MapSettings.jsx
@@ -1,4 +1,4 @@
-import React, { useEffect } from 'react';
+import React, { useEffect, useState } from 'react';
 import { useForm, Controller } from 'react-hook-form';
 import {
     Box,
@@ -11,47 +11,47 @@
     MenuItem,
     InputLabel,
     FormControl,
-    FormHelperText,
-    Checkbox,
-    FormControlLabel,
     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';
+import CopyDrawer from './CopyDrawer';
 
 const MapSettings = (props) => {
-    const { sprite, onSubmit } = props;
+    const { sprite, setSpriteSettings, onSubmit, width, lastCopiedSprites, setLastCopiedSprites } = props;
     const translate = useTranslate();
+    const [copyVisible, setCopyVisible] = useState(false);
 
-    const { control, handleSubmit, reset, watch, setValue } = useForm({
+    const { control, handleSubmit, reset, watch } = useForm({
         defaultValues: {
-            x: sprite?.position.x || 0,
-            y: sprite?.position.y || 0,
-            scaleX: sprite?.scale.x || 1,
-            scaleY: sprite?.scale.y || 1,
+            x: sprite?.position?.x || 0,
+            y: sprite?.position?.y || 0,
+            scaleX: sprite?.scale?.x || 1,
+            scaleY: sprite?.scale?.y || 1,
             rotation: (sprite?.rotation * 180) / Math.PI || 0,
             copyDirection: 'right',
             copyCount: 1,
-            // 鍏朵粬榛樿鍊�...
         },
     });
 
-    // 鐩戝惉琛ㄥ崟鍊肩殑鍙樺寲
     const watchAllFields = watch();
 
     useEffect(() => {
         if (sprite) {
+            setCopyVisible(false);
             reset({
-                x: sprite.position.x,
-                y: sprite.position.y,
-                scaleX: sprite.scale.x,
-                scaleY: sprite.scale.y,
-                rotation: (sprite.rotation * 180) / Math.PI,
-                // 璁剧疆鍏朵粬瀛楁鐨勫垵濮嬪��
+                x: sprite?.position.x,
+                y: sprite?.position.y,
+                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;
@@ -59,11 +59,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) {
@@ -72,166 +70,306 @@
     };
 
     return (
-        <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 2 }}>
-            <Grid container spacing={2}>
-                {/* 浣嶇疆 */}
-                <Grid item xs={12}>
-                    <Typography variant="h6">{translate('map.settings.position')}</Typography>
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="x"
-                        control={control}
-                        render={({ field }) => (
-                            <TextField
-                                {...field}
-                                label="X"
-                                type="number"
-                                fullWidth
-                                onChange={(e) => {
-                                    field.onChange(e);
-                                    updateSprite({ ...watchAllFields, x: parseFloat(e.target.value) });
-                                }}
-                            />
-                        )}
-                    />
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="y"
-                        control={control}
-                        render={({ field }) => (
-                            <TextField
-                                {...field}
-                                label="Y"
-                                type="number"
-                                fullWidth
-                                onChange={(e) => {
-                                    field.onChange(e);
-                                    updateSprite({ ...watchAllFields, y: parseFloat(e.target.value) });
-                                }}
-                            />
-                        )}
-                    />
-                </Grid>
+        <>
+            <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}>
+                <Grid container spacing={1.4}>
+                    {/* position */}
+                    <Grid item xs={12}>
+                        <Typography variant="inherit">
+                            {translate('page.map.settings.map.base.position')}
+                        </Typography>
+                    </Grid>
+                    <Grid item xs={6} pt={0} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="x"
+                            control={control}
+                            render={({ field }) => (
+                                <TextField
+                                    {...field}
+                                    label="X"
+                                    type="number"
+                                    fullWidth
+                                    onChange={(e) => {
+                                        const value = parseFloat(e.target.value);
+                                        field.onChange(e);
+                                        if (!isNaN(value)) {
+                                            updateSprite({ ...watchAllFields, x: value });
+                                        }
+                                    }}
+                                />
+                            )}
+                        />
+                    </Grid>
+                    <Grid item xs={6} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="y"
+                            control={control}
+                            render={({ field }) => (
+                                <TextField
+                                    {...field}
+                                    label="Y"
+                                    type="number"
+                                    fullWidth
+                                    onChange={(e) => {
+                                        const value = parseFloat(e.target.value);
+                                        field.onChange(e);
+                                        if (!isNaN(value)) {
+                                            updateSprite({ ...watchAllFields, y: value });
+                                        }
+                                    }}
+                                />
+                            )}
+                        />
+                    </Grid>
 
-                {/* 缂╂斁 */}
-                <Grid item xs={12}>
-                    <Typography variant="h6">{translate('map.settings.scale')}</Typography>
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="scaleX"
-                        control={control}
-                        render={({ field }) => (
-                            <TextField
-                                {...field}
-                                label="Scale X"
-                                type="number"
-                                fullWidth
-                                inputProps={{ step: 0.1, min: 0.1, max: 10 }}
-                                onChange={(e) => {
-                                    field.onChange(e);
-                                    updateSprite({ ...watchAllFields, scaleX: parseFloat(e.target.value) });
-                                }}
-                            />
-                        )}
-                    />
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="scaleY"
-                        control={control}
-                        render={({ field }) => (
-                            <TextField
-                                {...field}
-                                label="Scale Y"
-                                type="number"
-                                fullWidth
-                                inputProps={{ step: 0.1, min: 0.1, max: 10 }}
-                                onChange={(e) => {
-                                    field.onChange(e);
-                                    updateSprite({ ...watchAllFields, scaleY: parseFloat(e.target.value) });
-                                }}
-                            />
-                        )}
-                    />
-                </Grid>
+                    {/* scale */}
+                    <Grid item xs={12}>
+                        <Typography variant="inherit">
+                            {translate('page.map.settings.map.base.scale')}
+                        </Typography>
+                    </Grid>
+                    <Grid item xs={6} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="scaleX"
+                            control={control}
+                            render={({ field }) => (
+                                <TextField
+                                    {...field}
+                                    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);
+                                        if (!isNaN(value)) {
+                                            updateSprite({ ...watchAllFields, scaleX: value });
+                                        }
+                                    }}
+                                />
+                            )}
+                        />
+                    </Grid>
+                    <Grid item xs={6} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="scaleY"
+                            control={control}
+                            render={({ field }) => (
+                                <TextField
+                                    {...field}
+                                    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);
+                                        if (!isNaN(value)) {
+                                            updateSprite({ ...watchAllFields, scaleY: value });
+                                        }
+                                    }}
+                                />
+                            )}
+                        />
+                    </Grid>
 
-                {/* 鏃嬭浆 */}
-                <Grid item xs={12}>
-                    <Typography variant="h6">{translate('map.settings.rotation')}</Typography>
-                </Grid>
-                <Grid item xs={12}>
-                    <Controller
-                        name="rotation"
-                        control={control}
-                        render={({ field }) => (
-                            <Slider
-                                {...field}
-                                min={0}
-                                max={360}
-                                step={1}
-                                valueLabelDisplay="auto"
-                                onChange={(e, value) => {
-                                    field.onChange(value);
-                                    updateSprite({ ...watchAllFields, rotation: value });
-                                }}
-                            />
-                        )}
-                    />
-                </Grid>
+                    {/* rotation */}
+                    <Grid item xs={12}>
+                        <Typography variant="inherit">
+                            {translate('page.map.settings.map.base.rotation')}
+                        </Typography>
+                    </Grid>
+                    <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 });
+                                            }}
+                                        />
+                                    )}
+                                />
+                            </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="h6">{translate('map.settings.copy')}</Typography>
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="copyDirection"
-                        control={control}
-                        render={({ field }) => (
-                            <FormControl fullWidth>
-                                <InputLabel>{translate('map.settings.copyDirection')}</InputLabel>
-                                <Select {...field} label={translate('map.settings.copyDirection')}>
-                                    <MenuItem value="left">{translate('map.settings.left')}</MenuItem>
-                                    <MenuItem value="right">{translate('map.settings.right')}</MenuItem>
-                                    <MenuItem value="up">{translate('map.settings.up')}</MenuItem>
-                                    <MenuItem value="down">{translate('map.settings.down')}</MenuItem>
-                                </Select>
-                            </FormControl>
-                        )}
-                    />
-                </Grid>
-                <Grid item xs={6}>
-                    <Controller
-                        name="copyCount"
-                        control={control}
-                        render={({ field }) => (
-                            <TextField
-                                {...field}
-                                label={translate('map.settings.copyCount')}
-                                type="number"
-                                fullWidth
-                                inputProps={{ min: 1 }}
-                            />
-                        )}
-                    />
-                </Grid>
+                    <Grid item xs={12}>
+                        <Divider />
+                    </Grid>
 
-                {/* 鎻愪氦鎸夐挳 */}
-                <Grid item xs={12}>
-                    <Stack direction="row" spacing={2}>
-                        <Button type="submit" variant="contained" color="primary">
-                            {translate('common.submit')}
-                        </Button>
-                        <Button variant="outlined" color="secondary" onClick={() => reset()}>
-                            {translate('common.reset')}
-                        </Button>
-                    </Stack>
+                    {/* copy */}
+                    <Grid item xs={12}>
+                        <Typography variant="inherit">
+                            {translate('page.map.settings.map.copy.title')}
+                        </Typography>
+                    </Grid>
+                    <Grid item xs={6} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="copyDirection"
+                            control={control}
+                            render={({ field }) => (
+                                <FormControl fullWidth>
+                                    <InputLabel>
+                                        {translate('page.map.settings.map.copy.direction')}
+                                    </InputLabel>
+                                    <Select
+                                        {...field}
+                                        label={translate('page.map.settings.map.copy.direction')}
+                                    >
+                                        <MenuItem value="left">
+                                            {translate('page.map.settings.map.copy.left')}
+                                        </MenuItem>
+                                        <MenuItem value="right">
+                                            {translate('page.map.settings.map.copy.right')}
+                                        </MenuItem>
+                                        <MenuItem value="up">
+                                            {translate('page.map.settings.map.copy.up')}
+                                        </MenuItem>
+                                        <MenuItem value="down">
+                                            {translate('page.map.settings.map.copy.down')}
+                                        </MenuItem>
+                                    </Select>
+                                </FormControl>
+                            )}
+                        />
+                    </Grid>
+                    <Grid item xs={6} sx={{
+                        paddingTop: '8px !important',
+                    }}>
+                        <Controller
+                            name="copyCount"
+                            control={control}
+                            render={({ field }) => (
+                                <TextField
+                                    {...field}
+                                    label={translate('page.map.settings.map.copy.count')}
+                                    type="number"
+                                    fullWidth
+                                    inputProps={{ min: 1 }}
+                                />
+                            )}
+                        />
+                    </Grid>
+                    <Grid item xs={12}>
+                        <Stack direction="row" spacing={2}>
+                            <Button variant="contained" color="primary" onClick={() => {
+                                setCopyVisible(true);
+                            }}>
+                                {translate('page.map.settings.map.copy.execute')}
+                            </Button>
+                            <Button variant="text" color="primary" onClick={() => {
+                                if (lastCopiedSprites && lastCopiedSprites.length > 0) {
+                                    lastCopiedSprites.forEach(copiedSprite => {
+                                        Tool.getMapContainer().removeChild(copiedSprite);
+                                    })
+                                    setLastCopiedSprites([]);
+                                }
+                            }}>
+                                {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>
-            </Grid>
-        </Box>
+            </Box >
+
+            <CopyDrawer
+                open={copyVisible}
+                onCancel={() => {
+                    setCopyVisible(false);
+                }}
+                width={width}
+                sprite={sprite}
+                value={{
+                    copyDirect: watch('copyDirection'),
+                    copyCount: watch('copyCount'),
+                }}
+                handleOnCopy={() => {
+
+                }}
+                setLastCopiedSprites={setLastCopiedSprites}
+                setSpriteSettings={setSpriteSettings}
+            />
+        </>
     );
 };
 

--
Gitblit v1.9.1