| | |
| | | import * as React from 'react' |
| | | import * as PIXI from 'pixi.js'; |
| | | import { FormattedMessage, useIntl, useModel } from '@umijs/max'; |
| | | import { Layout, Button, Flex, Row, Col, FloatButton, Select } from 'antd'; |
| | | import { Layout, Button, Flex, Row, Col, FloatButton, Select, Spin } from 'antd'; |
| | | const { Header, Content } = Layout; |
| | | import { |
| | | AppstoreAddOutlined, |
| | |
| | | import Settings from './components/settings' |
| | | import * as Utils from './utils' |
| | | import Player from './player'; |
| | | import MapDrawer from './drawer'; |
| | | |
| | | const useStyles = createStyles(({ token }) => { |
| | | let dark = token.colorBgBase === '#000'; |
| | |
| | | const [app, setApp] = React.useState(null); |
| | | const [mapContainer, setMapContainer] = React.useState(null); |
| | | const [didClickSprite, setDidClickSprite] = React.useState(false); |
| | | const [currSpriteBySettings, setCurrSpriteBySettings] = React.useState(null); |
| | | const [spriteBySettings, setSpriteBySettings] = React.useState(null); |
| | | const prevSpriteBySettingsRef = React.useRef(); |
| | | |
| | | // init func |
| | | React.useEffect(() => { |
| | |
| | | const width = contentRef.current.offsetWidth; |
| | | const height = contentRef.current.offsetHeight; |
| | | app.renderer.resize(width, height); |
| | | if (model !== MapModel.OBSERVER_MODEL) { |
| | | player.hideGridlines(); |
| | | player.showGridlines(); |
| | | } |
| | | }, [app, mapContainer, windowSize]) |
| | | |
| | | // model |
| | |
| | | |
| | | player.activateMapEvent(null); |
| | | |
| | | Utils.removeSelectedEffect(); |
| | | setDeviceVisible(false); |
| | | setSettingsVisible(false); |
| | | |
| | | mapContainer.children.forEach(child => { |
| | | child.off('pointerup'); |
| | | child.off('pointermove'); |
| | |
| | | |
| | | player.activateMapEvent(Utils.MapEvent.SELECTION_BOX); |
| | | |
| | | Utils.removeSelectedEffect(); |
| | | setSpriteBySettings(null); |
| | | setSettingsVisible(false); |
| | | |
| | | mapContainer.children.forEach(child => { |
| | | Utils.beMovable(child, setDidClickSprite); |
| | | }) |
| | |
| | | |
| | | player.activateMapEvent(null); |
| | | |
| | | setDeviceVisible(false); |
| | | |
| | | mapContainer.children.forEach(child => { |
| | | Utils.beSettings(child, setCurrSpriteBySettings, setDidClickSprite); |
| | | Utils.beSettings(child, setSpriteBySettings, setDidClickSprite); |
| | | }) |
| | | break |
| | | default: |
| | |
| | | }, [model]); |
| | | |
| | | // Add New Device |
| | | const onDrop = (sprite, x, y) => { |
| | | const onDrop = (sprite, type, x, y) => { |
| | | const { mapX, mapY } = Utils.getRealPosition(x, y, mapContainer); |
| | | sprite.x = mapX; |
| | | sprite.y = mapY; |
| | | |
| | | Utils.initSprite(sprite); |
| | | Utils.initSprite(sprite, type); |
| | | mapContainer.addChild(sprite); |
| | | Utils.beMovable(sprite, setDidClickSprite); |
| | | }; |
| | |
| | | player.updateDidClickSprite(didClickSprite); |
| | | }, [didClickSprite]) |
| | | |
| | | // watch spriteBySettings |
| | | React.useEffect(() => { |
| | | if (!mapContainer) { |
| | | return; |
| | | } |
| | | console.log(currSpriteBySettings); |
| | | if (currSpriteBySettings) { |
| | | setSettingsVisible(true); |
| | | prevSpriteBySettingsRef.current = spriteBySettings; |
| | | if (spriteBySettings && prevSpriteBySettings !== spriteBySettings) { |
| | | Utils.removeSelectedEffect(); |
| | | } |
| | | }, [currSpriteBySettings]) |
| | | if (spriteBySettings) { |
| | | Utils.showSelectedEffect(spriteBySettings) |
| | | setSettingsVisible(true); |
| | | } else { |
| | | Utils.removeSelectedEffect(); |
| | | } |
| | | }, [spriteBySettings]) |
| | | const prevSpriteBySettings = prevSpriteBySettingsRef.current; |
| | | |
| | | const settingsFinish = () => { |
| | | setCurrSpriteBySettings(null); |
| | | setSettingsVisible(false); |
| | | setSpriteBySettings(null); |
| | | } |
| | | |
| | | |
| | | return ( |
| | | <> |
| | | <Layout className={styles.layout}> |
| | | <Header className={styles.header}> |
| | | <Row style={{ height: '100%' }}> |
| | | <Col span={8} style={{ backgroundColor: '#3C40C6' }}></Col> |
| | | <Col span={8} style={{ backgroundColor: '#dcdde1' }}> |
| | | |
| | | |
| | | <Select |
| | | defaultValue="agv" |
| | | style={{ |
| | | width: 120, |
| | | }} |
| | | size={'large'} |
| | | onChange={(value, option) => { |
| | | console.log(value, option); |
| | | }} |
| | | options={[ |
| | | { |
| | | value: 'agv', |
| | | label: 'agv', |
| | | }, |
| | | { |
| | | value: 'crn', |
| | | label: 'crn', |
| | | }, |
| | | ]} |
| | | /> |
| | | |
| | | <Select |
| | | |
| | | // notFoundContent={loading ? <Spin size="small" /> : null} |
| | | |
| | | /> |
| | | |
| | | |
| | | </Col> |
| | | <Col span={16} style={{ backgroundColor: '#3C40C6' }}> |
| | | <Flex className={styles.flex} gap={'large'} justify={'flex-end'} align={'center'}> |
| | | <Select |
| | |
| | | </Row> |
| | | </Header> |
| | | <Content ref={contentRef} className={styles.content}> |
| | | <div ref={mapRef} style={{ position: "relative" }} /> |
| | | |
| | | <FloatButton.Group |
| | | shape="square" |
| | | style={{ |
| | | left: 35, |
| | | bottom: 35 |
| | | }} |
| | | > |
| | | <FloatButton |
| | | icon={<CompressOutlined />} |
| | | /> |
| | | <FloatButton.BackTop visibilityHeight={0} /> |
| | | </FloatButton.Group> |
| | | |
| | | <FloatButton.Group |
| | | hidden={model === MapModel.OBSERVER_MODEL} |
| | | trigger="hover" |
| | | style={{ |
| | | right: 35, |
| | | bottom: 35 |
| | | }} |
| | | icon={<AppstoreAddOutlined />} |
| | | > |
| | | <FloatButton |
| | | tooltip={<div><FormattedMessage id='map.device.add' defaultMessage='添加设备' /></div>} |
| | | icon={<FileAddOutlined />} |
| | | onClick={() => { |
| | | setDeviceVisible(true); |
| | | <div ref={mapRef} style={{ position: "relative" }} > |
| | | <FloatButton.Group |
| | | shape="square" |
| | | style={{ |
| | | left: 35, |
| | | bottom: 35 |
| | | }} |
| | | /> |
| | | <FloatButton |
| | | type={model === MapModel.SETTINGS_MODEL ? 'primary' : 'default'} |
| | | tooltip={<div><FormattedMessage id='map.device.oper' defaultMessage='参数设置' /></div>} |
| | | icon={<SettingOutlined />} |
| | | onClick={() => { |
| | | setModel(model === MapModel.SETTINGS_MODEL ? MapModel.MOVABLE_MODEL : MapModel.SETTINGS_MODEL) |
| | | > |
| | | <FloatButton |
| | | icon={<CompressOutlined />} |
| | | /> |
| | | <FloatButton.BackTop visibilityHeight={0} /> |
| | | </FloatButton.Group> |
| | | |
| | | <FloatButton.Group |
| | | hidden={model === MapModel.OBSERVER_MODEL} |
| | | style={{ |
| | | left: 35, |
| | | bottom: window.innerHeight / 2 |
| | | }} |
| | | /> |
| | | </FloatButton.Group> |
| | | icon={<AppstoreAddOutlined />} |
| | | > |
| | | <FloatButton |
| | | hidden={model === MapModel.OBSERVER_MODEL} |
| | | type={deviceVisible ? 'primary' : 'default'} |
| | | tooltip={<div><FormattedMessage id='map.device.add' defaultMessage='添加设备' /></div>} |
| | | icon={<FileAddOutlined />} |
| | | onClick={() => { |
| | | if (deviceVisible) { |
| | | setDeviceVisible(false); |
| | | } else { |
| | | setDeviceVisible(true); |
| | | setModel(MapModel.MOVABLE_MODEL); |
| | | } |
| | | }} |
| | | /> |
| | | <FloatButton |
| | | hidden={model === MapModel.OBSERVER_MODEL} |
| | | type={model === MapModel.SETTINGS_MODEL ? 'primary' : 'default'} |
| | | tooltip={<div><FormattedMessage id='map.device.oper' defaultMessage='参数设置' /></div>} |
| | | icon={<SettingOutlined />} |
| | | onClick={() => { |
| | | setModel(model === MapModel.SETTINGS_MODEL ? MapModel.MOVABLE_MODEL : MapModel.SETTINGS_MODEL) |
| | | }} |
| | | /> |
| | | </FloatButton.Group> |
| | | </div> |
| | | </Content> |
| | | </Layout> |
| | | |
| | |
| | | |
| | | <Settings |
| | | open={settingsVisible} |
| | | curSprite={spriteBySettings} |
| | | onCancel={() => { |
| | | setSettingsVisible(false); |
| | | setSpriteBySettings(null); |
| | | }} |
| | | setSpriteBySettings={setSpriteBySettings} |
| | | setDidClickSprite={setDidClickSprite} |
| | | refCurr={mapRef.current} |
| | | onDrop={settingsFinish} |
| | | onSubmit={settingsFinish} |
| | | /> |
| | | </> |
| | | ) |