mirror of
https://github.com/google/blockly.git
synced 2026-01-11 02:47:09 +01:00
Our files are up to a decade old, and have churned so much, that the initial author of the file no longer has much meaning. Furthermore, this will encourage developers to post to the developer group, rather than emailing Googlers (usually me) directly.
117 lines
3.1 KiB
JavaScript
117 lines
3.1 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2017 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview Methods for dragging a workspace visually.
|
|
*/
|
|
'use strict';
|
|
|
|
/**
|
|
* Methods for dragging a workspace visually.
|
|
* @class
|
|
*/
|
|
goog.module('Blockly.WorkspaceDragger');
|
|
|
|
const Coordinate = goog.require('Blockly.utils.Coordinate');
|
|
/* eslint-disable-next-line no-unused-vars */
|
|
const WorkspaceSvg = goog.requireType('Blockly.WorkspaceSvg');
|
|
const common = goog.require('Blockly.common');
|
|
|
|
|
|
/**
|
|
* Class for a workspace dragger. It moves the workspace around when it is
|
|
* being dragged by a mouse or touch.
|
|
* Note that the workspace itself manages whether or not it has a drag surface
|
|
* and how to do translations based on that. This simply passes the right
|
|
* commands based on events.
|
|
* @param {!WorkspaceSvg} workspace The workspace to drag.
|
|
* @constructor
|
|
* @alias Blockly.WorkspaceDragger
|
|
*/
|
|
const WorkspaceDragger = function(workspace) {
|
|
/**
|
|
* @type {!WorkspaceSvg}
|
|
* @private
|
|
*/
|
|
this.workspace_ = workspace;
|
|
|
|
/**
|
|
* Whether horizontal scroll is enabled.
|
|
* @type {boolean}
|
|
* @private
|
|
*/
|
|
this.horizontalScrollEnabled_ = this.workspace_.isMovableHorizontally();
|
|
|
|
/**
|
|
* Whether vertical scroll is enabled.
|
|
* @type {boolean}
|
|
* @private
|
|
*/
|
|
this.verticalScrollEnabled_ = this.workspace_.isMovableVertically();
|
|
|
|
/**
|
|
* The scroll position of the workspace at the beginning of the drag.
|
|
* Coordinate system: pixel coordinates.
|
|
* @type {!Coordinate}
|
|
* @protected
|
|
*/
|
|
this.startScrollXY_ = new Coordinate(workspace.scrollX, workspace.scrollY);
|
|
};
|
|
|
|
/**
|
|
* Sever all links from this object.
|
|
* @package
|
|
* @suppress {checkTypes}
|
|
*/
|
|
WorkspaceDragger.prototype.dispose = function() {
|
|
this.workspace_ = null;
|
|
};
|
|
|
|
/**
|
|
* Start dragging the workspace.
|
|
* @package
|
|
*/
|
|
WorkspaceDragger.prototype.startDrag = function() {
|
|
if (common.getSelected()) {
|
|
common.getSelected().unselect();
|
|
}
|
|
this.workspace_.setupDragSurface();
|
|
};
|
|
|
|
/**
|
|
* Finish dragging the workspace and put everything back where it belongs.
|
|
* @param {!Coordinate} currentDragDeltaXY How far the pointer has
|
|
* moved from the position at the start of the drag, in pixel coordinates.
|
|
* @package
|
|
*/
|
|
WorkspaceDragger.prototype.endDrag = function(currentDragDeltaXY) {
|
|
// Make sure everything is up to date.
|
|
this.drag(currentDragDeltaXY);
|
|
this.workspace_.resetDragSurface();
|
|
};
|
|
|
|
/**
|
|
* Move the workspace based on the most recent mouse movements.
|
|
* @param {!Coordinate} currentDragDeltaXY How far the pointer has
|
|
* moved from the position at the start of the drag, in pixel coordinates.
|
|
* @package
|
|
*/
|
|
WorkspaceDragger.prototype.drag = function(currentDragDeltaXY) {
|
|
const newXY = Coordinate.sum(this.startScrollXY_, currentDragDeltaXY);
|
|
|
|
if (this.horizontalScrollEnabled_ && this.verticalScrollEnabled_) {
|
|
this.workspace_.scroll(newXY.x, newXY.y);
|
|
} else if (this.horizontalScrollEnabled_) {
|
|
this.workspace_.scroll(newXY.x, this.workspace_.scrollY);
|
|
} else if (this.verticalScrollEnabled_) {
|
|
this.workspace_.scroll(this.workspace_.scrollX, newXY.y);
|
|
} else {
|
|
throw new TypeError('Invalid state.');
|
|
}
|
|
};
|
|
|
|
exports = WorkspaceDragger;
|