@7polo/kityminder-core
Version:
KityMinder Core Implement
111 lines (102 loc) • 4.15 kB
JavaScript
define(function(require, exports, module) {
var kity = require('../core/kity');
var keymap = require('../core/keymap');
var Module = require('../core/module');
var Command = require('../core/command');
Module.register('ImageViewer', function() {
function createEl(name, classNames, children) {
var el = document.createElement(name);
addClass(el, classNames);
children && children.length && children.forEach(function (child) {
el.appendChild(child);
});
return el;
}
function on(el, event, handler) {
el.addEventListener(event, handler);
}
function addClass(el, classNames) {
classNames && classNames.split(' ').forEach(function (className) {
el.classList.add(className);
});
}
function removeClass(el, classNames) {
classNames && classNames.split(' ').forEach(function (className) {
el.classList.remove(className);
});
}
var ImageViewer = kity.createClass('ImageViewer', {
constructor: function () {
var btnClose = createEl('button', 'km-image-viewer-btn km-image-viewer-close');
var btnSource = createEl('button', 'km-image-viewer-btn km-image-viewer-source');
var image = this.image = createEl('img');
var toolbar = this.toolbar = createEl('div', 'km-image-viewer-toolbar', [btnSource, btnClose]);
var container = createEl('div', 'km-image-viewer-container', [image]);
var viewer = this.viewer = createEl('div', 'km-image-viewer', [toolbar, container]);
this.hotkeyHandler = this.hotkeyHandler.bind(this)
on(btnClose, 'click', this.close.bind(this));
on(btnSource, 'click', this.viewSource.bind(this));
on(image, 'click', this.zoomImage.bind(this));
on(viewer, 'contextmenu', this.toggleToolbar.bind(this));
on(document, 'keydown', this.hotkeyHandler);
},
dispose: function () {
this.close();
document.removeEventListener('remove', this.hotkeyHandler);
},
hotkeyHandler: function (e) {
if (!this.actived) {
return;
}
if (e.keyCode === keymap['esc']) {
this.close();
}
},
toggleToolbar: function (e) {
e && e.preventDefault();
this.toolbar.classList.toggle('hidden');
},
zoomImage: function (restore) {
var image = this.image;
if (typeof restore === 'boolean') {
restore && addClass(image, 'limited');
}
else {
image.classList.toggle('limited');
}
},
viewSource: function (src) {
window.open(this.image.src);
},
open: function (src) {
var input = document.querySelector('input');
if (input) {
input.focus();
input.blur();
}
this.image.src = src;
this.zoomImage(true);
document.body.appendChild(this.viewer);
this.actived = true;
},
close: function () {
this.image.src = '';
document.body.removeChild(this.viewer);
this.actived = false;
}
});
return {
init: function() {
this.viewer = new ImageViewer();
},
events: {
'normal.dblclick': function(e) {
var shape = e.kityEvent.targetShape
if (shape.__KityClassName === 'Image' && shape.url) {
this.viewer.open(shape.url);
}
}
}
};
});
});