UNPKG

vue-kityminder-ggg

Version:

百度脑图

159 lines (140 loc) 4.64 kB
var kity = window.kity; // var utils = require('kityminder-core/src/core/utils'); // var Minder = window.kityminder.Minder; // var MinderNode = window.kityminder.Node; var Command = window.kityminder.Command; var Module = window.kityminder.Module; var Renderer = window.kityminder.Render; module.exports = Module.register('imageicon', function() { var self = this; function loadImageSize(url, callback) { var img = document.createElement('img'); img.onload = function() { callback(img.width, img.height); }; img.onerror = function() { callback(null); }; img.src = url; } function fitImageSize(width, height, maxWidth, maxHeight) { var ratio = width / height, fitRatio = maxWidth / maxHeight; // 宽高比大于最大尺寸的宽高比,以宽度为标准适应 if(width > maxWidth && ratio > fitRatio) { width = maxWidth; height = width / ratio; } else if(height > maxHeight) { height = maxHeight; width = height * ratio; } return { width: width | 0, height: height | 0 }; } /** * @command Image * @description 为选中的节点添加图片 * @param {string} url 图片的 URL,设置为 null 移除 * @param {string} title 图片的说明 * @state * 0: 当前有选中的节点 * -1: 当前没有选中的节点 * @return 返回首个选中节点的图片信息,JSON 对象: `{url: url, title: title}` */ var ImageIconCommand = kity.createClass('ImageIconCommand', { base: Command, execute: function(km, url, title) { var nodes = km.getSelectedNodes(); loadImageSize(url, function(width, height) { nodes.forEach(function(n) { var size = fitImageSize( width, height, km.getOption('maxImageWidth'), km.getOption('maxImageHeight')); n.setData('imageicon', url); n.setData('imageTitle', url && title); n.setData('imageSize', url && size); n.render(); }); km.fire('saveScene'); km.layout(300); }); }, queryState: function(km) { var nodes = km.getSelectedNodes(), result = 0; if(nodes.length === 0) { return -1; } nodes.forEach(function(n) { if(n && n.getData('image')) { result = 0; return false; } }); return result; }, queryValue: function(km) { var node = km.getSelectedNode(); return { url: node.getData('image'), title: node.getData('imageTitle') }; } }); var ImageRenderer = kity.createClass('ImageRenderer', { base: Renderer, create: function(node) { return new kity.Image(node.getData('imageicon')); }, shouldRender: function(node) { return node.getData('imageicon') || node.getData('hexType'); }, update: function(image, node, box) { var url = node.getData('imageicon'); var title = node.getData('imageTitle'); var size = node.getData('imageSize'); var spaceTop = node.getStyle('space-top'); var type = node.getData('hexType'); var HEX_WIDTH = self.getOption('hex_width') || 20; var HEX_HEIGHT = self.getOption('hex_height') || 20; var urls = { app: self.getOption('app_url'), project: self.getOption('project_url'), dir: self.getOption('dir_url'), page: self.getOption('page_url') }; if(type && urls[type]) { size = size || {width: HEX_WIDTH, height: HEX_HEIGHT}; url = urls[type] } if(!size ) return; if(title) { image.node.setAttributeNS('http://www.w3.org/1999/xlink', 'title', title); } var x = -1 * size.width ; var y = box.y - spaceTop; image.setUrl(url).setX(x | 0).setY(y | 0).setWidth(size.width | 0).setHeight(size.height | 0); // use kity svg var items = node.rc.getItems(); var group = items.find(a => a.constructor.name === 'Group'); group.setTranslate(2, (size.height - group.getHeight()) / 2 - spaceTop); node.layout(); return new kity.Box(x | 0, y | 0, size.width | 0, size.height | 0); } }); return { 'defaultOptions': { 'hex_width': 20, 'hex_height': 20 }, 'commands': { 'imageicon': ImageIconCommand }, 'renderers': { 'top': ImageRenderer } }; });