vmes-flowable
Version:
ceshibao
130 lines (94 loc) • 2.58 kB
JavaScript
import {
append as svgAppend,
attr as svgAttr,
clear as svgClear,
create as svgCreate
} from 'tiny-svg';
import { query as domQuery } from 'min-dom';
import { SPACING, quantize } from '../GridUtil';
import { getMid } from '../../../layout/LayoutUtil';
var GRID_COLOR = '#ccc',
LAYER_NAME = 'djs-grid';
export var GRID_DIMENSIONS = {
width: 100000,
height: 100000
};
export default function Grid(canvas, eventBus) {
this._canvas = canvas;
var self = this;
eventBus.on('diagram.init', function() {
self._init();
});
eventBus.on('gridSnapping.toggle', function(event) {
var active = event.active;
self._setVisible(active);
self._centerGridAroundViewbox();
});
eventBus.on('canvas.viewbox.changed', function(context) {
var viewbox = context.viewbox;
self._centerGridAroundViewbox(viewbox);
});
}
Grid.prototype._init = function() {
var defs = domQuery('defs', this._canvas._svg);
if (!defs) {
defs = svgCreate('defs');
svgAppend(this._canvas._svg, defs);
}
var pattern = this.pattern = svgCreate('pattern');
svgAttr(pattern, {
id: 'djs-grid-pattern',
width: SPACING,
height: SPACING,
patternUnits: 'userSpaceOnUse'
});
var circle = this.circle = svgCreate('circle');
svgAttr(circle, {
cx: 0.5,
cy: 0.5,
r: 0.5,
fill: GRID_COLOR
});
svgAppend(pattern, circle);
svgAppend(defs, pattern);
var grid = this.grid = svgCreate('rect');
svgAttr(grid, {
x: -(GRID_DIMENSIONS.width / 2),
y: -(GRID_DIMENSIONS.height / 2),
width: GRID_DIMENSIONS.width,
height: GRID_DIMENSIONS.height,
fill: 'url(#djs-grid-pattern)'
});
};
Grid.prototype._centerGridAroundViewbox = function(viewbox) {
if (!viewbox) {
viewbox = this._canvas.viewbox();
}
var mid = getMid(viewbox);
svgAttr(this.grid, {
x: -(GRID_DIMENSIONS.width / 2) + quantize(mid.x, SPACING),
y: -(GRID_DIMENSIONS.height / 2) + quantize(mid.y, SPACING)
});
};
Grid.prototype._isVisible = function() {
return this.visible;
};
Grid.prototype._setVisible = function(visible) {
if (visible === this.visible) {
return;
}
this.visible = visible;
var parent = this._getParent();
if (visible) {
svgAppend(parent, this.grid);
} else {
svgClear(parent);
}
};
Grid.prototype._getParent = function() {
return this._canvas.getLayer(LAYER_NAME, -2);
};
Grid.$inject = [
'canvas',
'eventBus'
];