UNPKG

diagram-js

Version:

A toolbox for displaying and modifying diagrams on the web

150 lines (122 loc) 2.75 kB
import { assign } from 'min-dash'; /** * @typedef {import('../keyboard/Keyboard').default} Keyboard * @typedef {import('../modeling/Modeling').default} Modeling * @typedef {import('../rules/Rules').default} Rules * @typedef {import('../selection/Selection').default} Selection */ var DEFAULT_CONFIG = { moveSpeed: 1, moveSpeedAccelerated: 10 }; var HIGHER_PRIORITY = 1500; var LEFT = 'left'; var UP = 'up'; var RIGHT = 'right'; var DOWN = 'down'; var KEY_TO_DIRECTION = { ArrowLeft: LEFT, Left: LEFT, ArrowUp: UP, Up: UP, ArrowRight: RIGHT, Right: RIGHT, ArrowDown: DOWN, Down: DOWN }; var DIRECTIONS_DELTA = { left: function(speed) { return { x: -speed, y: 0 }; }, up: function(speed) { return { x: 0, y: -speed }; }, right: function(speed) { return { x: speed, y: 0 }; }, down: function(speed) { return { x: 0, y: speed }; } }; /** * Enables to move selection with keyboard arrows. * Use with Shift for modified speed (default=1, with Shift=10). * Pressed Cmd/Ctrl turns the feature off. * * @param {Object} config * @param {number} [config.moveSpeed=1] * @param {number} [config.moveSpeedAccelerated=10] * @param {Keyboard} keyboard * @param {Modeling} modeling * @param {Rules} rules * @param {Selection} selection */ export default function KeyboardMoveSelection( config, keyboard, modeling, rules, selection ) { var self = this; this._config = assign({}, DEFAULT_CONFIG, config || {}); keyboard.addListener(HIGHER_PRIORITY, function(event) { var keyEvent = event.keyEvent; var direction = KEY_TO_DIRECTION[keyEvent.key]; if (!direction) { return; } if (keyboard.isCmd(keyEvent)) { return; } var accelerated = keyboard.isShift(keyEvent); self.moveSelection(direction, accelerated); return true; }); /** * Move selected elements in the given direction, * optionally specifying accelerated movement. * * @param {string} direction * @param {boolean} [accelerated=false] */ this.moveSelection = function(direction, accelerated) { var selectedElements = selection.get(); if (!selectedElements.length) { return; } var speed = this._config[ accelerated ? 'moveSpeedAccelerated' : 'moveSpeed' ]; var delta = DIRECTIONS_DELTA[direction](speed); var canMove = rules.allowed('elements.move', { shapes: selectedElements }); if (canMove) { modeling.moveElements(selectedElements, delta); } }; } KeyboardMoveSelection.$inject = [ 'config.keyboardMoveSelection', 'keyboard', 'modeling', 'rules', 'selection' ];