UNPKG

@eclipse-glsp/client

Version:

A sprotty-based client for GLSP

198 lines 9.47 kB
"use strict"; 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.HelperLineManager = exports.DEFAULT_HELPER_LINE_OPTIONS = exports.DEFAULT_MOVE_DELTA = void 0; /******************************************************************************** * Copyright (c) 2023-2024 EclipseSource 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 ********************************************************************************/ const sprotty_1 = require("@eclipse-glsp/sprotty"); const inversify_1 = require("inversify"); const selection_service_1 = require("../../base/selection-service"); const set_bounds_feedback_command_1 = require("../bounds/set-bounds-feedback-command"); const model_1 = require("../change-bounds/model"); const grid_1 = require("../grid/grid"); const change_bounds_tool_feedback_1 = require("../tools/change-bounds/change-bounds-tool-feedback"); const helper_line_feedback_1 = require("./helper-line-feedback"); const model_2 = require("./model"); exports.DEFAULT_MOVE_DELTA = { x: 1, y: 1 }; exports.DEFAULT_HELPER_LINE_OPTIONS = { elementLines: helper_line_feedback_1.DEFAULT_ELEMENT_LINES, viewportLines: helper_line_feedback_1.DEFAULT_VIEWPORT_LINES, alignmentEpsilon: helper_line_feedback_1.DEFAULT_EPSILON, alignmentElementFilter: helper_line_feedback_1.DEFAULT_ALIGNABLE_ELEMENT_FILTER, minimumMoveDelta: exports.DEFAULT_MOVE_DELTA, debug: helper_line_feedback_1.DEFAULT_DEBUG }; let HelperLineManager = class HelperLineManager { init() { this.feedback = this.feedbackDispatcher.createEmitter(); const dynamicOptions = {}; if (this.grid) { dynamicOptions.alignmentEpsilon = 0; dynamicOptions.minimumMoveDelta = sprotty_1.Point.multiplyScalar(this.grid, 2); } this.options = { ...exports.DEFAULT_HELPER_LINE_OPTIONS, ...dynamicOptions, ...this.userOptions }; this.selectionService.addListener(this); } handle(action) { if (change_bounds_tool_feedback_1.MoveInitializedEventAction.is(action)) { this.handleMoveInitializedAction(action); } else if (sprotty_1.MoveAction.is(action)) { this.handleMoveAction(action); } else if (change_bounds_tool_feedback_1.MoveFinishedEventAction.is(action)) { this.handleMoveFinishedAction(action); } else if (sprotty_1.SetBoundsAction.is(action) || set_bounds_feedback_command_1.SetBoundsFeedbackAction.is(action)) { this.handleSetBoundsAction(action); } } handleMoveInitializedAction(_action) { this.submitHelperLineFeedback(); } handleMoveFinishedAction(_action) { this.feedback.dispose(); } handleMoveAction(action) { if (!action.finished) { this.submitHelperLineFeedback(action.moves.map(move => move.elementId)); } else { this.feedback.dispose(); } } submitHelperLineFeedback(elementIds = this.selectionService.getSelectedElementIDs()) { const feedback = this.createHelperLineFeedback(elementIds); this.feedback.add(feedback, [helper_line_feedback_1.RemoveHelperLinesFeedbackAction.create()]).submit(); } createHelperLineFeedback(elementIds) { return helper_line_feedback_1.DrawHelperLinesFeedbackAction.create({ elementIds, ...this.options }); } handleSetBoundsAction(action) { this.submitHelperLineFeedback(action.bounds.map(bound => bound.elementId)); } selectionChanged(root, selectedElements, deselectedElements) { this.feedback.dispose(); } getMinimumMoveDelta(element, isSnap, direction) { if (!isSnap) { return 0; } const minimumMoveDelta = this.options.minimumMoveDelta; return direction === model_2.Direction.Left || direction === model_2.Direction.Right ? minimumMoveDelta.x : minimumMoveDelta.y; } getMinimumMoveVector(element, isSnap, move) { if (!isSnap) { return undefined; } const state = this.getHelperLineState(element); if (state.helperLines.length === 0) { return undefined; } const minimum = { ...sprotty_1.Vector.ZERO }; const resize = element instanceof model_1.GResizeHandle ? model_1.ResizeHandleLocation.direction(element.location) : [model_2.Direction.Left, model_2.Direction.Right, model_2.Direction.Up, model_2.Direction.Down]; if ((state.types.left || state.types.center) && move.includes(model_2.Direction.Left) && resize.includes(model_2.Direction.Left)) { minimum.x = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Left); } else if ((state.types.right || state.types.center) && move.includes(model_2.Direction.Right) && resize.includes(model_2.Direction.Right)) { minimum.x = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Right); } if ((state.types.top || state.types.middle) && move.includes(model_2.Direction.Up) && resize.includes(model_2.Direction.Up)) { minimum.y = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Up); } else if ((state.types.bottom || state.types.middle) && move.includes(model_2.Direction.Down) && resize.includes(model_2.Direction.Down)) { minimum.y = this.getMinimumMoveDelta(element, isSnap, model_2.Direction.Down); } return sprotty_1.Vector.isZero(minimum) ? undefined : minimum; } getHelperLineState(element) { const helperLines = element.root.children.filter(model_2.isHelperLine) || []; const types = { left: false, right: false, top: false, bottom: false, center: false, middle: false }; for (const line of helperLines) { switch (line.lineType) { case model_2.HelperLineType.Left: case model_2.HelperLineType.LeftRight: types.left = true; break; case model_2.HelperLineType.Right: case model_2.HelperLineType.RightLeft: types.right = true; break; case model_2.HelperLineType.Top: case model_2.HelperLineType.TopBottom: types.top = true; break; case model_2.HelperLineType.Bottom: case model_2.HelperLineType.BottomTop: types.bottom = true; break; case model_2.HelperLineType.Center: types.center = true; break; case model_2.HelperLineType.Middle: types.middle = true; break; } } return { helperLines, types }; } }; exports.HelperLineManager = HelperLineManager; __decorate([ (0, inversify_1.inject)(sprotty_1.TYPES.IFeedbackActionDispatcher), __metadata("design:type", Object) ], HelperLineManager.prototype, "feedbackDispatcher", void 0); __decorate([ (0, inversify_1.inject)(selection_service_1.SelectionService), __metadata("design:type", selection_service_1.SelectionService) ], HelperLineManager.prototype, "selectionService", void 0); __decorate([ (0, inversify_1.optional)(), (0, inversify_1.inject)(sprotty_1.TYPES.IHelperLineOptions), __metadata("design:type", Object) ], HelperLineManager.prototype, "userOptions", void 0); __decorate([ (0, inversify_1.optional)(), (0, inversify_1.inject)(sprotty_1.TYPES.Grid), __metadata("design:type", Object) ], HelperLineManager.prototype, "grid", void 0); __decorate([ (0, inversify_1.postConstruct)(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], HelperLineManager.prototype, "init", null); exports.HelperLineManager = HelperLineManager = __decorate([ (0, inversify_1.injectable)() ], HelperLineManager); //# sourceMappingURL=helper-line-manager.js.map