UNPKG

sprotty

Version:

A next-gen framework for graphical views

111 lines 5.19 kB
"use strict"; /******************************************************************************** * Copyright (c) 2017-2023 TypeFox and others. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. * * This Source Code may also be made available under the following Secondary * Licenses when the conditions for such availability set forth in the Eclipse * Public License v. 2.0 are satisfied: GNU General Public License, version 2 * with the GNU Classpath Exception which is available at * https://www.gnu.org/software/classpath/license.html. * * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZoomMouseListener = exports.getZoom = void 0; const inversify_1 = require("inversify"); const actions_1 = require("sprotty-protocol/lib/actions"); const geometry_1 = require("sprotty-protocol/lib/utils/geometry"); const smodel_utils_1 = require("../../base/model/smodel-utils"); const types_1 = require("../../base/types"); const mouse_tool_1 = require("../../base/views/mouse-tool"); const browser_1 = require("../../utils/browser"); const model_1 = require("./model"); const geometry_2 = require("../../utils/geometry"); function getZoom(label) { let zoom = 1; const viewport = (0, smodel_utils_1.findParentByFeature)(label, model_1.isViewport); if (viewport) { zoom = viewport.zoom; } return zoom; } exports.getZoom = getZoom; class ZoomMouseListener extends mouse_tool_1.MouseListener { wheel(target, event) { const viewport = (0, smodel_utils_1.findParentByFeature)(target, model_1.isViewport); if (!viewport) { return []; } const newViewport = this.isScrollMode(event) ? this.processScroll(viewport, event) : this.processZoom(viewport, target, event); if (newViewport) { return [actions_1.SetViewportAction.create(viewport.id, newViewport, { animate: false })]; } return []; } isScrollMode(event) { return event.altKey; } processScroll(viewport, event) { return { scroll: { x: viewport.scroll.x + event.deltaX, y: viewport.scroll.y + event.deltaY }, zoom: viewport.zoom }; } processZoom(viewport, target, event) { const zoomFactor = this.getZoomFactor(event); if (zoomFactor > 1 && (0, geometry_1.almostEquals)(viewport.zoom, this.viewerOptions.zoomLimits.max) || zoomFactor < 1 && (0, geometry_1.almostEquals)(viewport.zoom, this.viewerOptions.zoomLimits.min)) { return; } // 'limitViewport' used by 'SetViewportCommand' will set the zoom to the min max level // so we need to do this here to to avoid 'jumps' of the diagram based on the viewport.scroll const zoom = (0, geometry_2.limit)(viewport.zoom * zoomFactor, this.viewerOptions.zoomLimits); const viewportOffset = this.getViewportOffset(target.root, event); const offsetFactor = 1.0 / zoom - 1.0 / viewport.zoom; return { scroll: { x: viewport.scroll.x - offsetFactor * viewportOffset.x, y: viewport.scroll.y - offsetFactor * viewportOffset.y }, zoom }; } getViewportOffset(root, event) { const canvasBounds = root.canvasBounds; const windowScroll = (0, browser_1.getWindowScroll)(); return { x: event.clientX + windowScroll.x - canvasBounds.x, y: event.clientY + windowScroll.y - canvasBounds.y }; } getZoomFactor(event) { if (event.deltaMode === event.DOM_DELTA_PAGE) return Math.exp(-event.deltaY * 0.5); else if (event.deltaMode === event.DOM_DELTA_LINE) return Math.exp(-event.deltaY * 0.05); else // deltaMode === DOM_DELTA_PIXEL return Math.exp(-event.deltaY * 0.005); } } exports.ZoomMouseListener = ZoomMouseListener; __decorate([ (0, inversify_1.inject)(types_1.TYPES.ViewerOptions), __metadata("design:type", Object) ], ZoomMouseListener.prototype, "viewerOptions", void 0); //# sourceMappingURL=zoom.js.map