|
|
@@ -1,27 +1,20 @@
|
|
|
import { fabric } from 'fabric';
|
|
|
import cameraActiveImg from '@/assets/camera/camera-active.png';
|
|
|
import cameraImg from '@/assets/camera/camera.png';
|
|
|
-import { MapData } from './types';
|
|
|
+import favoritesImg from '@/assets/camera/favorites.png';
|
|
|
+import { CameraImage, MapData, OnRightClick, OnSelect, isCanvas } from './types';
|
|
|
import { fabricSetting } from './fabricSetting';
|
|
|
+import { getRandomPosition } from './utils';
|
|
|
+// import templateGroup from './CameraGroup';
|
|
|
+import { createGroup, toggleGroupSelected, toggleCameraDefault } from './CameraStarGroup';
|
|
|
|
|
|
-export interface CameraImage extends fabric.Image {
|
|
|
- cameraId: string;
|
|
|
-}
|
|
|
-
|
|
|
-type Canvas = fabric.Canvas;
|
|
|
-
|
|
|
-const isCanvas = (canvas: Canvas | null): canvas is Canvas => {
|
|
|
- return Boolean(canvas);
|
|
|
-};
|
|
|
-
|
|
|
-type OnSelect = (image: CameraImage | null) => unknown;
|
|
|
-type OnRightClick = (e: fabric.IEvent<MouseEvent>) => unknown;
|
|
|
-fabricSetting(fabric);
|
|
|
+fabricSetting();
|
|
|
|
|
|
class CameraMap {
|
|
|
public canvas: fabric.Canvas | null = null;
|
|
|
private onSelect: OnSelect;
|
|
|
private onRightClick: OnRightClick;
|
|
|
+ private templateGroup: fabric.Group | null = null;
|
|
|
|
|
|
constructor(param: { canvasId: string; onSelect: OnSelect; onRightClick: OnRightClick }) {
|
|
|
this.canvas = new fabric.Canvas(param.canvasId, {
|
|
|
@@ -31,7 +24,10 @@ class CameraMap {
|
|
|
this.addListener();
|
|
|
this.onSelect = param.onSelect;
|
|
|
this.onRightClick = param.onRightClick;
|
|
|
- // window.canvas = this.canvas;
|
|
|
+ createGroup().then((res) => {
|
|
|
+ this.templateGroup = res;
|
|
|
+ });
|
|
|
+ window.canvas = this.canvas;
|
|
|
}
|
|
|
|
|
|
/** 监听点击事件 */
|
|
|
@@ -43,6 +39,7 @@ class CameraMap {
|
|
|
const target = options.target as CameraImage;
|
|
|
const cameraId = target?.cameraId;
|
|
|
// console.log('当前选中的id是', cameraId);
|
|
|
+ console.log('mouse:down');
|
|
|
console.log(options);
|
|
|
|
|
|
// 判断:右键,且在元素上右键
|
|
|
@@ -53,24 +50,29 @@ class CameraMap {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- canvas.forEachObject((object) => {
|
|
|
- if (object === options.target) return;
|
|
|
- (object as CameraImage).setSrc(cameraImg, () => {
|
|
|
- canvas.renderAll();
|
|
|
- });
|
|
|
- });
|
|
|
+ this.setAllGroupsUnselected();
|
|
|
if (!cameraId || !target) {
|
|
|
this.onSelect(null);
|
|
|
return;
|
|
|
}
|
|
|
- target.setSrc(cameraActiveImg, () => {
|
|
|
+ toggleGroupSelected(target, true).then(() => {
|
|
|
canvas.renderAll();
|
|
|
});
|
|
|
-
|
|
|
this.onSelect(target);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ private setAllGroupsUnselected() {
|
|
|
+ const canvas = this.canvas;
|
|
|
+ if (!isCanvas(canvas)) return;
|
|
|
+ canvas.getObjects('group').forEach((object) => {
|
|
|
+ // if (object === options.target) return;
|
|
|
+ toggleGroupSelected(object, false).then((res) => {
|
|
|
+ canvas.renderAll();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
/** 上传背景图 */
|
|
|
public uploadBg(imgUrl: string) {
|
|
|
const canvas = this.canvas;
|
|
|
@@ -97,25 +99,18 @@ class CameraMap {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- private getRandomPosition() {
|
|
|
- return 100 + Math.floor(Math.random() * 30);
|
|
|
- }
|
|
|
-
|
|
|
/** 增加一个摄像头 */
|
|
|
public addCamera(cameraId: string): Promise<CameraImage> {
|
|
|
const canvas = this.canvas;
|
|
|
- if (!isCanvas(canvas)) return Promise.reject();
|
|
|
+ if (!isCanvas(canvas) || !this.templateGroup) return Promise.reject();
|
|
|
+
|
|
|
return new Promise((resolve) => {
|
|
|
- fabric.Image.fromURL(cameraActiveImg, (cImg) => {
|
|
|
- const cameraImg: CameraImage = cImg as unknown as CameraImage;
|
|
|
- this.setAllCameraUnActive();
|
|
|
- cameraImg.set({
|
|
|
- left: this.getRandomPosition(),
|
|
|
- top: this.getRandomPosition(),
|
|
|
- cameraId,
|
|
|
- });
|
|
|
- canvas.add(cameraImg);
|
|
|
- resolve(cameraImg);
|
|
|
+ this.setAllGroupsUnselected();
|
|
|
+ createGroup().then((newGroup) => {
|
|
|
+ console.log('templateGroup.clone result', newGroup);
|
|
|
+ newGroup.set({ left: getRandomPosition(), top: getRandomPosition(), cameraId });
|
|
|
+ canvas.add(newGroup);
|
|
|
+ resolve(newGroup);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
@@ -196,6 +191,21 @@ class CameraMap {
|
|
|
.objects.map((item) => (item as CameraImage).cameraId);
|
|
|
return cameraIds.includes(cameraId);
|
|
|
}
|
|
|
+
|
|
|
+ /** 根据cameraId查找某个元素 */
|
|
|
+ public getCameraById(cameraId: string) {
|
|
|
+ return this.canvas?.getObjects().find((x) => (x as CameraImage).cameraId === cameraId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public setDefaultCamera(camera: fabric.Group) {
|
|
|
+ const canvas = this.canvas;
|
|
|
+ if (!isCanvas(canvas)) return;
|
|
|
+ canvas.getObjects('group').forEach((object) => {
|
|
|
+ toggleCameraDefault(object, false);
|
|
|
+ });
|
|
|
+ toggleCameraDefault(camera, true);
|
|
|
+ canvas.renderAll();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default CameraMap;
|