# src/contextMenus/CanvasContextMenu.js

    import {math, ContextMenu} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";

    /**
     * @private
     */
    class CanvasContextMenu extends ContextMenu {
        constructor(cfg = {}) {
            super({
                hideOnAction: cfg.hideOnAction,
                context: cfg.context,
                items: [
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.viewFitAll") || "View Fit All";
                            },
                            doAction: (context) => {
                                const viewer = context.viewer;
                                const scene = viewer.scene;
                                const sceneAABB = scene.getAABB(scene.visibleObjectIds);
                                viewer.cameraFlight.flyTo({
                                    aabb: sceneAABB,
                                    duration: 0.5
                                });
                                viewer.cameraControl.pivotPos = math.getAABB3Center(sceneAABB);
                            }
                        },
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.viewFitSelection") || "View Fit Selected";
                            },
                            getEnabled: (context) => {
                                return (context.viewer.scene.numSelectedObjects > 0);
                            },
                            doAction: (context) => {
                                const viewer = context.viewer;
                                const scene = viewer.scene;
                                const sceneAABB = scene.getAABB(scene.selectedObjectIds);
                                viewer.cameraFlight.flyTo({
                                    aabb: sceneAABB,
                                    duration: 0.5
                                });
                                viewer.cameraControl.pivotPos = math.getAABB3Center(sceneAABB);
                            }
                        }
                    ],
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.hideAll") || "Hide All";
                            },
                            getEnabled: (context) => {
                                return (context.viewer.scene.numVisibleObjects > 0);
                            },
                            doAction: (context) => {
                                context.viewer.scene.setObjectsVisible(context.viewer.scene.visibleObjectIds, false);
                            }
                        },
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.showAll") || "Show All";
                            },
                            getEnabled: (context) => {
                                const scene = context.viewer.scene;
                                return ((scene.numVisibleObjects < scene.numObjects) || (context.viewer.scene.numXRayedObjects > 0));
                            },
                            doAction: (context) => {
                                const scene = context.viewer.scene;
                                scene.setObjectsVisible(scene.objectIds, true);
                                scene.setObjectsXRayed(scene.xrayedObjectIds, false);
                            }
                        }
                    ],
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.xRayAll") || "X-Ray All";
                            },
                            getEnabled: (context) => {
                                const scene = context.viewer.scene;
                                return (scene.numXRayedObjects < scene.numObjects);
                            },
                            doAction: (context) => {
                                const scene = context.viewer.scene;
                                scene.setObjectsVisible(scene.objectIds, true);
                                scene.setObjectsXRayed(scene.objectIds, true);
                                if (!context.bimViewer.getConfig("xrayPickable")) {
                                    scene.setObjectsPickable(scene.objectIds, false);
                                }
                            }
                        },
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.xRayNone") || "X-Ray None";
                            },
                            getEnabled: (context) => {
                                return (context.viewer.scene.numXRayedObjects > 0);
                            },
                            doAction: (context) => {
                                const xrayedObjectIds = context.viewer.scene.xrayedObjectIds;
                                context.viewer.scene.setObjectsPickable(xrayedObjectIds, true);
                                context.viewer.scene.setObjectsXRayed(xrayedObjectIds, false);
                            }
                        }
                    ],
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.selectNone") || "Select None";
                            },
                            getEnabled: (context) => {
                                return (context.viewer.scene.numSelectedObjects > 0);
                            },
                            doAction: (context) => {
                                context.viewer.scene.setObjectsSelected(context.viewer.scene.selectedObjectIds, false);
                            }
                        }
                    ],
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.resetView") || "Reset View";
                            },
                            doAction: (context) => {
                                context.bimViewer.resetView();
                            }
                        }
                    ],
                    [
                        {
                            getTitle: (context) => {
                                return context.viewer.localeService.translate("canvasContextMenu.clearSlices") || "Clear Slices";
                            },
                            getEnabled: (context) => {
                                return (context.bimViewer.getNumSections() > 0);
                            },
                            doAction: (context) => {
                                context.bimViewer.clearSections();
                            }
                        }
                    ]
                ]
            });
        }
    }

    export {CanvasContextMenu};