@7polo/kityminder-core
Version:
KityMinder Core Implement
195 lines (177 loc) • 6.67 kB
JavaScript
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+-'
}
};
});
});