From 4b0e0b68330c42ddc69669638e774354ef4eea37 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期三, 09 十月 2024 16:46:17 +0800
Subject: [PATCH] #
---
zy-acs-flow/src/map/MapPage.jsx | 213 +++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 166 insertions(+), 47 deletions(-)
diff --git a/zy-acs-flow/src/map/MapPage.jsx b/zy-acs-flow/src/map/MapPage.jsx
index 155c827..33081e6 100644
--- a/zy-acs-flow/src/map/MapPage.jsx
+++ b/zy-acs-flow/src/map/MapPage.jsx
@@ -1,4 +1,5 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
+import { useTranslate } from "react-admin";
import {
TextField,
Select,
@@ -7,6 +8,8 @@
Box,
SpeedDial,
SpeedDialAction,
+ useTheme,
+ Snackbar,
} from '@mui/material';
import {
MoreVert as MoreVertIcon,
@@ -17,56 +20,112 @@
Share as ShareIcon,
} from '@mui/icons-material';
import Player from './player';
+import * as Tool from './tool';
+import { NotificationProvider, useNotification } from './Notification';
+import Device from "./Device";
+import * as Http from './http';
let player;
-const MapPage = () => {
+const Map = () => {
+ const theme = useTheme();
+ const themeMode = theme.palette.mode;
+ const notify = useNotification();
+ const translate = useTranslate();
+
const mapRef = useRef();
const contentRef = useRef();
-
const [app, setApp] = useState(null);
- const [mapContainer, setMapContainer] = React.useState(null);
+ const [mapContainer, setMapContainer] = useState(null);
- const [windowSize, setWindowSize] = useState({
- width: window.innerWidth,
- height: window.innerHeight,
- });
+ const [mode, setMode] = useState(MapMode.OBSERVER_MODE);
+ const [deviceVisible, setDeviceVisible] = React.useState(false);
- const [mode, setMode] = useState('monitoring');
useEffect(() => {
+ Tool.patchRaLayout('0px');
const initialize = async () => {
- player = new Player(mapRef.current);
+ player = new Player(mapRef.current, themeMode);
setApp(player.app);
setMapContainer(player.mapContainer);
+ Tool.setApp(player.app);
+ Tool.setMapContainer(player.mapContainer);
+ Http.setNotify(notify);
- const handleResize = () => {
- setWindowSize({
- width: window.innerWidth,
- height: window.innerHeight,
- });
- };
- window.addEventListener('resize', handleResize);
+ await Http.fetchMapData(0);
+
}
-
initialize();
- return () => {
- player.app.destroy(true, { children: true });
- window.removeEventListener('resize', () => { });
- };
- }, [])
- // resize
- useEffect(() => {
- if (app && contentRef.current) {
+ // resize
+ const handleResize = () => {
const width = contentRef.current.offsetWidth;
const height = contentRef.current.offsetHeight;
- app.renderer.resize(width, height); // 鍔ㄦ�佽皟鏁� PIXI 澶у皬
- }
- }, [app, mapContainer]);
- const handleModeChange = (event) => {
- setMode(event.target.value);
+ player.resize(width, height);
+ };
+ handleResize();
+ window.addEventListener('resize', handleResize);
+
+ notify('Welcome to Rcs', 'info');
+
+ return () => {
+ player.destroy();
+ window.removeEventListener('resize', handleResize);
+ Tool.patchRaLayout('');
+ };
+ }, [themeMode])
+
+ const switchMode = (mode) => {
+ switch (mode) {
+ case MapMode.OBSERVER_MODE:
+ setDeviceVisible(false);
+ player.hideGridLines();
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ console.log(selectedSprites);
+ });
+
+ break
+ case MapMode.MOVABLE_MODE:
+ player.showGridLines();
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ Tool.spriteListBeMovable(selectedSprites, () => {
+ restartFn();
+ });
+ });
+ break
+ case MapMode.SETTINGS_MODE:
+ player.hideGridLines();
+ setDeviceVisible(false);
+
+ player.activateMapMultiSelect((selectedSprites, restartFn) => {
+ console.log(selectedSprites);
+ });
+ break
+ default:
+ break
+ }
+ }
+
+ useEffect(() => {
+ if (!mapContainer) {
+ return
+ }
+ switchMode(mode);
+ }, [mode]);
+
+ const onDrop = (sprite, type, x, y) => {
+ console.log(sprite, type, x, y);
+
+ const { mapX, mapY } = Tool.getRealPosition(x, y);
+ sprite.x = mapX;
+ sprite.y = mapY;
+
+ Tool.initSprite(sprite, type);
+ mapContainer.addChild(sprite);
+ Tool.beMovable(sprite);
};
const actions = [
@@ -80,12 +139,12 @@
return (
<Box
sx={{
- margin: '0 -8px',
height: '100%',
display: 'flex',
flexDirection: 'column',
}}
>
+ {/* header */}
<Box
sx={{
display: 'flex',
@@ -95,6 +154,7 @@
padding: '0 16px',
height: '64px',
flexShrink: 0, // keep height
+ zIndex: 200
}}
>
<TextField
@@ -108,32 +168,59 @@
}}
/>
<Box sx={{ flexGrow: 1 }} />
+
+ {mode === MapMode.OBSERVER_MODE && (
+ <>
+ <Button
+ variant="contained"
+ color="primary"
+ sx={{ mr: 1 }}
+ >
+ 鍋滄RCS杩愯浆
+ </Button>
+ <Button variant="contained" color="secondary">
+ 妯℃嫙AGV杩愯
+ </Button>
+ </>
+ )}
+
+ {mode === MapMode.MOVABLE_MODE && (
+ <>
+ <Button
+ variant="contained"
+ color="primary"
+ sx={{ mr: 1 }}
+ onClick={() => setDeviceVisible(!deviceVisible)}
+ >
+ {translate('page.map.devices.title')}
+ </Button>
+ </>
+ )}
+
+ {mode === MapMode.SETTINGS_MODE && (
+ <>
+ </>
+ )}
+
<Select
value={mode}
- onChange={handleModeChange}
+ onChange={(event) => {
+ setMode(event.target.value);
+ }}
variant="outlined"
size="small"
sx={{
- mr: 2,
+ ml: 2,
backgroundColor: '#fff',
borderRadius: 1,
}}
>
- <MenuItem value="monitoring">鐩戞帶妯″紡</MenuItem>
- <MenuItem value="edit">缂栬緫妯″紡</MenuItem>
- <MenuItem value="configuration">閰嶇疆妯″紡</MenuItem>
+ <MenuItem value={MapMode.OBSERVER_MODE}>鐩戞帶妯″紡</MenuItem>
+ <MenuItem value={MapMode.MOVABLE_MODE}>缂栬緫妯″紡</MenuItem>
+ <MenuItem value={MapMode.SETTINGS_MODE}>閰嶇疆妯″紡</MenuItem>
</Select>
- <Button
- variant="contained"
- color="primary"
- sx={{ mr: 1 }}
- >
- 鍋滄RCS杩愯浆
- </Button>
- <Button variant="contained" color="secondary">
- 妯℃嫙AGV杩愯
- </Button>
</Box>
+ {/* content */}
<Box
sx={{
flexGrow: 1, // fill remaining of map space
@@ -144,12 +231,20 @@
<Box
ref={contentRef}
sx={{
+ position: 'relative',
width: '100%',
height: '100%',
backgroundColor: '#e0e0e0',
+ overflowY: 'hidden',
}}
>
- <div ref={mapRef} />
+ <div ref={mapRef} style={{
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ width: '100%',
+ height: '100%',
+ }} />
</Box>
<SpeedDial
@@ -166,8 +261,32 @@
))}
</SpeedDial>
</Box>
+
+ <Device
+ open={deviceVisible}
+ onCancel={() => {
+ setDeviceVisible(false);
+ }}
+ onDrop={onDrop}
+ width={378}
+ />
+
</Box>
);
}
+const MapPage = () => {
+ return (
+ <NotificationProvider>
+ <Map />
+ </NotificationProvider>
+ )
+}
+
+export const MapMode = Object.freeze({
+ OBSERVER_MODE: "1",
+ MOVABLE_MODE: "2",
+ SETTINGS_MODE: "3",
+})
+
export default MapPage;
--
Gitblit v1.9.1