sprotty
Version:
A next-gen framework for graphical views
111 lines • 5.19 kB
JavaScript
;
/********************************************************************************
* 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