import React, { useState, useRef, useEffect } from 'react';
|
import { Col, Form, Input, Row, message, Slider, Select, Drawer, Space, Button, InputNumber, Card } from 'antd';
|
import { FormattedMessage, useIntl, useModel } from '@umijs/max';
|
import { createStyles } from 'antd-style';
|
import * as Utils from '../utils'
|
import * as PIXI from 'pixi.js';
|
import MapCopySettings from './mapCopySettings';
|
|
const useStyles = createStyles(({ token, css }) => {
|
|
})
|
|
const MapSettings = (props) => {
|
const intl = useIntl();
|
const { styles } = useStyles();
|
const { curSprite, mapForm: form } = props;
|
|
const [childrenDrawer, setChildrenDrawer] = useState(false);
|
const [lastCopiedSprites, setLastCopiedSprites] = useState([]);
|
|
useEffect(() => {
|
|
}, []);
|
|
useEffect(() => {
|
form.resetFields();
|
if (curSprite) {
|
form.setFieldsValue({
|
x: curSprite.position.x,
|
y: curSprite.position.y,
|
scale: Math.max(curSprite.scale.x, curSprite.scale.y),
|
scaleSlider: Math.max(curSprite.scale.x, curSprite.scale.y),
|
rotation: curSprite.rotation * 180 / Math.PI,
|
rotationSlider: curSprite.rotation * 180 / Math.PI,
|
|
copyDire: 'right',
|
copyCount: 1,
|
})
|
}
|
}, [form, props])
|
|
const handleFinish = async (values) => {
|
props.onSubmit({ ...values });
|
}
|
|
const formValuesChange = (changeList) => {
|
if (curSprite && changeList && changeList.length > 0) {
|
changeList.forEach(change => {
|
const { name: nameList, value } = change;
|
nameList.forEach(name => {
|
switch (name) {
|
case 'x':
|
curSprite.position.x = value;
|
break;
|
case 'y':
|
curSprite.position.y = value;
|
break;
|
case 'scaleSlider':
|
form.setFieldsValue({
|
scale: value
|
})
|
curSprite.scale.set(value);
|
break;
|
case 'scale':
|
form.setFieldsValue({
|
scaleSlider: value
|
})
|
curSprite.scale.set(value);
|
break;
|
case 'rotationSlider':
|
form.setFieldsValue({
|
rotation: value
|
})
|
curSprite.rotation = value * Math.PI / 180;
|
break;
|
case 'rotation':
|
form.setFieldsValue({
|
rotationSlider: value
|
})
|
curSprite.rotation = value * Math.PI / 180;
|
break;
|
default:
|
break;
|
}
|
Utils.removeSelectedEffect();
|
Utils.showSelectedEffect(curSprite);
|
})
|
})
|
}
|
}
|
|
const onFinishFailed = (errorInfo) => {
|
};
|
|
const handleOnCopy = (values) => {
|
if (!curSprite) {
|
return;
|
}
|
setLastCopiedSprites([]);
|
for (let i = 0; i < values.copyCount; i++) {
|
const copiedSprite = Utils.copySprite(curSprite);
|
// auto-increment-value
|
if (values.autoIncrement && values.type) {
|
switch (values.type) {
|
case Utils.SENSOR_TYPE.SHELF:
|
if (values.incrementValue === 'row') {
|
if (values.incrementMode === 'descending') {
|
copiedSprite.data.row = curSprite.data.row - i - 1;
|
} else {
|
copiedSprite.data.row = curSprite.data.row + i + 1;
|
}
|
}
|
if (values.incrementValue === 'bay') {
|
if (values.incrementMode === 'descending') {
|
copiedSprite.data.bay = curSprite.data.bay - i - 1;
|
} else {
|
copiedSprite.data.bay = curSprite.data.bay + i + 1;
|
}
|
}
|
if (copiedSprite.data.row && copiedSprite.data.bay) {
|
copiedSprite.data.no = Utils.pureNumStr(copiedSprite.data.row) + '-' + Utils.pureNumStr(copiedSprite.data.bay);
|
}
|
break;
|
case Utils.SENSOR_TYPE.AGV:
|
if (values.incrementValue === 'no') {
|
if (values.incrementMode === 'descending') {
|
copiedSprite.data.no = Number(curSprite.data.no) - i - 1;
|
} else {
|
copiedSprite.data.no = Number(curSprite.data.no) + i + 1;
|
}
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
// graph copy
|
switch (values.copyDire) {
|
case 'left':
|
copiedSprite.position.x -= (i + 1) * (values.copyGap + copiedSprite.width);
|
break;
|
case 'right':
|
copiedSprite.position.x += (i + 1) * (values.copyGap + copiedSprite.width);
|
break;
|
case 'top':
|
copiedSprite.position.y -= (i + 1) * (values.copyGap + copiedSprite.height);
|
break;
|
case 'bottom':
|
copiedSprite.position.y += (i + 1) * (values.copyGap + copiedSprite.height);
|
break;
|
default:
|
break;
|
}
|
Utils.getMapContainer().addChild(copiedSprite);
|
Utils.beSettings(copiedSprite, props.setSpriteBySettings, props.setDidClickSprite);
|
|
setLastCopiedSprites(prevArr => [...prevArr, copiedSprite]);
|
}
|
setChildrenDrawer(false);
|
}
|
|
return (
|
<>
|
<Form
|
form={form}
|
onFieldsChange={formValuesChange}
|
onFinish={handleFinish}
|
onFinishFailed={onFinishFailed}
|
autoComplete="off"
|
style={{
|
maxWidth: 600,
|
}}
|
size='default' // small | default | large
|
variant='filled' // outlined | borderless | filled
|
labelWrap // label 换行
|
disabled={false}
|
layout='horizontal'
|
labelCol={{
|
span: 4,
|
}}
|
wrapperCol={{
|
span: 20,
|
}}
|
initialValues={{
|
scale: 1,
|
rotation: 1
|
}}
|
>
|
<Row gutter={[24, 16]}>
|
<Col span={24} />
|
|
<Col span={24}>
|
<Form.Item
|
label={intl.formatMessage({ id: 'map.settings.component', defaultMessage: '组件' })}
|
>
|
<span>{curSprite?.data?.type}-{curSprite?.data?.uuid}</span>
|
</Form.Item>
|
</Col>
|
|
{/* position */}
|
<Col span={24}>
|
<Form.Item
|
label={intl.formatMessage({ id: 'map.settings.position', defaultMessage: '坐标' })}
|
>
|
<Space.Compact>
|
<Form.Item
|
name='x'
|
noStyle
|
rules={[
|
{
|
required: true,
|
},
|
]}
|
>
|
<InputNumber
|
addonBefore={<Space.Compact>x</Space.Compact>}
|
style={{
|
width: '50%',
|
}}
|
/>
|
</Form.Item>
|
<Form.Item
|
name='y'
|
noStyle
|
rules={[
|
{
|
required: true,
|
},
|
]}
|
>
|
<InputNumber
|
addonBefore={<Space.Compact>y</Space.Compact>}
|
style={{
|
width: '50%',
|
}}
|
/>
|
</Form.Item>
|
</Space.Compact>
|
</Form.Item>
|
</Col>
|
|
{/* scale */}
|
<Col span={18}>
|
<Form.Item
|
name="scaleSlider"
|
label={intl.formatMessage({ id: 'map.settings.scale', defaultMessage: '缩放' })}
|
labelCol={{ span: 5 }}
|
>
|
<Slider
|
min={0.1}
|
max={10}
|
step={0.1}
|
marks={{
|
0.1: '0.1',
|
1: '1',
|
10: '10',
|
}}
|
style={{
|
width: '100%'
|
}}
|
/>
|
</Form.Item>
|
</Col>
|
<Col span={6}>
|
<Form.Item
|
name="scale"
|
>
|
<InputNumber
|
min={0.1} max={10} step={0.1}
|
rules={[
|
{
|
required: true,
|
},
|
]}
|
/>
|
</Form.Item>
|
</Col>
|
|
{/* rotation */}
|
<Col span={18}>
|
<Form.Item
|
name="rotationSlider"
|
label={intl.formatMessage({ id: 'map.settings.rotation', defaultMessage: '角度' })}
|
labelCol={{ span: 5 }}
|
>
|
<Slider
|
min={0}
|
max={360}
|
step={1}
|
marks={{
|
0: '0°',
|
90: '90°',
|
180: '180°',
|
270: '270°',
|
360: '360°',
|
}}
|
style={{
|
width: '100%'
|
}}
|
/>
|
</Form.Item>
|
</Col>
|
<Col span={6}>
|
<Form.Item
|
name="rotation"
|
>
|
<InputNumber
|
min={0} max={360}
|
rules={[
|
{
|
required: true,
|
},
|
]}
|
/>
|
</Form.Item>
|
</Col>
|
|
{/* copy */}
|
<Col span={24}>
|
<Row gutter={0}>
|
<Form.Item
|
label={intl.formatMessage({ id: 'map.settings.copy', defaultMessage: '复制' })}
|
>
|
<Space.Compact>
|
<Form.Item
|
noStyle
|
name="copyDire"
|
>
|
<Select
|
style={{ width: 100 }}
|
options={[
|
{ value: 'left', label: intl.formatMessage({ id: 'map.settings.left', defaultMessage: '左' }) },
|
{ value: 'right', label: intl.formatMessage({ id: 'map.settings.right', defaultMessage: '右' }) },
|
{ value: 'top', label: intl.formatMessage({ id: 'map.settings.top', defaultMessage: '上' }) },
|
{ value: 'bottom', label: intl.formatMessage({ id: 'map.settings.bottom', defaultMessage: '下' }) },
|
]}
|
/>
|
</Form.Item>
|
<Form.Item
|
name='copyCount'
|
noStyle
|
rules={[
|
{
|
required: true,
|
},
|
]}
|
>
|
<InputNumber
|
addonBefore={<Space.Compact></Space.Compact>}
|
style={{
|
width: '50%',
|
}}
|
min={1}
|
step={1}
|
/>
|
</Form.Item>
|
<Form.Item>
|
<Button
|
onClick={() => {
|
setChildrenDrawer(true);
|
}}
|
>
|
<FormattedMessage id='common.execute' defaultMessage='执行' />
|
</Button>
|
<MapCopySettings
|
open={childrenDrawer}
|
refCurr={props.refCurr}
|
curSprite={props.curSprite}
|
values={form.getFieldsValue()}
|
submit={handleOnCopy}
|
onClose={() => {
|
setChildrenDrawer(false)
|
}}
|
/>
|
</Form.Item>
|
<Form.Item>
|
<Button
|
type="link"
|
onClick={() => {
|
if (lastCopiedSprites) {
|
lastCopiedSprites.forEach(copiedSprite => {
|
Utils.getMapContainer().removeChild(copiedSprite);
|
})
|
setLastCopiedSprites([]);
|
}
|
}}
|
>
|
<FormattedMessage id='map.settings.sub.copy.reverse' defaultMessage='撤销' />
|
</Button>
|
</Form.Item>
|
</Space.Compact>
|
</Form.Item>
|
</Row>
|
</Col>
|
|
{/* more */}
|
<Col span={24}>
|
<Form.Item
|
label={intl.formatMessage({ id: 'map.settings.more', defaultMessage: '更多' })}
|
>
|
<Button
|
type="dashed"
|
danger
|
onClick={() => {
|
Utils.getMapContainer().removeChild(curSprite);
|
props.setSpriteBySettings(null);
|
Utils.removeSelectedEffect();
|
form.resetFields();
|
}}
|
>
|
<FormattedMessage id='map.settings.delete' defaultMessage='删除' />
|
</Button>
|
</Form.Item>
|
</Col>
|
|
</Row>
|
</Form>
|
</>
|
)
|
}
|
|
export default MapSettings;
|