UNPKG

core-graphics

Version:

A core library for creating shape-based graphic editors

217 lines (178 loc) 8.93 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var React = _interopRequireWildcard(_react); var _declarations = require('../declarations'); var _arrow = require('../icons/arrow'); var _arrow2 = _interopRequireDefault(_arrow); var _boundingBox = require('../utils/bounding-box'); var _math = require('../utils/math'); var _editorEvents = require('../editor-state/editor-events'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ARROW_SIZE = 40; function getViewportBB(params) { var viewport = params.viewport; var viewportWidth = params.viewportWidth; var viewportHeight = params.viewportHeight; var x = viewport.x; var y = viewport.y; return { width: viewportWidth, height: viewportHeight, x1: x, y1: y, x2: x + viewportWidth, y2: y + viewportHeight }; } function getArrowPoint(params) { // get min point var viewportBB = (0, _boundingBox.padBBEqual)(-ARROW_SIZE / 2, params.viewportBB); var shapesBBs = params.shapesBBs; var bbCenters = shapesBBs.map(_boundingBox.getBBCenter); var viewportCenter = (0, _boundingBox.getBBCenter)(viewportBB); return (0, _math.getClosestPoint)(bbCenters, viewportCenter); } function _getArrowParams(params) { var viewportBB = (0, _boundingBox.padBBEqual)(-ARROW_SIZE / 2, params.viewportBB); var viewportCenter = (0, _boundingBox.getBBCenter)(viewportBB); var minPoint = getArrowPoint(params); // align arrow var scx = viewportCenter.x; var scy = viewportCenter.y; var vcx = minPoint.x; var vcy = minPoint.y; var dp = { x: vcx - scx, y: vcy - scy }; var angle = Math.atan2(dp.y, dp.x) * (180 / Math.PI); var maxX = viewportBB.width / 2; var maxY = viewportBB.height / 2; var dpImage = { x: dp.x / maxX, y: dp.y / maxY }; var dpNormalized = (0, _math.manhattanNormalizeV)(dpImage); var np = { x: dpNormalized.x * maxX, y: dpNormalized.y * maxY }; return { x: viewportBB.width / 2 + np.x, y: viewportBB.height / 2 + np.y, angle: angle }; } var HelperArrowRenderer = function (_React$Component) { _inherits(HelperArrowRenderer, _React$Component); function HelperArrowRenderer() { _classCallCheck(this, HelperArrowRenderer); return _possibleConstructorReturn(this, Object.getPrototypeOf(HelperArrowRenderer).apply(this, arguments)); } _createClass(HelperArrowRenderer, [{ key: 'getBBs', value: function getBBs() { var _props = this.props; var scene = _props.scene; var shapesDeclarations = _props.shapesDeclarations; var viewport = _props.viewport; var viewportWidth = _props.viewportWidth; var viewportHeight = _props.viewportHeight; var viewportBB = getViewportBB({ viewport: viewport, viewportWidth: viewportWidth, viewportHeight: viewportHeight }); var shapesBBs = (0, _boundingBox.getShapesBoundingBoxes)({ shapesDeclarations: shapesDeclarations, shapes: scene.shapes, ids: scene.shapesOrder }).map(function (indexedBB) { return indexedBB.bb; }); return { viewportBB: viewportBB, shapesBBs: shapesBBs }; } }, { key: 'showArrow', value: function showArrow() { var _this2 = this; var _props2 = this.props; var scene = _props2.scene; var mode = _props2.mode; if ((0, _declarations.isMovingViewportMode)(mode) && scene.shapesOrder.length > 0) { var _ret = function () { var _getBBs = _this2.getBBs(); var viewportBB = _getBBs.viewportBB; var shapesBBs = _getBBs.shapesBBs; // TODO optimize var noShapesVisible = shapesBBs.map(function (bb) { return !(0, _boundingBox.doBoundingBoxesCollide)(bb, viewportBB); }).reduce(function (a, b) { return a && b; }, true); return { v: noShapesVisible }; }(); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } return false; } }, { key: 'getArrowParams', value: function getArrowParams() { return _getArrowParams(this.getBBs()); } }, { key: 'navigateToArrow', value: function navigateToArrow() { var _props3 = this.props; var viewportWidth = _props3.viewportWidth; var viewportHeight = _props3.viewportHeight; var onEditorEvent = _props3.onEditorEvent; var _getArrowPoint = getArrowPoint(this.getBBs()); var x = _getArrowPoint.x; var y = _getArrowPoint.y; var nextViewport = { x: Math.round(x - viewportWidth / 2), y: Math.round(y - viewportHeight / 2) }; onEditorEvent((0, _editorEvents.setViewport)(nextViewport)); } }, { key: 'render', value: function render() { var _this3 = this; if (!this.showArrow()) { return null; } var _getArrowParams2 = this.getArrowParams(); var x = _getArrowParams2.x; var y = _getArrowParams2.y; var angle = _getArrowParams2.angle; return React.createElement( 'g', { transform: 'translate(' + (x + ARROW_SIZE / 2) + ', ' + (y + ARROW_SIZE / 2) + ')' }, React.createElement( 'style', null, '\n .core_graphics__arrow path{ fill: #aaa; }\n .core_graphics__arrow:hover path{ fill: #666; }\n ' ), React.createElement( 'g', { className: 'core_graphics__arrow' }, React.createElement( 'g', { transform: 'rotate(' + (angle + 90) + ' 0 0) translate(-8 -8)' }, React.createElement(_arrow2.default, null) ), React.createElement('rect', { onClick: function onClick() { return _this3.navigateToArrow(); }, style: { cursor: 'pointer!important' }, x: -ARROW_SIZE / 2, y: -ARROW_SIZE / 2, height: ARROW_SIZE, width: ARROW_SIZE, fill: 'transparent' }) ) ); } }]); return HelperArrowRenderer; }(React.Component); exports.default = HelperArrowRenderer;