| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- define(function(require, exports, module) {
- var kity = require('../core/kity');
- var utils = require('../core/utils');
- var Minder = require('../core/minder');
- var MinderNode = require('../core/node');
- var Command = require('../core/command');
- var Module = require('../core/module');
- var Renderer = require('../core/render');
- Module.register('Zoom', function() {
- var me = this;
- var timeline;
- function setTextRendering() {
- var value = me._zoomValue >= 100 ? 'optimize-speed' : 'geometricPrecision';
- me.getRenderContainer().setAttr('text-rendering', value);
- }
- function fixPaperCTM(paper) {
- var node = paper.shapeNode;
- var ctm = node.getCTM();
- var matrix = new kity.Matrix(ctm.a, ctm.b, ctm.c, ctm.d, (ctm.e | 0) + 0.5, (ctm.f | 0) + 0.5);
- node.setAttribute('transform', 'matrix(' + matrix.toString() + ')');
- }
- kity.extendClass(Minder, {
- zoom: function(value) {
- var paper = this.getPaper();
- var viewport = paper.getViewPort();
- viewport.zoom = value / 100;
- viewport.center = {
- x: viewport.center.x,
- y: viewport.center.y
- };
- paper.setViewPort(viewport);
- if (value == 100) fixPaperCTM(paper);
- },
- getZoomValue: function() {
- return this._zoomValue;
- }
- });
- function zoomMinder(minder, value) {
- var paper = minder.getPaper();
- var viewport = paper.getViewPort();
- if (!value) return;
- setTextRendering();
- var duration = minder.getOption('zoomAnimationDuration');
- if (minder.getRoot().getComplex() > 200 || !duration) {
- minder._zoomValue = value;
- minder.zoom(value);
- minder.fire('viewchange');
- } else {
- var animator = new kity.Animator({
- beginValue: minder._zoomValue,
- finishValue: value,
- setter: function(target, value) {
- target.zoom(value);
- }
- });
- minder._zoomValue = value;
- if (timeline) {
- timeline.pause();
- }
- timeline = animator.start(minder, duration, 'easeInOutSine');
- timeline.on('finish', function() {
- minder.fire('viewchange');
- });
- }
- minder.fire('zoom', {
- zoom: value
- });
- }
- /**
- * @command Zoom
- * @description 缩放当前的视野到一定的比例(百分比)
- * @param {number} value 设置的比例,取值 100 则为原尺寸
- * @state
- * 0: 始终可用
- */
- var ZoomCommand = kity.createClass('Zoom', {
- base: Command,
- execute: zoomMinder,
- queryValue: function(minder) {
- return minder._zoomValue;
- }
- });
- /**
- * @command ZoomIn
- * @description 放大当前的视野到下一个比例等级(百分比)
- * @shortcut =
- * @state
- * 0: 如果当前脑图的配置中还有下一个比例等级
- * -1: 其它情况
- */
- var ZoomInCommand = kity.createClass('ZoomInCommand', {
- base: Command,
- execute: function(minder) {
- zoomMinder(minder, this.nextValue(minder));
- },
- queryState: function(minder) {
- return +!this.nextValue(minder);
- },
- nextValue: function(minder) {
- var stack = minder.getOption('zoom'),
- i;
- for (i = 0; i < stack.length; i++) {
- if (stack[i] > minder._zoomValue) return stack[i];
- }
- return 0;
- },
- enableReadOnly: true
- });
- /**
- * @command ZoomOut
- * @description 缩小当前的视野到上一个比例等级(百分比)
- * @shortcut -
- * @state
- * 0: 如果当前脑图的配置中还有上一个比例等级
- * -1: 其它情况
- */
- var ZoomOutCommand = kity.createClass('ZoomOutCommand', {
- base: Command,
- execute: function(minder) {
- zoomMinder(minder, this.nextValue(minder));
- },
- queryState: function(minder) {
- return +!this.nextValue(minder);
- },
- nextValue: function(minder) {
- var stack = minder.getOption('zoom'),
- i;
- for (i = stack.length - 1; i >= 0; i--) {
- if (stack[i] < minder._zoomValue) return stack[i];
- }
- return 0;
- },
- enableReadOnly: true
- });
- return {
- init: function() {
- this._zoomValue = 100;
- this.setDefaultOptions({
- zoom: [10, 20, 50, 100, 200]
- });
- setTextRendering();
- },
- commands: {
- 'zoomin': ZoomInCommand,
- 'zoomout': ZoomOutCommand,
- 'zoom': ZoomCommand
- },
- events: {
- 'normal.mousewheel readonly.mousewheel': function(e) {
- if (!e.originEvent.ctrlKey && !e.originEvent.metaKey) return;
- var delta = e.originEvent.wheelDelta;
- var me = this;
- // 稀释
- if (Math.abs(delta) > 100) {
- clearTimeout(this._wheelZoomTimeout);
- } else {
- return;
- }
- this._wheelZoomTimeout = setTimeout(function() {
- var value;
- var lastValue = me.getPaper()._zoom || 1;
- if (delta > 0) {
- me.execCommand('zoomin');
- } else if (delta < 0) {
- me.execCommand('zoomout');
- }
- }, 100);
-
- e.originEvent.preventDefault();
- }
- },
- commandShortcutKeys: {
- 'zoomin': 'ctrl+=',
- 'zoomout': 'ctrl+-'
- }
- };
- });
- });
|