@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
73 lines (70 loc) • 4.09 kB
JavaScript
import { clamp, isNil } from "@visactor/vutils";
import { getRangeOfLinkedComponent } from "./view-utils";
export class ViewZoomMixin {
_formatPinchZoom(e) {
const scale = e.scale;
if (isNil(this._lastScale)) return this._lastScale = scale, e;
const zoomDelta = scale / this._lastScale;
this._lastScale = scale;
const center = e.center;
return e.zoomDelta = zoomDelta, e.zoomX = center.x, e.zoomY = center.y, e;
}
_formatWheelZoom(e) {
if (!e.ctrlKey) return e.zoomDelta = null, e.zoomX = null, e.zoomY = null, e;
const zoomDelta = Math.pow(1.0005, -e.deltaY * Math.pow(16, e.deltaMode));
return e.zoomDelta = zoomDelta, e.zoomX = e.canvasX, e.zoomY = e.canvasY, e;
}
formatZoomEvent(e) {
return e ? "pinch" === e.type ? this._formatPinchZoom(e) : this._formatWheelZoom(e) : e;
}
updateZoomRange(rangeFactor = [ 0, 1 ], range, zoomEvent, zoomOptions) {
var _a;
const {zoomDelta: zoomDelta} = zoomEvent, rangeDelta = Math.abs(rangeFactor[1] - rangeFactor[0]);
if (rangeDelta >= 1 && zoomDelta >= 1) return;
if (rangeDelta <= .001 && zoomDelta <= 1) return;
const value = rangeDelta * (zoomDelta - 1) * (null !== (_a = zoomOptions.rate) && void 0 !== _a ? _a : 1) / 2, start = clamp(rangeFactor[0] - value, 0, 1), end = clamp(rangeFactor[1] + value, 0, 1);
return [ Math.min(start, end), Math.max(start, end) ];
}
_handleZooming(zoomPos, navState, zoomOptions) {
const res = {
needUpdate: !1
};
return navState ? (Object.keys(navState).forEach((dim => {
const {scale: scale, data: data, linkedComponent: linkedComponent, rangeFactor: rangeFactor, getCurrentRange: getCurrentRange} = navState[dim];
if (linkedComponent) res[dim] = this.updateZoomRange(getRangeOfLinkedComponent(linkedComponent), null, zoomPos, zoomOptions); else if (scale) {
const innerScale = scale.getScale(), newRange = this.updateZoomRange(rangeFactor, innerScale, zoomPos, zoomOptions);
newRange && (navState[dim].rangeFactor = newRange, data ? (navState[dim].filterValue = newRange,
data.commit()) : (scale.setRangeFactor(newRange), scale.commit()), res.needUpdate = !0,
res[dim] = newRange);
} else {
const oldRange = (getCurrentRange ? getCurrentRange() : rangeFactor) || [ 0, 1 ], newRange = this.updateZoomRange(oldRange, null, zoomPos, zoomOptions);
res[dim] = newRange || oldRange;
}
})), res) : res;
}
handleZoomStart(e, navState, zoomOptions) {
if (!isNil(e.zoomDelta)) return e.stopPropagation(), e.preventDefault(), zoomOptions && zoomOptions.realtime ? this._handleZooming(e, navState, zoomOptions) : (isNil(this._zoomPos) ? this._zoomPos = {
zoomDelta: e.zoomDelta,
zoomX: e.zoomX,
zoomY: e.zoomY
} : this._zoomPos.zoomDelta *= e.zoomDelta, null);
}
handleZoomEnd(e, navState, zoomOptions) {
this._lastScale = null;
const res = zoomOptions && !1 === zoomOptions.realtime && this._zoomPos ? this._handleZooming(this._zoomPos, navState, zoomOptions) : null;
return this._zoomPos = null, res;
}
handleZoomReset(e, navState, zoomOptions) {
const res = {
needUpdate: !1
};
return navState ? (Object.keys(navState).forEach((dim => {
const {scale: scale, data: data, linkedComponent: linkedComponent} = navState[dim], newRange = [ 0, 1 ];
linkedComponent ? res[dim] = newRange : scale ? (navState[dim].rangeFactor = null,
data ? (navState[dim].filterValue = null, data.commit()) : (scale.setRangeFactor(newRange),
scale.commit()), res.needUpdate = !0, res[dim] = newRange) : (navState[dim].rangeFactor = navState[dim].initRangeFactor,
res[dim] = navState[dim].initRangeFactor);
})), res) : res;
}
}
//# sourceMappingURL=view-zoom-mixin.js.map