优化注释,去掉冗余信息

This commit is contained in:
wanglin2 2023-01-10 11:08:55 +08:00
parent e634fee753
commit 0d3c1b7417
49 changed files with 3524 additions and 5135 deletions

View File

@ -53,19 +53,9 @@ const defaultOpt = {
*/ */
} }
/** // 思维导图
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 11:18:47
* @Desc: 思维导图
*/
class MindMap { class MindMap {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 11:19:01
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
// 合并选项 // 合并选项
this.opt = this.handleOpt(merge(defaultOpt, opt)) this.opt = this.handleOpt(merge(defaultOpt, opt))
@ -149,11 +139,7 @@ class MindMap {
}, 0) }, 0)
} }
/** // 配置参数处理
* @Author: 王林
* @Date: 2021-07-01 22:15:22
* @Desc: 配置参数处理
*/
handleOpt(opt) { handleOpt(opt) {
// 检查布局配置 // 检查布局配置
if (!layoutValueList.includes(opt.layout)) { if (!layoutValueList.includes(opt.layout)) {
@ -164,12 +150,7 @@ class MindMap {
return opt return opt
} }
/** // 渲染,部分渲染
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 18:47:29
* @Desc: 渲染部分渲染
*/
render() { render() {
this.batchExecution.push('render', () => { this.batchExecution.push('render', () => {
this.initTheme() this.initTheme()
@ -178,11 +159,7 @@ class MindMap {
}) })
} }
/** // 重新渲染
* @Author: 王林
* @Date: 2021-07-08 22:05:11
* @Desc: 重新渲染
*/
reRender() { reRender() {
this.batchExecution.push('render', () => { this.batchExecution.push('render', () => {
this.draw.clear() this.draw.clear()
@ -192,11 +169,7 @@ class MindMap {
}) })
} }
/** // 容器尺寸变化,调整尺寸
* @Author: 王林
* @Date: 2021-07-11 21:16:52
* @Desc: 容器尺寸变化调整尺寸
*/
resize() { resize() {
this.elRect = this.el.getBoundingClientRect() this.elRect = this.el.getBoundingClientRect()
this.width = this.elRect.width this.width = this.elRect.width
@ -204,38 +177,22 @@ class MindMap {
this.svg.size(this.width, this.height) this.svg.size(this.width, this.height)
} }
/** // 监听事件
* @Author: 王林
* @Date: 2021-04-24 13:25:50
* @Desc: 监听事件
*/
on(event, fn) { on(event, fn) {
this.event.on(event, fn) this.event.on(event, fn)
} }
/** // 触发事件
* @Author: 王林
* @Date: 2021-04-24 13:51:35
* @Desc: 触发事件
*/
emit(event, ...args) { emit(event, ...args) {
this.event.emit(event, ...args) this.event.emit(event, ...args)
} }
/** // 解绑事件
* @Author: 王林
* @Date: 2021-04-24 13:53:54
* @Desc: 解绑事件
*/
off(event, fn) { off(event, fn) {
this.event.off(event, fn) this.event.off(event, fn)
} }
/** // 设置主题
* @Author: 王林
* @Date: 2021-05-05 13:32:43
* @Desc: 设置主题
*/
initTheme() { initTheme() {
// 合并主题配置 // 合并主题配置
this.themeConfig = merge(theme[this.opt.theme], this.opt.themeConfig) this.themeConfig = merge(theme[this.opt.theme], this.opt.themeConfig)
@ -243,70 +200,40 @@ class MindMap {
Style.setBackgroundStyle(this.el, this.themeConfig) Style.setBackgroundStyle(this.el, this.themeConfig)
} }
/** // 设置主题
* @Author: 王林
* @Date: 2021-05-05 13:52:08
* @Desc: 设置主题
*/
setTheme(theme) { setTheme(theme) {
this.renderer.clearAllActive() this.renderer.clearAllActive()
this.opt.theme = theme this.opt.theme = theme
this.reRender() this.reRender()
} }
/** // 获取当前主题
* @Author: 王林
* @Date: 2021-06-25 23:52:37
* @Desc: 获取当前主题
*/
getTheme() { getTheme() {
return this.opt.theme return this.opt.theme
} }
/** // 设置主题配置
* @Author: 王林
* @Date: 2021-05-05 13:50:17
* @Desc: 设置主题配置
*/
setThemeConfig(config) { setThemeConfig(config) {
this.opt.themeConfig = config this.opt.themeConfig = config
this.reRender() this.reRender()
} }
/** // 获取自定义主题配置
* @Author: 王林
* @Date: 2021-08-01 10:38:34
* @Desc: 获取自定义主题配置
*/
getCustomThemeConfig() { getCustomThemeConfig() {
return this.opt.themeConfig return this.opt.themeConfig
} }
/** // 获取某个主题配置值
* @Author: 王林
* @Date: 2021-05-05 14:01:29
* @Desc: 获取某个主题配置值
*/
getThemeConfig(prop) { getThemeConfig(prop) {
return prop === undefined ? this.themeConfig : this.themeConfig[prop] return prop === undefined ? this.themeConfig : this.themeConfig[prop]
} }
/** // 获取当前布局结构
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 16:17:06
* @Desc: 获取当前布局结构
*/
getLayout() { getLayout() {
return this.opt.layout return this.opt.layout
} }
/** // 设置布局结构
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 16:17:33
* @Desc: 设置布局结构
*/
setLayout(layout) { setLayout(layout) {
// 检查布局配置 // 检查布局配置
if (!layoutValueList.includes(layout)) { if (!layoutValueList.includes(layout)) {
@ -317,20 +244,12 @@ class MindMap {
this.render() this.render()
} }
/** // 执行命令
* @Author: 王林
* @Date: 2021-05-04 13:01:00
* @Desc: 执行命令
*/
execCommand(...args) { execCommand(...args) {
this.command.exec(...args) this.command.exec(...args)
} }
/** // 动态设置思维导图数据,纯节点数据
* @Author: 王林
* @Date: 2021-08-03 22:58:12
* @Desc: 动态设置思维导图数据纯节点数据
*/
setData(data) { setData(data) {
this.execCommand('CLEAR_ACTIVE_NODE') this.execCommand('CLEAR_ACTIVE_NODE')
this.command.clearHistory() this.command.clearHistory()
@ -338,12 +257,7 @@ class MindMap {
this.reRender() this.reRender()
} }
/** // 动态设置思维导图数据,包括节点数据、布局、主题、视图
* javascript comment
* @Author: 王林25
* @Date: 2022-09-21 16:39:13
* @Desc: 动态设置思维导图数据包括节点数据布局主题视图
*/
setFullData(data) { setFullData(data) {
if (data.root) { if (data.root) {
this.setData(data.root) this.setData(data.root)
@ -364,12 +278,7 @@ class MindMap {
} }
} }
/** // 获取思维导图数据,节点树、主题、布局等
* javascript comment
* @Author: 王林
* @Date: 2022-09-24 14:42:07
* @Desc: 获取思维导图数据节点树主题布局等
*/
getData(withConfig) { getData(withConfig) {
let nodeData = this.command.getCopyData() let nodeData = this.command.getCopyData()
let data = {} let data = {}
@ -389,21 +298,13 @@ class MindMap {
return simpleDeepClone(data) return simpleDeepClone(data)
} }
/** // 导出
* @Author: 王林
* @Date: 2021-07-01 22:06:38
* @Desc: 导出
*/
async export(...args) { async export(...args) {
let result = await this.doExport.export(...args) let result = await this.doExport.export(...args)
return result return result
} }
/** // 转换位置
* @Author: 王林
* @Date: 2021-07-11 09:20:03
* @Desc: 转换位置
*/
toPos(x, y) { toPos(x, y) {
return { return {
x: x - this.elRect.left, x: x - this.elRect.left,
@ -411,12 +312,7 @@ class MindMap {
} }
} }
/** // 设置只读模式、编辑模式
* javascript comment
* @Author: 王林25
* @Date: 2022-06-08 14:12:38
* @Desc: 设置只读模式编辑模式
*/
setMode(mode) { setMode(mode) {
if (!['readonly', 'edit'].includes(mode)) { if (!['readonly', 'edit'].includes(mode)) {
return return

View File

@ -0,0 +1,32 @@
// 将/** */类型的注释转换为//类型
const path = require('path')
const fs = require('fs')
const entryPath = path.resolve(__dirname, '../src')
const transform = dir => {
let dirs = fs.readdirSync(dir)
dirs.forEach(item => {
let file = path.join(dir, item)
if (fs.statSync(file).isDirectory()) {
transform(file)
} else if (/\.js$/.test(file)) {
rewriteComments(file)
}
})
}
const rewriteComments = file => {
let content = fs.readFileSync(file, 'utf-8')
console.log('当前转换文件:', file)
content = content.replace(/\/\*\*[^/]+\*\//g, str => {
let res = /@Desc:([^\n]+)\n/g.exec(str)
if (res.length > 0) {
return '// ' + res[1]
}
})
fs.writeFileSync(file, content)
}
transform(entryPath)
rewriteComments(path.join(__dirname, '../index.js'))

View File

@ -1,8 +1,4 @@
/** // 在下一个事件循环里执行任务
* @Author: 王林
* @Date: 2021-06-27 13:16:23
* @Desc: 在下一个事件循环里执行任务
*/
const nextTick = function (fn, ctx) { const nextTick = function (fn, ctx) {
let pending = false let pending = false
let timerFunc = null let timerFunc = null
@ -33,28 +29,16 @@ const nextTick = function (fn, ctx) {
} }
} }
/** // 批量执行
* @Author: 王林
* @Date: 2021-06-26 22:40:52
* @Desc: 批量执行
*/
class BatchExecution { class BatchExecution {
/** // 构造函数
* @Author: 王林
* @Date: 2021-06-26 22:41:41
* @Desc: 构造函数
*/
constructor() { constructor() {
this.has = {} this.has = {}
this.queue = [] this.queue = []
this.nextTick = nextTick(this.flush, this) this.nextTick = nextTick(this.flush, this)
} }
/** // 添加任务
* @Author: 王林
* @Date: 2021-06-27 12:54:04
* @Desc: 添加任务
*/
push(name, fn) { push(name, fn) {
if (this.has[name]) { if (this.has[name]) {
return return
@ -67,11 +51,7 @@ class BatchExecution {
this.nextTick() this.nextTick()
} }
/** // 执行队列
* @Author: 王林
* @Date: 2021-06-27 13:09:24
* @Desc: 执行队列
*/
flush() { flush() {
let fns = this.queue.slice(0) let fns = this.queue.slice(0)
this.queue = [] this.queue = []

View File

@ -1,16 +1,8 @@
import { copyRenderTree, simpleDeepClone } from './utils' import { copyRenderTree, simpleDeepClone } from './utils'
/** // 命令类
* @Author: 王林
* @Date: 2021-05-04 13:10:06
* @Desc: 命令类
*/
class Command { class Command {
/** // 构造函数
* @Author: 王林
* @Date: 2021-05-04 13:10:24
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
this.opt = opt this.opt = opt
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
@ -21,22 +13,14 @@ class Command {
this.registerShortcutKeys() this.registerShortcutKeys()
} }
/** // 清空历史数据
* @Author: 王林
* @Date: 2021-08-03 23:06:55
* @Desc: 清空历史数据
*/
clearHistory() { clearHistory() {
this.history = [] this.history = []
this.activeHistoryIndex = 0 this.activeHistoryIndex = 0
this.mindMap.emit('back_forward', 0, 0) this.mindMap.emit('back_forward', 0, 0)
} }
/** // 注册快捷键
* @Author: 王林
* @Date: 2021-08-02 23:23:19
* @Desc: 注册快捷键
*/
registerShortcutKeys() { registerShortcutKeys() {
this.mindMap.keyCommand.addShortcut('Control+z', () => { this.mindMap.keyCommand.addShortcut('Control+z', () => {
this.mindMap.execCommand('BACK') this.mindMap.execCommand('BACK')
@ -46,11 +30,7 @@ class Command {
}) })
} }
/** // 执行命令
* @Author: 王林
* @Date: 2021-05-04 13:12:30
* @Desc: 执行命令
*/
exec(name, ...args) { exec(name, ...args) {
if (this.commands[name]) { if (this.commands[name]) {
this.commands[name].forEach(fn => { this.commands[name].forEach(fn => {
@ -63,11 +43,7 @@ class Command {
} }
} }
/** // 添加命令
* @Author: 王林
* @Date: 2021-05-04 13:13:01
* @Desc: 添加命令
*/
add(name, fn) { add(name, fn) {
if (this.commands[name]) { if (this.commands[name]) {
this.commands[name].push(fn) this.commands[name].push(fn)
@ -76,11 +52,7 @@ class Command {
} }
} }
/** // 移除命令
* @Author: 王林
* @Date: 2021-07-15 23:02:41
* @Desc: 移除命令
*/
remove(name, fn) { remove(name, fn) {
if (!this.commands[name]) { if (!this.commands[name]) {
return return
@ -98,11 +70,7 @@ class Command {
} }
} }
/** // 添加回退数据
* @Author: 王林
* @Date: 2021-05-04 14:35:43
* @Desc: 添加回退数据
*/
addHistory() { addHistory() {
let data = this.getCopyData() let data = this.getCopyData()
this.history.push(simpleDeepClone(data)) this.history.push(simpleDeepClone(data))
@ -115,11 +83,7 @@ class Command {
) )
} }
/** // 回退
* @Author: 王林
* @Date: 2021-07-11 22:34:53
* @Desc: 回退
*/
back(step = 1) { back(step = 1) {
if (this.activeHistoryIndex - step >= 0) { if (this.activeHistoryIndex - step >= 0) {
this.activeHistoryIndex -= step this.activeHistoryIndex -= step
@ -132,12 +96,7 @@ class Command {
} }
} }
/** // 前进
* javascript comment
* @Author: 王林25
* @Date: 2021-07-12 10:45:31
* @Desc: 前进
*/
forward(step = 1) { forward(step = 1) {
let len = this.history.length let len = this.history.length
if (this.activeHistoryIndex + step <= len - 1) { if (this.activeHistoryIndex + step <= len - 1) {
@ -147,11 +106,7 @@ class Command {
} }
} }
/** // 获取渲染树数据副本
* @Author: 王林
* @Date: 2021-05-04 15:02:58
* @Desc: 获取渲染树数据副本
*/
getCopyData() { getCopyData() {
return copyRenderTree({}, this.mindMap.renderer.renderTree) return copyRenderTree({}, this.mindMap.renderer.renderTree)
} }

View File

@ -1,18 +1,9 @@
import { bfsWalk, throttle } from './utils' import { bfsWalk, throttle } from './utils'
import Base from './layouts/Base' import Base from './layouts/Base'
/** // 节点拖动类
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 17:38:55
* @Desc: 节点拖动类
*/
class Drag extends Base { class Drag extends Base {
/** // 构造函数
* @Author: 王林
* @Date: 2021-07-10 22:35:16
* @Desc: 构造函数
*/
constructor({ mindMap }) { constructor({ mindMap }) {
super(mindMap.renderer) super(mindMap.renderer)
this.mindMap = mindMap this.mindMap = mindMap
@ -20,12 +11,7 @@ class Drag extends Base {
this.bindEvent() this.bindEvent()
} }
/** // 复位
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 19:33:56
* @Desc: 复位
*/
reset() { reset() {
// 当前拖拽节点 // 当前拖拽节点
this.node = null this.node = null
@ -58,11 +44,7 @@ class Drag extends Base {
this.mouseMoveY = 0 this.mouseMoveY = 0
} }
/** // 绑定事件
* @Author: 王林
* @Date: 2021-07-10 22:36:36
* @Desc: 绑定事件
*/
bindEvent() { bindEvent() {
this.checkOverlapNode = throttle(this.checkOverlapNode, 300, this) this.checkOverlapNode = throttle(this.checkOverlapNode, 300, this)
this.mindMap.on('node_mousedown', (node, e) => { this.mindMap.on('node_mousedown', (node, e) => {
@ -110,12 +92,7 @@ class Drag extends Base {
this.mindMap.on('mouseup', this.onMouseup) this.mindMap.on('mouseup', this.onMouseup)
} }
/** // 鼠标松开事件
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 19:38:02
* @Desc: 鼠标松开事件
*/
onMouseup(e) { onMouseup(e) {
if (!this.isMousedown) { if (!this.isMousedown) {
return return
@ -156,12 +133,7 @@ class Drag extends Base {
this.reset() this.reset()
} }
/** // 创建克隆节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 19:34:53
* @Desc: 创建克隆节点
*/
createCloneNode() { createCloneNode() {
if (!this.clone) { if (!this.clone) {
// 节点 // 节点
@ -182,12 +154,7 @@ class Drag extends Base {
} }
} }
/** // 移除克隆节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 19:35:16
* @Desc: 移除克隆节点
*/
removeCloneNode() { removeCloneNode() {
if (!this.clone) { if (!this.clone) {
return return
@ -197,12 +164,7 @@ class Drag extends Base {
this.placeholder.remove() this.placeholder.remove()
} }
/** // 拖动中
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 18:53:47
* @Desc: 拖动中
*/
onMove(x, y) { onMove(x, y) {
if (!this.isMousedown) { if (!this.isMousedown) {
return return
@ -228,11 +190,7 @@ class Drag extends Base {
this.checkOverlapNode() this.checkOverlapNode()
} }
/** // 检测重叠节点
* @Author: 王林
* @Date: 2021-07-11 10:20:43
* @Desc: 检测重叠节点
*/
checkOverlapNode() { checkOverlapNode() {
if (!this.drawTransform) { if (!this.drawTransform) {
return return

View File

@ -1,18 +1,8 @@
import EventEmitter from 'eventemitter3' import EventEmitter from 'eventemitter3'
/** // 事件类
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:53:09
* @Desc: 事件类
*/
class Event extends EventEmitter { class Event extends EventEmitter {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:53:25
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
super() super()
this.opt = opt this.opt = opt
@ -34,12 +24,7 @@ class Event extends EventEmitter {
this.bind() this.bind()
} }
/** // 绑定函数上下文
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:52:24
* @Desc: 绑定函数上下文
*/
bindFn() { bindFn() {
this.onDrawClick = this.onDrawClick.bind(this) this.onDrawClick = this.onDrawClick.bind(this)
this.onMousedown = this.onMousedown.bind(this) this.onMousedown = this.onMousedown.bind(this)
@ -51,12 +36,7 @@ class Event extends EventEmitter {
this.onKeyup = this.onKeyup.bind(this) this.onKeyup = this.onKeyup.bind(this)
} }
/** // 绑定事件
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:53:43
* @Desc: 绑定事件
*/
bind() { bind() {
this.mindMap.svg.on('click', this.onDrawClick) this.mindMap.svg.on('click', this.onDrawClick)
this.mindMap.el.addEventListener('mousedown', this.onMousedown) this.mindMap.el.addEventListener('mousedown', this.onMousedown)
@ -73,12 +53,7 @@ class Event extends EventEmitter {
window.addEventListener('keyup', this.onKeyup) window.addEventListener('keyup', this.onKeyup)
} }
/** // 解绑事件
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:40:51
* @Desc: 解绑事件
*/
unbind() { unbind() {
this.mindMap.svg.off('click', this.onDrawClick) this.mindMap.svg.off('click', this.onDrawClick)
this.mindMap.el.removeEventListener('mousedown', this.onMousedown) this.mindMap.el.removeEventListener('mousedown', this.onMousedown)
@ -89,30 +64,17 @@ class Event extends EventEmitter {
window.removeEventListener('keyup', this.onKeyup) window.removeEventListener('keyup', this.onKeyup)
} }
/** // 画布的单击事件
* @Author: 王林
* @Date: 2021-04-24 13:19:39
* @Desc: 画布的单击事件
*/
onDrawClick(e) { onDrawClick(e) {
this.emit('draw_click', e) this.emit('draw_click', e)
} }
/** // svg画布的鼠标按下事件
* @Author: 王林
* @Date: 2021-07-16 13:37:30
* @Desc: svg画布的鼠标按下事件
*/
onSvgMousedown(e) { onSvgMousedown(e) {
this.emit('svg_mousedown', e) this.emit('svg_mousedown', e)
} }
/** // 鼠标按下事件
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:17:35
* @Desc: 鼠标按下事件
*/
onMousedown(e) { onMousedown(e) {
// e.preventDefault() // e.preventDefault()
// 鼠标左键 // 鼠标左键
@ -124,12 +86,7 @@ class Event extends EventEmitter {
this.emit('mousedown', e, this) this.emit('mousedown', e, this)
} }
/** // 鼠标移动事件
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:18:32
* @Desc: 鼠标移动事件
*/
onMousemove(e) { onMousemove(e) {
// e.preventDefault() // e.preventDefault()
this.mousemovePos.x = e.clientX this.mousemovePos.x = e.clientX
@ -142,23 +99,13 @@ class Event extends EventEmitter {
} }
} }
/** // 鼠标松开事件
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:18:57
* @Desc: 鼠标松开事件
*/
onMouseup(e) { onMouseup(e) {
this.isLeftMousedown = false this.isLeftMousedown = false
this.emit('mouseup', e, this) this.emit('mouseup', e, this)
} }
/** // 鼠标滚动
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:46:27
* @Desc: 鼠标滚动
*/
onMousewheel(e) { onMousewheel(e) {
e.stopPropagation() e.stopPropagation()
e.preventDefault() e.preventDefault()
@ -171,22 +118,13 @@ class Event extends EventEmitter {
this.emit('mousewheel', e, dir, this) this.emit('mousewheel', e, dir, this)
} }
/** // 鼠标右键菜单事件
* @Author: 王林
* @Date: 2021-07-10 22:34:13
* @Desc: 鼠标右键菜单事件
*/
onContextmenu(e) { onContextmenu(e) {
e.preventDefault() e.preventDefault()
this.emit('contextmenu', e) this.emit('contextmenu', e)
} }
/** // 按键松开事件
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 11:12:11
* @Desc: 按键松开事件
*/
onKeyup(e) { onKeyup(e) {
this.emit('keyup', e) this.emit('keyup', e)
} }

View File

@ -3,27 +3,15 @@ import JsPDF from 'jspdf'
import { SVG } from '@svgdotjs/svg.js' import { SVG } from '@svgdotjs/svg.js'
const URL = window.URL || window.webkitURL || window const URL = window.URL || window.webkitURL || window
/** // 导出类
* @Author: 王林
* @Date: 2021-07-01 22:05:16
* @Desc: 导出类
*/
class Export { class Export {
/** // 构造函数
* @Author: 王林
* @Date: 2021-07-01 22:05:42
* @Desc: 构造函数
*/
constructor(opt) { constructor(opt) {
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
this.exportPadding = this.mindMap.opt.exportPadding this.exportPadding = this.mindMap.opt.exportPadding
} }
/** // 导出
* @Author: 王林
* @Date: 2021-07-02 07:44:06
* @Desc: 导出
*/
async export(type, isDownload = true, name = '思维导图', ...args) { async export(type, isDownload = true, name = '思维导图', ...args) {
if (this[type]) { if (this[type]) {
let result = await this[type](name, ...args) let result = await this[type](name, ...args)
@ -36,11 +24,7 @@ class Export {
} }
} }
/** // 获取svg数据
* @Author: 王林
* @Date: 2021-07-04 14:57:40
* @Desc: 获取svg数据
*/
async getSvgData() { async getSvgData() {
let { svg, svgHTML } = this.mindMap.miniMap.getMiniMap() let { svg, svgHTML } = this.mindMap.miniMap.getMiniMap()
// 把图片的url转换成data:url类型否则导出会丢失图片 // 把图片的url转换成data:url类型否则导出会丢失图片
@ -57,11 +41,7 @@ class Export {
} }
} }
/** // svg转png
* @Author: 王林
* @Date: 2021-07-04 15:25:19
* @Desc: svg转png
*/
svgToPng(svgSrc) { svgToPng(svgSrc) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const img = new Image() const img = new Image()
@ -99,11 +79,7 @@ class Export {
}) })
} }
/** // 在canvas上绘制思维导图背景
* @Author: 王林
* @Date: 2021-07-04 15:32:07
* @Desc: 在canvas上绘制思维导图背景
*/
drawBackgroundToCanvas(ctx, width, height) { drawBackgroundToCanvas(ctx, width, height) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let { let {
@ -139,10 +115,8 @@ class Export {
}) })
} }
// 导出为png
/** /**
* @Author: 王林
* @Date: 2021-07-01 22:09:51
* @Desc: 导出为png
* 方法1.把svg的图片都转化成data:url格式再转换 * 方法1.把svg的图片都转化成data:url格式再转换
* 方法2.把svg的图片提取出来再挨个绘制到canvas里最后一起转换 * 方法2.把svg的图片提取出来再挨个绘制到canvas里最后一起转换
*/ */
@ -160,12 +134,7 @@ class Export {
return imgDataUrl return imgDataUrl
} }
/** // 导出为pdf
* javascript comment
* @Author: 王林25
* @Date: 2022-08-08 19:23:08
* @Desc: 导出为pdf
*/
async pdf(name) { async pdf(name) {
let img = await this.png() let img = await this.png()
let pdf = new JsPDF('', 'pt', 'a4') let pdf = new JsPDF('', 'pt', 'a4')
@ -197,11 +166,7 @@ class Export {
image.src = img image.src = img
} }
/** // 在svg上绘制思维导图背景
* @Author: 王林
* @Date: 2021-07-04 15:32:07
* @Desc: 在svg上绘制思维导图背景
*/
drawBackgroundToSvg(svg) { drawBackgroundToSvg(svg) {
return new Promise(async resolve => { return new Promise(async resolve => {
let { let {
@ -223,11 +188,7 @@ class Export {
}) })
} }
/** // 导出为svg
* @Author: 王林
* @Date: 2021-07-04 14:54:07
* @Desc: 导出为svg
*/
async svg(name) { async svg(name) {
let { node } = await this.getSvgData() let { node } = await this.getSvgData()
node.first().before(SVG(`<title>${name}</title>`)) node.first().before(SVG(`<title>${name}</title>`))
@ -240,11 +201,7 @@ class Export {
return URL.createObjectURL(blob) return URL.createObjectURL(blob)
} }
/** // 导出为json
* @Author: 王林
* @Date: 2021-08-03 22:19:17
* @Desc: 导出为json
*/
json(name, withConfig = true) { json(name, withConfig = true) {
let data = this.mindMap.getData(withConfig) let data = this.mindMap.getData(withConfig)
let str = JSON.stringify(data) let str = JSON.stringify(data)
@ -252,11 +209,7 @@ class Export {
return URL.createObjectURL(blob) return URL.createObjectURL(blob)
} }
/** // 专有文件其实就是json文件
* @Author: 王林
* @Date: 2021-08-03 22:24:24
* @Desc: 专有文件其实就是json文件
*/
smm(name, withConfig) { smm(name, withConfig) {
return this.json(name, withConfig) return this.json(name, withConfig)
} }

View File

@ -1,15 +1,7 @@
import { keyMap } from './utils/keyMap' import { keyMap } from './utils/keyMap'
/** // 快捷按键、命令处理类
* @Author: 王林
* @Date: 2021-04-24 15:20:46
* @Desc: 快捷按键命令处理类
*/
export default class KeyCommand { export default class KeyCommand {
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-24 15:21:32
* @Desc: 构造函数
*/
constructor(opt) { constructor(opt) {
this.opt = opt this.opt = opt
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
@ -21,51 +13,29 @@ export default class KeyCommand {
this.bindEvent() this.bindEvent()
} }
/** // 暂停快捷键响应
* @Author: 王林
* @Date: 2022-08-14 08:57:55
* @Desc: 暂停快捷键响应
*/
pause() { pause() {
this.isPause = true this.isPause = true
} }
/** // 恢复快捷键响应
* @Author: 王林
* @Date: 2022-08-14 08:58:43
* @Desc: 恢复快捷键响应
*/
recovery() { recovery() {
this.isPause = false this.isPause = false
} }
/** // 保存当前注册的快捷键数据,然后清空快捷键数据
* javascript comment
* @Author: 王林25
* @Date: 2022-08-16 16:29:01
* @Desc: 保存当前注册的快捷键数据然后清空快捷键数据
*/
save() { save() {
this.shortcutMapCache = this.shortcutMap this.shortcutMapCache = this.shortcutMap
this.shortcutMap = {} this.shortcutMap = {}
} }
/** // 恢复保存的快捷键数据,然后清空缓存数据
* javascript comment
* @Author: 王林25
* @Date: 2022-08-16 16:29:38
* @Desc: 恢复保存的快捷键数据然后清空缓存数据
*/
restore() { restore() {
this.shortcutMap = this.shortcutMapCache this.shortcutMap = this.shortcutMapCache
this.shortcutMapCache = {} this.shortcutMapCache = {}
} }
/** // 绑定事件
* @Author: 王林
* @Date: 2021-04-24 15:23:22
* @Desc: 绑定事件
*/
bindEvent() { bindEvent() {
window.addEventListener('keydown', e => { window.addEventListener('keydown', e => {
if (this.isPause) { if (this.isPause) {
@ -83,11 +53,7 @@ export default class KeyCommand {
}) })
} }
/** // 检查键值是否符合
* @Author: 王林
* @Date: 2021-04-24 19:24:53
* @Desc: 检查键值是否符合
*/
checkKey(e, key) { checkKey(e, key) {
let o = this.getOriginEventCodeArr(e) let o = this.getOriginEventCodeArr(e)
let k = this.getKeyCodeArr(key) let k = this.getKeyCodeArr(key)
@ -107,11 +73,7 @@ export default class KeyCommand {
return true return true
} }
/** // 获取事件对象里的键值数组
* @Author: 王林
* @Date: 2021-04-24 19:15:19
* @Desc: 获取事件对象里的键值数组
*/
getOriginEventCodeArr(e) { getOriginEventCodeArr(e) {
let arr = [] let arr = []
if (e.ctrlKey || e.metaKey) { if (e.ctrlKey || e.metaKey) {
@ -129,11 +91,7 @@ export default class KeyCommand {
return arr return arr
} }
/** // 获取快捷键对应的键值数组
* @Author: 王林
* @Date: 2021-04-24 19:40:11
* @Desc: 获取快捷键对应的键值数组
*/
getKeyCodeArr(key) { getKeyCodeArr(key) {
let keyArr = key.split(/\s*\+\s*/) let keyArr = key.split(/\s*\+\s*/)
let arr = [] let arr = []
@ -143,10 +101,8 @@ export default class KeyCommand {
return arr return arr
} }
// 添加快捷键命令
/** /**
* @Author: 王林
* @Date: 2021-04-24 15:23:00
* @Desc: 添加快捷键命令
* Enter * Enter
* Tab | Insert * Tab | Insert
* Shift + a * Shift + a
@ -161,12 +117,7 @@ export default class KeyCommand {
}) })
} }
/** // 移除快捷键命令
* javascript comment
* @Author: 王林25
* @Date: 2021-07-27 14:06:16
* @Desc: 移除快捷键命令
*/
removeShortcut(key, fn) { removeShortcut(key, fn) {
key.split(/\s*\|\s*/).forEach(item => { key.split(/\s*\|\s*/).forEach(item => {
if (this.shortcutMap[item]) { if (this.shortcutMap[item]) {
@ -185,11 +136,7 @@ export default class KeyCommand {
}) })
} }
/** // 获取指定快捷键的处理函数
* @Author: 王林
* @Date: 2022-08-14 08:49:58
* @Desc: 获取指定快捷键的处理函数
*/
getShortcutFn(key) { getShortcutFn(key) {
let res = [] let res = []
key.split(/\s*\|\s*/).forEach(item => { key.split(/\s*\|\s*/).forEach(item => {

View File

@ -1,19 +1,9 @@
import { isKey } from './utils/keyMap' import { isKey } from './utils/keyMap'
import { bfsWalk } from './utils' import { bfsWalk } from './utils'
/** // 键盘导航类
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 11:06:50
* @Desc: 键盘导航类
*/
export default class KeyboardNavigation { export default class KeyboardNavigation {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 11:07:24
* @Desc: 构造函数
*/
constructor(opt) { constructor(opt) {
this.opt = opt this.opt = opt
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
@ -21,12 +11,7 @@ export default class KeyboardNavigation {
this.mindMap.on('keyup', this.onKeyup) this.mindMap.on('keyup', this.onKeyup)
} }
/** // 处理按键事件
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 14:12:27
* @Desc: 处理按键事件
*/
onKeyup(e) { onKeyup(e) {
;['Left', 'Up', 'Right', 'Down'].forEach(dir => { ;['Left', 'Up', 'Right', 'Down'].forEach(dir => {
if (isKey(e, dir)) { if (isKey(e, dir)) {
@ -41,12 +26,7 @@ export default class KeyboardNavigation {
}) })
} }
/** // 聚焦到下一个节点
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 14:12:39
* @Desc: 聚焦到下一个节点
*/
focus(dir) { focus(dir) {
// 当前聚焦的节点 // 当前聚焦的节点
let currentActiveNode = this.mindMap.renderer.activeNodeList[0] let currentActiveNode = this.mindMap.renderer.activeNodeList[0]
@ -99,12 +79,7 @@ export default class KeyboardNavigation {
} }
} }
/** // 1.简单算法
* javascript comment
* @Author: 王林25
* @Date: 2022-12-12 16:22:54
* @Desc: 1.简单算法
*/
getFocusNodeBySimpleAlgorithm({ getFocusNodeBySimpleAlgorithm({
currentActiveNode, currentActiveNode,
currentActiveNodeRect, currentActiveNodeRect,
@ -143,12 +118,7 @@ export default class KeyboardNavigation {
}) })
} }
/** // 2.阴影算法
* javascript comment
* @Author: 王林25
* @Date: 2022-12-12 16:24:54
* @Desc: 2.阴影算法
*/
getFocusNodeByShadowAlgorithm({ getFocusNodeByShadowAlgorithm({
currentActiveNode, currentActiveNode,
currentActiveNodeRect, currentActiveNodeRect,
@ -187,12 +157,7 @@ export default class KeyboardNavigation {
}) })
} }
/** // 3.区域算法
* javascript comment
* @Author: 王林25
* @Date: 2022-12-13 16:15:36
* @Desc: 3.区域算法
*/
getFocusNodeByAreaAlgorithm({ getFocusNodeByAreaAlgorithm({
currentActiveNode, currentActiveNode,
currentActiveNodeRect, currentActiveNodeRect,
@ -229,12 +194,7 @@ export default class KeyboardNavigation {
}) })
} }
/** // 获取节点的位置信息
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 14:12:50
* @Desc: 获取节点的位置信息
*/
getNodeRect(node) { getNodeRect(node) {
let { scaleX, scaleY, translateX, translateY } = let { scaleX, scaleY, translateX, translateY } =
this.mindMap.draw.transform() this.mindMap.draw.transform()
@ -247,12 +207,7 @@ export default class KeyboardNavigation {
} }
} }
/** // 获取两个节点的距离
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 14:13:04
* @Desc: 获取两个节点的距离
*/
getDistance(node1Rect, node2Rect) { getDistance(node1Rect, node2Rect) {
let center1 = this.getCenter(node1Rect) let center1 = this.getCenter(node1Rect)
let center2 = this.getCenter(node2Rect) let center2 = this.getCenter(node2Rect)
@ -261,12 +216,7 @@ export default class KeyboardNavigation {
) )
} }
/** // 获取节点的中心点
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 14:13:11
* @Desc: 获取节点的中心点
*/
getCenter({ left, right, top, bottom }) { getCenter({ left, right, top, bottom }) {
return { return {
x: (left + right) / 2, x: (left + right) / 2,

View File

@ -1,11 +1,6 @@
// 小地图类 // 小地图类
class MiniMap { class MiniMap {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:00:45
* @Desc: 构造函数
*/
constructor(opt) { constructor(opt) {
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
this.isMousedown = false this.isMousedown = false
@ -19,12 +14,7 @@ class MiniMap {
} }
} }
/** // 获取小地图相关数据
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:00:43
* @Desc: 获取小地图相关数据
*/
getMiniMap() { getMiniMap() {
const svg = this.mindMap.svg const svg = this.mindMap.svg
const draw = this.mindMap.draw const draw = this.mindMap.draw
@ -61,11 +51,8 @@ class MiniMap {
} }
} }
// 计算小地图的渲染数据
/** /**
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:05:51
* @Desc: 计算小地图的渲染数据
* boxWidth小地图容器的宽度 * boxWidth小地图容器的宽度
* boxHeight小地图容器的高度 * boxHeight小地图容器的高度
*/ */
@ -124,12 +111,7 @@ class MiniMap {
} }
} }
/** // 小地图鼠标按下事件
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:22:40
* @Desc: 小地图鼠标按下事件
*/
onMousedown(e) { onMousedown(e) {
this.isMousedown = true this.isMousedown = true
this.mousedownPos = { this.mousedownPos = {
@ -144,12 +126,7 @@ class MiniMap {
} }
} }
/** // 小地图鼠标移动事件
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:22:55
* @Desc: 小地图鼠标移动事件
*/
onMousemove(e, sensitivityNum = 5) { onMousemove(e, sensitivityNum = 5) {
if (!this.isMousedown) { if (!this.isMousedown) {
return return
@ -161,12 +138,7 @@ class MiniMap {
this.mindMap.view.translateYTo(oy * sensitivityNum + this.startViewPos.y) this.mindMap.view.translateYTo(oy * sensitivityNum + this.startViewPos.y)
} }
/** // 小地图鼠标松开事件
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:23:01
* @Desc: 小地图鼠标松开事件
*/
onMouseup() { onMouseup() {
this.isMousedown = false this.isMousedown = false
} }

View File

@ -5,19 +5,9 @@ import { Image, SVG, Circle, A, G, Rect, Text } from '@svgdotjs/svg.js'
import btnsSvg from './svg/btns' import btnsSvg from './svg/btns'
import iconsSvg from './svg/icons' import iconsSvg from './svg/icons'
/** // 节点类
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 11:26:00
* @Desc: 节点类
*/
class Node { class Node {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 11:26:17
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
// 节点数据 // 节点数据
this.nodeData = this.handleData(opt.data || {}) this.nodeData = this.handleData(opt.data || {})
@ -118,11 +108,7 @@ class Node {
this._top = val this._top = val
} }
/** // 更新主题配置
* @Author: 王林
* @Date: 2021-07-12 07:40:47
* @Desc: 更新主题配置
*/
updateThemeConfig() { updateThemeConfig() {
// 主题配置 // 主题配置
this.themeConfig = this.mindMap.themeConfig this.themeConfig = this.mindMap.themeConfig
@ -130,11 +116,7 @@ class Node {
this.style.updateThemeConfig(this.themeConfig) this.style.updateThemeConfig(this.themeConfig)
} }
/** // 复位部分布局时会重新设置的数据
* @Author: 王林
* @Date: 2021-07-05 23:11:39
* @Desc: 复位部分布局时会重新设置的数据
*/
reset() { reset() {
this.children = [] this.children = []
this.parent = null this.parent = null
@ -144,11 +126,7 @@ class Node {
this.top = 0 this.top = 0
} }
/** // 处理数据
* @Author: 王林
* @Date: 2021-06-20 10:12:31
* @Desc: 处理数据
*/
handleData(data) { handleData(data) {
data.data.expand = data.data.expand === false ? false : true data.data.expand = data.data.expand === false ? false : true
data.data.isActive = data.data.isActive === true ? true : false data.data.isActive = data.data.isActive === true ? true : false
@ -156,22 +134,12 @@ class Node {
return data return data
} }
/** // 检查节点是否存在自定义数据
* javascript comment
* @Author: 王林25
* @Date: 2022-08-02 19:53:40
* @Desc: 检查节点是否存在自定义数据
*/
hasCustomPosition() { hasCustomPosition() {
return this.customLeft !== undefined && this.customTop !== undefined return this.customLeft !== undefined && this.customTop !== undefined
} }
/** // 检查节点是否存在自定义位置的祖先节点
* javascript comment
* @Author: 王林25
* @Date: 2022-08-04 09:06:56
* @Desc: 检查节点是否存在自定义位置的祖先节点
*/
ancestorHasCustomPosition() { ancestorHasCustomPosition() {
let node = this let node = this
while (node) { while (node) {
@ -183,21 +151,12 @@ class Node {
return false return false
} }
/** // 添加子节点
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 15:55:04
* @Desc: 添加子节点
*/
addChildren(node) { addChildren(node) {
this.children.push(node) this.children.push(node)
} }
/** // 创建节点的各个内容对象数据
* @Author: 王林
* @Date: 2021-07-06 22:08:09
* @Desc: 创建节点的各个内容对象数据
*/
createNodeData() { createNodeData() {
this._imgData = this.createImgNode() this._imgData = this.createImgNode()
this._iconData = this.createIconNode() this._iconData = this.createIconNode()
@ -208,11 +167,7 @@ class Node {
this.createGeneralizationNode() this.createGeneralizationNode()
} }
/** // 解绑所有事件
* @Author: 王林
* @Date: 2021-07-10 09:20:02
* @Desc: 解绑所有事件
*/
removeAllEvent() { removeAllEvent() {
if (this._noteData) { if (this._noteData) {
this._noteData.node.off(['mouseover', 'mouseout']) this._noteData.node.off(['mouseover', 'mouseout'])
@ -231,11 +186,7 @@ class Node {
} }
} }
/** // 移除节点内容
* @Author: 王林
* @Date: 2021-07-07 21:27:24
* @Desc: 移除节点内容
*/
removeAllNode() { removeAllNode() {
// 节点内的内容 // 节点内的内容
;[ ;[
@ -269,12 +220,7 @@ class Node {
this.removeGeneralization() this.removeGeneralization()
} }
/** // 计算节点的宽高
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 09:46:23
* @Desc: 计算节点的宽高
*/
getSize() { getSize() {
this.removeAllNode() this.removeAllNode()
this.createNodeData() this.createNodeData()
@ -286,12 +232,7 @@ class Node {
return changed return changed
} }
/** // 计算节点尺寸信息
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:52:17
* @Desc: 计算节点尺寸信息
*/
getNodeRect() { getNodeRect() {
// 宽高 // 宽高
let imgContentWidth = 0 let imgContentWidth = 0
@ -358,12 +299,7 @@ class Node {
} }
} }
/** // 创建图片节点
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 14:06:17
* @Desc: 创建图片节点
*/
createImgNode() { createImgNode() {
let img = this.nodeData.data.image let img = this.nodeData.data.image
if (!img) { if (!img) {
@ -384,12 +320,7 @@ class Node {
} }
} }
/** // 获取图片显示宽高
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 10:12:51
* @Desc: 获取图片显示宽高
*/
getImgShowSize() { getImgShowSize() {
return resizeImgSize( return resizeImgSize(
this.nodeData.data.imageSize.width, this.nodeData.data.imageSize.width,
@ -399,12 +330,7 @@ class Node {
) )
} }
/** // 创建icon节点
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 14:10:48
* @Desc: 创建icon节点
*/
createIconNode() { createIconNode() {
let _data = this.nodeData.data let _data = this.nodeData.data
if (!_data.icon || _data.icon.length <= 0) { if (!_data.icon || _data.icon.length <= 0) {
@ -420,12 +346,7 @@ class Node {
}) })
} }
/** // 创建文本节点
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 14:08:56
* @Desc: 创建文本节点
*/
createTextNode() { createTextNode() {
let g = new G() let g = new G()
let fontSize = this.getStyle( let fontSize = this.getStyle(
@ -452,11 +373,7 @@ class Node {
} }
} }
/** // 创建超链接节点
* @Author: 王林
* @Date: 2021-06-20 15:28:54
* @Desc: 创建超链接节点
*/
createHyperlinkNode() { createHyperlinkNode() {
let { hyperlink, hyperlinkTitle } = this.nodeData.data let { hyperlink, hyperlinkTitle } = this.nodeData.data
if (!hyperlink) { if (!hyperlink) {
@ -486,11 +403,7 @@ class Node {
} }
} }
/** // 创建标签节点
* @Author: 王林
* @Date: 2021-06-20 19:49:15
* @Desc: 创建标签节点
*/
createTagNode() { createTagNode() {
let tagData = this.nodeData.data.tag let tagData = this.nodeData.data.tag
if (!tagData || tagData.length <= 0) { if (!tagData || tagData.length <= 0) {
@ -516,11 +429,7 @@ class Node {
return nodes return nodes
} }
/** // 创建备注节点
* @Author: 王林
* @Date: 2021-06-20 21:19:36
* @Desc: 创建备注节点
*/
createNoteNode() { createNoteNode() {
if (!this.nodeData.data.note) { if (!this.nodeData.data.note) {
return null return null
@ -577,12 +486,7 @@ class Node {
} }
} }
/** // 获取节点形状
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 22:02:07
* @Desc: 获取节点形状
*/
getShape() { getShape() {
// 节点使用功能横线风格的话不支持设置形状,直接使用默认的矩形 // 节点使用功能横线风格的话不支持设置形状,直接使用默认的矩形
return this.themeConfig.nodeUseLineStyle return this.themeConfig.nodeUseLineStyle
@ -590,12 +494,7 @@ class Node {
: this.style.getStyle('shape', false, false) : this.style.getStyle('shape', false, false)
} }
/** // 定位节点内容
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 11:10:11
* @Desc: 定位节点内容
*/
layout() { layout() {
let { width, textContentItemMargin } = this let { width, textContentItemMargin } = this
let { paddingY } = this.getPaddingVale() let { paddingY } = this.getPaddingVale()
@ -719,11 +618,7 @@ class Node {
}) })
} }
/** // 激活节点
* @Author: 王林
* @Date: 2021-07-10 16:44:22
* @Desc: 激活节点
*/
active(e) { active(e) {
if (this.mindMap.opt.readonly) { if (this.mindMap.opt.readonly) {
return return
@ -739,11 +634,7 @@ class Node {
this.mindMap.emit('node_active', this, this.renderer.activeNodeList) this.mindMap.emit('node_active', this, this.renderer.activeNodeList)
} }
/** // 渲染节点到画布,会移除旧的,创建新的
* @Author: 王林
* @Date: 2021-07-04 20:20:09
* @Desc: 渲染节点到画布会移除旧的创建新的
*/
renderNode() { renderNode() {
// 连线 // 连线
this.renderLine() this.renderLine()
@ -753,11 +644,7 @@ class Node {
this.layout() this.layout()
} }
/** // 更新节点
* @Author: 王林
* @Date: 2021-07-04 22:47:01
* @Desc: 更新节点
*/
update(layout = false) { update(layout = false) {
if (!this.group) { if (!this.group) {
return return
@ -798,12 +685,7 @@ class Node {
} }
} }
/** // 递归渲染
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 13:55:58
* @Desc: 递归渲染
*/
render(callback = () => {}) { render(callback = () => {}) {
// 节点 // 节点
if (this.initRender) { if (this.initRender) {
@ -844,11 +726,7 @@ class Node {
} }
} }
/** // 递归删除
* @Author: 王林
* @Date: 2021-07-10 09:24:55
* @Desc: 递归删除
*/
remove() { remove() {
this.initRender = true this.initRender = true
this.removeAllEvent() this.removeAllEvent()
@ -866,12 +744,7 @@ class Node {
} }
} }
/** // 隐藏节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 18:39:14
* @Desc: 隐藏节点
*/
hide() { hide() {
this.group.hide() this.group.hide()
this.hideGeneralization() this.hideGeneralization()
@ -891,12 +764,7 @@ class Node {
} }
} }
/** // 显示节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-23 18:39:14
* @Desc: 显示节点
*/
show() { show() {
if (!this.group) { if (!this.group) {
return return
@ -919,11 +787,7 @@ class Node {
} }
} }
/** // 连线
* @Author: 王林
* @Date: 2021-04-10 22:01:53
* @Desc: 连线
*/
renderLine(deep = false) { renderLine(deep = false) {
if (this.nodeData.data.expand === false) { if (this.nodeData.data.expand === false) {
return return
@ -959,12 +823,7 @@ class Node {
} }
} }
/** // 设置连线样式
* javascript comment
* @Author: flydreame
* @Date: 2022-09-17 12:41:29
* @Desc: 设置连线样式
*/
styleLine(line, node) { styleLine(line, node) {
let width = let width =
node.getSelfInhertStyle('lineWidth') || node.getStyle('lineWidth', true) node.getSelfInhertStyle('lineWidth') || node.getStyle('lineWidth', true)
@ -980,11 +839,7 @@ class Node {
}) })
} }
/** // 移除连线
* @Author: 王林
* @Date: 2021-07-10 16:40:21
* @Desc: 移除连线
*/
removeLine() { removeLine() {
this._lines.forEach(line => { this._lines.forEach(line => {
line.remove() line.remove()
@ -992,21 +847,12 @@ class Node {
this._lines = [] this._lines = []
} }
/** // 检查是否存在概要
* javascript comment
* @Author: 王林25
* @Date: 2022-08-01 09:27:30
* @Desc: 检查是否存在概要
*/
checkHasGeneralization() { checkHasGeneralization() {
return !!this.nodeData.data.generalization return !!this.nodeData.data.generalization
} }
/** // 创建概要节点
* @Author: 王林
* @Date: 2022-07-31 09:41:28
* @Desc: 创建概要节点
*/
createGeneralizationNode() { createGeneralizationNode() {
if (this.isGeneralization || !this.checkHasGeneralization()) { if (this.isGeneralization || !this.checkHasGeneralization()) {
return return
@ -1034,22 +880,13 @@ class Node {
} }
} }
/** // 更新概要节点
* javascript comment
* @Author: 王林25
* @Date: 2022-08-01 15:38:52
* @Desc: 更新概要节点
*/
updateGeneralization() { updateGeneralization() {
this.removeGeneralization() this.removeGeneralization()
this.createGeneralizationNode() this.createGeneralizationNode()
} }
/** // 渲染概要节点
* @Author: 王林
* @Date: 2022-07-30 08:35:51
* @Desc: 渲染概要节点
*/
renderGeneralization() { renderGeneralization() {
if (this.isGeneralization) { if (this.isGeneralization) {
return return
@ -1074,11 +911,7 @@ class Node {
this._generalizationNode.render() this._generalizationNode.render()
} }
/** // 删除概要节点
* @Author: 王林
* @Date: 2022-07-30 13:11:27
* @Desc: 删除概要节点
*/
removeGeneralization() { removeGeneralization() {
if (this._generalizationLine) { if (this._generalizationLine) {
this._generalizationLine.remove() this._generalizationLine.remove()
@ -1098,12 +931,7 @@ class Node {
} }
} }
/** // 隐藏概要节点
* javascript comment
* @Author: 王林25
* @Date: 2022-08-01 09:56:46
* @Desc: 隐藏概要节点
*/
hideGeneralization() { hideGeneralization() {
if (this._generalizationLine) { if (this._generalizationLine) {
this._generalizationLine.hide() this._generalizationLine.hide()
@ -1113,12 +941,7 @@ class Node {
} }
} }
/** // 显示概要节点
* javascript comment
* @Author: 王林25
* @Date: 2022-08-01 09:57:42
* @Desc: 显示概要节点
*/
showGeneralization() { showGeneralization() {
if (this._generalizationLine) { if (this._generalizationLine) {
this._generalizationLine.show() this._generalizationLine.show()
@ -1128,11 +951,7 @@ class Node {
} }
} }
/** // 创建或更新展开收缩按钮内容
* @Author: 王林
* @Date: 2021-07-10 17:59:14
* @Desc: 创建或更新展开收缩按钮内容
*/
updateExpandBtnNode() { updateExpandBtnNode() {
if (this._expandBtn) { if (this._expandBtn) {
this._expandBtn.clear() this._expandBtn.clear()
@ -1151,12 +970,7 @@ class Node {
if (this._expandBtn) this._expandBtn.add(fillNode).add(node) if (this._expandBtn) this._expandBtn.add(fillNode).add(node)
} }
/** // 更新展开收缩按钮位置
* javascript comment
* @Author: 王林25
* @Date: 2021-07-12 18:18:13
* @Desc: 更新展开收缩按钮位置
*/
updateExpandBtnPos() { updateExpandBtnPos() {
if (!this._expandBtn) { if (!this._expandBtn) {
return return
@ -1164,11 +978,7 @@ class Node {
this.renderer.layout.renderExpandBtn(this, this._expandBtn) this.renderer.layout.renderExpandBtn(this, this._expandBtn)
} }
/** // 展开收缩按钮
* @Author: 王林
* @Date: 2021-04-11 19:47:01
* @Desc: 展开收缩按钮
*/
renderExpandBtn() { renderExpandBtn() {
if ( if (
!this.nodeData.children || !this.nodeData.children ||
@ -1205,11 +1015,7 @@ class Node {
this.updateExpandBtnPos() this.updateExpandBtnPos()
} }
/** // 移除展开收缩按钮
* @Author: 王林
* @Date: 2021-07-11 13:26:00
* @Desc: 移除展开收缩按钮
*/
removeExpandBtn() { removeExpandBtn() {
if (this._expandBtn) { if (this._expandBtn) {
this._expandBtn.off(['mouseover', 'mouseout', 'click']) this._expandBtn.off(['mouseover', 'mouseout', 'click'])
@ -1219,12 +1025,7 @@ class Node {
} }
} }
/** // 检测当前节点是否是某个节点的祖先节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-25 09:51:37
* @Desc: 检测当前节点是否是某个节点的祖先节点
*/
isParent(node) { isParent(node) {
if (this === node) { if (this === node) {
return false return false
@ -1239,12 +1040,7 @@ class Node {
return false return false
} }
/** // 检测当前节点是否是某个节点的兄弟节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-25 10:32:34
* @Desc: 检测当前节点是否是某个节点的兄弟节点
*/
isBrother(node) { isBrother(node) {
if (!this.parent || this === node) { if (!this.parent || this === node) {
return false return false
@ -1254,11 +1050,7 @@ class Node {
}) })
} }
/** // 获取padding值
* @Author: 王林
* @Date: 2021-06-20 22:51:57
* @Desc: 获取padding值
*/
getPaddingVale() { getPaddingVale() {
return { return {
paddingX: this.getStyle('paddingX', true, this.nodeData.data.isActive), paddingX: this.getStyle('paddingX', true, this.nodeData.data.isActive),
@ -1266,32 +1058,18 @@ class Node {
} }
} }
/** // 获取某个样式
* @Author: 王林
* @Date: 2021-05-04 21:48:49
* @Desc: 获取某个样式
*/
getStyle(prop, root, isActive) { getStyle(prop, root, isActive) {
let v = this.style.merge(prop, root, isActive) let v = this.style.merge(prop, root, isActive)
return v === undefined ? '' : v return v === undefined ? '' : v
} }
/** // 获取自定义样式
* javascript comment
* @Author: flydreame
* @Date: 2022-09-17 11:21:15
* @Desc: 获取自定义样式
*/
getSelfStyle(prop) { getSelfStyle(prop) {
return this.style.getSelfStyle(prop) return this.style.getSelfStyle(prop)
} }
/** // 获取最近一个存在自身自定义样式的祖先节点的自定义样式
* javascript comment
* @Author: flydreame
* @Date: 2022-09-17 11:21:26
* @Desc: 获取最近一个存在自身自定义样式的祖先节点的自定义样式
*/
getParentSelfStyle(prop) { getParentSelfStyle(prop) {
if (this.parent) { if (this.parent) {
return ( return (
@ -1301,12 +1079,7 @@ class Node {
return null return null
} }
/** // 获取自身可继承的自定义样式
* javascript comment
* @Author: flydreame
* @Date: 2022-09-17 12:15:30
* @Desc: 获取自身可继承的自定义样式
*/
getSelfInhertStyle(prop) { getSelfInhertStyle(prop) {
return ( return (
this.getSelfStyle(prop) || // 自身 this.getSelfStyle(prop) || // 自身
@ -1314,93 +1087,52 @@ class Node {
) // 父级 ) // 父级
} }
/** // 修改某个样式
* @Author: 王林
* @Date: 2021-05-04 22:18:07
* @Desc: 修改某个样式
*/
setStyle(prop, value, isActive) { setStyle(prop, value, isActive) {
this.mindMap.execCommand('SET_NODE_STYLE', this, prop, value, isActive) this.mindMap.execCommand('SET_NODE_STYLE', this, prop, value, isActive)
} }
/** // 获取数据
* @Author: 王林
* @Date: 2021-06-22 22:04:02
* @Desc: 获取数据
*/
getData(key) { getData(key) {
return key ? this.nodeData.data[key] || '' : this.nodeData.data return key ? this.nodeData.data[key] || '' : this.nodeData.data
} }
/** // 设置数据
* @Author: 王林
* @Date: 2021-06-22 22:12:01
* @Desc: 设置数据
*/
setData(data = {}) { setData(data = {}) {
this.mindMap.execCommand('SET_NODE_DATA', this, data) this.mindMap.execCommand('SET_NODE_DATA', this, data)
} }
/** // 设置文本
* @Author: 王林
* @Date: 2021-07-10 08:41:28
* @Desc: 设置文本
*/
setText(text) { setText(text) {
this.mindMap.execCommand('SET_NODE_TEXT', this, text) this.mindMap.execCommand('SET_NODE_TEXT', this, text)
} }
/** // 设置图片
* @Author: 王林
* @Date: 2021-07-10 08:42:19
* @Desc: 设置图片
*/
setImage(imgData) { setImage(imgData) {
this.mindMap.execCommand('SET_NODE_IMAGE', this, imgData) this.mindMap.execCommand('SET_NODE_IMAGE', this, imgData)
} }
/** // 设置图标
* @Author: 王林
* @Date: 2021-07-10 08:47:29
* @Desc: 设置图标
*/
setIcon(icons) { setIcon(icons) {
this.mindMap.execCommand('SET_NODE_ICON', this, icons) this.mindMap.execCommand('SET_NODE_ICON', this, icons)
} }
/** // 设置超链接
* @Author: 王林
* @Date: 2021-07-10 08:50:41
* @Desc: 设置超链接
*/
setHyperlink(link, title) { setHyperlink(link, title) {
this.mindMap.execCommand('SET_NODE_HYPERLINK', this, link, title) this.mindMap.execCommand('SET_NODE_HYPERLINK', this, link, title)
} }
/** // 设置备注
* @Author: 王林
* @Date: 2021-07-10 08:53:24
* @Desc: 设置备注
*/
setNote(note) { setNote(note) {
this.mindMap.execCommand('SET_NODE_NOTE', this, note) this.mindMap.execCommand('SET_NODE_NOTE', this, note)
} }
/** // 设置标签
* @Author: 王林
* @Date: 2021-07-10 08:55:08
* @Desc: 设置标签
*/
setTag(tag) { setTag(tag) {
this.mindMap.execCommand('SET_NODE_TAG', this, tag) this.mindMap.execCommand('SET_NODE_TAG', this, tag)
} }
/** // 设置形状
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 21:47:45
* @Desc: 设置形状
*/
setShape(shape) { setShape(shape) {
this.mindMap.execCommand('SET_NODE_SHAPE', this, shape) this.mindMap.execCommand('SET_NODE_SHAPE', this, shape)
} }

View File

@ -20,19 +20,9 @@ const layouts = {
organizationStructure: OrganizationStructure organizationStructure: OrganizationStructure
} }
/** // 渲染
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 16:25:07
* @Desc: 渲染
*/
class Render { class Render {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 16:25:32
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
this.opt = opt this.opt = opt
this.mindMap = opt.mindMap this.mindMap = opt.mindMap
@ -58,12 +48,7 @@ class Render {
this.registerShortcutKeys() this.registerShortcutKeys()
} }
/** // 设置布局结构
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 16:20:07
* @Desc: 设置布局结构
*/
setLayout() { setLayout() {
this.layout = new ( this.layout = new (
layouts[this.mindMap.opt.layout] layouts[this.mindMap.opt.layout]
@ -72,11 +57,7 @@ class Render {
)(this) )(this)
} }
/** // 绑定事件
* @Author: 王林
* @Date: 2021-06-20 10:34:06
* @Desc: 绑定事件
*/
bindEvent() { bindEvent() {
// 点击事件 // 点击事件
this.mindMap.on('draw_click', () => { this.mindMap.on('draw_click', () => {
@ -87,11 +68,7 @@ class Render {
}) })
} }
/** // 注册命令
* @Author: 王林
* @Date: 2021-05-04 13:19:06
* @Desc: 注册命令
*/
registerCommands() { registerCommands() {
// 全选 // 全选
this.selectAll = this.selectAll.bind(this) this.selectAll = this.selectAll.bind(this)
@ -192,11 +169,7 @@ class Render {
this.mindMap.command.add('SET_NODE_SHAPE', this.setNodeShape) this.mindMap.command.add('SET_NODE_SHAPE', this.setNodeShape)
} }
/** // 注册快捷键
* @Author: 王林
* @Date: 2021-07-11 16:55:44
* @Desc: 注册快捷键
*/
registerShortcutKeys() { registerShortcutKeys() {
// 插入下级节点 // 插入下级节点
this.mindMap.keyCommand.addShortcut('Tab', () => { this.mindMap.keyCommand.addShortcut('Tab', () => {
@ -240,12 +213,7 @@ class Render {
// 复制节点、剪切节点、粘贴节点的快捷键需开发者自行注册实现可参考demo // 复制节点、剪切节点、粘贴节点的快捷键需开发者自行注册实现可参考demo
} }
/** // 开启文字编辑,会禁用回车键和删除键相关快捷键防止冲突
* javascript comment
* @Author: 王林25
* @Date: 2022-05-09 10:43:52
* @Desc: 开启文字编辑会禁用回车键和删除键相关快捷键防止冲突
*/
startTextEdit() { startTextEdit() {
this.mindMap.keyCommand.save() this.mindMap.keyCommand.save()
// this.mindMap.keyCommand.removeShortcut('Del|Backspace') // this.mindMap.keyCommand.removeShortcut('Del|Backspace')
@ -253,12 +221,7 @@ class Render {
// this.mindMap.keyCommand.removeShortcut('Enter', this.insertNodeWrap) // this.mindMap.keyCommand.removeShortcut('Enter', this.insertNodeWrap)
} }
/** // 结束文字编辑,会恢复回车键和删除键相关快捷键
* javascript comment
* @Author: 王林25
* @Date: 2022-05-09 10:45:11
* @Desc: 结束文字编辑会恢复回车键和删除键相关快捷键
*/
endTextEdit() { endTextEdit() {
this.mindMap.keyCommand.restore() this.mindMap.keyCommand.restore()
// this.mindMap.keyCommand.addShortcut('Del|Backspace', this.removeNodeWrap) // this.mindMap.keyCommand.addShortcut('Del|Backspace', this.removeNodeWrap)
@ -266,12 +229,7 @@ class Render {
// this.mindMap.keyCommand.addShortcut('Enter', this.insertNodeWrap) // this.mindMap.keyCommand.addShortcut('Enter', this.insertNodeWrap)
} }
/** // 渲染
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 16:27:55
* @Desc: 渲染
*/
render() { render() {
if (this.reRender) { if (this.reRender) {
this.clearActive() this.clearActive()
@ -285,11 +243,7 @@ class Render {
this.mindMap.emit('node_active', null, this.activeNodeList) this.mindMap.emit('node_active', null, this.activeNodeList)
} }
/** // 清除当前激活的节点
* @Author: 王林
* @Date: 2021-04-12 22:45:01
* @Desc: 清除当前激活的节点
*/
clearActive() { clearActive() {
this.activeNodeList.forEach(item => { this.activeNodeList.forEach(item => {
this.setNodeActive(item, false) this.setNodeActive(item, false)
@ -297,11 +251,7 @@ class Render {
this.activeNodeList = [] this.activeNodeList = []
} }
/** // 清除当前所有激活节点,并会触发事件
* @Author: 王林
* @Date: 2021-08-03 23:14:34
* @Desc: 清除当前所有激活节点并会触发事件
*/
clearAllActive() { clearAllActive() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -310,11 +260,7 @@ class Render {
this.mindMap.emit('node_active', null, []) this.mindMap.emit('node_active', null, [])
} }
/** // 添加节点到激活列表里
* @Author: 王林
* @Date: 2021-07-11 10:54:00
* @Desc: 添加节点到激活列表里
*/
addActiveNode(node) { addActiveNode(node) {
let index = this.findActiveNodeIndex(node) let index = this.findActiveNodeIndex(node)
if (index === -1) { if (index === -1) {
@ -322,11 +268,7 @@ class Render {
} }
} }
/** // 在激活列表里移除某个节点
* @Author: 王林
* @Date: 2021-07-10 10:04:04
* @Desc: 在激活列表里移除某个节点
*/
removeActiveNode(node) { removeActiveNode(node) {
let index = this.findActiveNodeIndex(node) let index = this.findActiveNodeIndex(node)
if (index === -1) { if (index === -1) {
@ -335,22 +277,14 @@ class Render {
this.activeNodeList.splice(index, 1) this.activeNodeList.splice(index, 1)
} }
/** // 检索某个节点在激活列表里的索引
* @Author: 王林
* @Date: 2021-07-11 10:55:23
* @Desc: 检索某个节点在激活列表里的索引
*/
findActiveNodeIndex(node) { findActiveNodeIndex(node) {
return this.activeNodeList.findIndex(item => { return this.activeNodeList.findIndex(item => {
return item === node return item === node
}) })
} }
/** // 获取节点在同级里的索引位置
* @Author: 王林
* @Date: 2021-05-04 13:46:08
* @Desc: 获取节点在同级里的索引位置
*/
getNodeIndex(node) { getNodeIndex(node) {
return node.parent return node.parent
? node.parent.children.findIndex(item => { ? node.parent.children.findIndex(item => {
@ -359,11 +293,7 @@ class Render {
: 0 : 0
} }
/** // 全选
* @Author: 王林
* @Date: 2021-08-04 23:54:52
* @Desc: 全选
*/
selectAll() { selectAll() {
walk( walk(
this.root, this.root,
@ -384,11 +314,7 @@ class Render {
) )
} }
/** // 回退
* @Author: 王林
* @Date: 2021-07-11 22:34:12
* @Desc: 回退
*/
back(step) { back(step) {
this.clearAllActive() this.clearAllActive()
let data = this.mindMap.command.back(step) let data = this.mindMap.command.back(step)
@ -398,12 +324,7 @@ class Render {
} }
} }
/** // 前进
* javascript comment
* @Author: 王林25
* @Date: 2021-07-12 10:44:51
* @Desc: 前进
*/
forward(step) { forward(step) {
this.clearAllActive() this.clearAllActive()
let data = this.mindMap.command.forward(step) let data = this.mindMap.command.forward(step)
@ -413,11 +334,7 @@ class Render {
} }
} }
/** // 插入同级节点,多个节点只会操作第一个节点
* @Author: 王林
* @Date: 2021-05-04 13:19:54
* @Desc: 插入同级节点多个节点只会操作第一个节点
*/
insertNode() { insertNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -443,11 +360,7 @@ class Render {
} }
} }
/** // 插入子节点
* @Author: 王林
* @Date: 2021-05-04 13:31:02
* @Desc: 插入子节点
*/
insertChildNode() { insertChildNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -477,11 +390,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 上移节点,多个节点只会操作第一个节点
* @Author: 王林
* @Date: 2021-07-14 23:34:14
* @Desc: 上移节点多个节点只会操作第一个节点
*/
upNode() { upNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -508,11 +417,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 下移节点,多个节点只会操作第一个节点
* @Author: 王林
* @Date: 2021-07-14 23:34:18
* @Desc: 下移节点多个节点只会操作第一个节点
*/
downNode() { downNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -539,12 +444,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 将节点移动到另一个节点的前面
* javascript comment
* @Author: 王林25
* @Date: 2021-11-25 10:51:34
* @Desc: 将节点移动到另一个节点的前面
*/
insertBefore(node, exist) { insertBefore(node, exist) {
if (node.isRoot) { if (node.isRoot) {
return return
@ -575,12 +475,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 将节点移动到另一个节点的后面
* javascript comment
* @Author: 王林25
* @Date: 2021-11-25 10:51:34
* @Desc: 将节点移动到另一个节点的后面
*/
insertAfter(node, exist) { insertAfter(node, exist) {
if (node.isRoot) { if (node.isRoot) {
return return
@ -612,11 +507,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 移除节点
* @Author: 王林
* @Date: 2021-05-04 13:40:39
* @Desc: 移除节点
*/
removeNode() { removeNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -648,11 +539,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 移除某个指定节点
* @Author: 王林
* @Date: 2021-07-15 22:46:27
* @Desc: 移除某个指定节点
*/
removeOneNode(node) { removeOneNode(node) {
let index = this.getNodeIndex(node) let index = this.getNodeIndex(node)
node.remove() node.remove()
@ -660,12 +547,7 @@ class Render {
node.parent.nodeData.children.splice(index, 1) node.parent.nodeData.children.splice(index, 1)
} }
/** // 复制节点,多个节点只会操作第一个节点
* javascript comment
* @Author: 王林25
* @Date: 2021-07-15 09:53:23
* @Desc: 复制节点多个节点只会操作第一个节点
*/
copyNode() { copyNode() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -673,11 +555,7 @@ class Render {
return copyNodeTree({}, this.activeNodeList[0], true) return copyNodeTree({}, this.activeNodeList[0], true)
} }
/** // 剪切节点,多个节点只会操作第一个节点
* @Author: 王林
* @Date: 2021-07-15 22:36:45
* @Desc: 剪切节点多个节点只会操作第一个节点
*/
cutNode(callback) { cutNode(callback) {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -696,12 +574,7 @@ class Render {
} }
} }
/** // 移动一个节点作为另一个节点的子节点
* javascript comment
* @Author: 王林25
* @Date: 2021-11-24 16:54:01
* @Desc: 移动一个节点作为另一个节点的子节点
*/
moveNodeTo(node, toNode) { moveNodeTo(node, toNode) {
if (node.isRoot) { if (node.isRoot) {
return return
@ -714,11 +587,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 粘贴节点到节点
* @Author: 王林
* @Date: 2021-07-15 20:09:39
* @Desc: 粘贴节点到节点
*/
pasteNode(data) { pasteNode(data) {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -729,11 +598,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 设置节点样式
* @Author: 王林
* @Date: 2021-07-08 21:54:30
* @Desc: 设置节点样式
*/
setNodeStyle(node, prop, value, isActive) { setNodeStyle(node, prop, value, isActive) {
let data = {} let data = {}
if (isActive) { if (isActive) {
@ -755,11 +620,7 @@ class Render {
} }
} }
/** // 设置节点是否激活
* @Author: 王林
* @Date: 2021-07-08 22:13:03
* @Desc: 设置节点是否激活
*/
setNodeActive(node, active) { setNodeActive(node, active) {
this.setNodeData(node, { this.setNodeData(node, {
isActive: active isActive: active
@ -767,11 +628,7 @@ class Render {
node.renderNode() node.renderNode()
} }
/** // 设置节点是否展开
* @Author: 王林
* @Date: 2021-07-10 16:52:41
* @Desc: 设置节点是否展开
*/
setNodeExpand(node, expand) { setNodeExpand(node, expand) {
this.setNodeData(node, { this.setNodeData(node, {
expand expand
@ -794,11 +651,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 展开所有
* @Author: 王林
* @Date: 2021-07-15 23:23:37
* @Desc: 展开所有
*/
expandAllNode() { expandAllNode() {
walk( walk(
this.renderTree, this.renderTree,
@ -816,11 +669,7 @@ class Render {
this.mindMap.reRender() this.mindMap.reRender()
} }
/** // 收起所有
* @Author: 王林
* @Date: 2021-07-15 23:27:14
* @Desc: 收起所有
*/
unexpandAllNode() { unexpandAllNode() {
walk( walk(
this.renderTree, this.renderTree,
@ -839,12 +688,7 @@ class Render {
this.mindMap.reRender() this.mindMap.reRender()
} }
/** // 展开到指定层级
* javascript comment
* @Author: 王林25
* @Date: 2022-09-23 16:31:27
* @Desc: 展开到指定层级
*/
expandToLevel(level) { expandToLevel(level) {
walk( walk(
this.renderTree, this.renderTree,
@ -861,11 +705,7 @@ class Render {
this.mindMap.reRender() this.mindMap.reRender()
} }
/** // 切换激活节点的展开状态
* @Author: 王林
* @Date: 2022-08-14 09:18:40
* @Desc: 切换激活节点的展开状态
*/
toggleActiveExpand() { toggleActiveExpand() {
this.activeNodeList.forEach(node => { this.activeNodeList.forEach(node => {
if (node.nodeData.children.length <= 0) { if (node.nodeData.children.length <= 0) {
@ -875,11 +715,7 @@ class Render {
}) })
} }
/** // 切换节点展开状态
* @Author: 王林
* @Date: 2021-07-11 17:15:33
* @Desc: 切换节点展开状态
*/
toggleNodeExpand(node) { toggleNodeExpand(node) {
this.mindMap.execCommand( this.mindMap.execCommand(
'SET_NODE_EXPAND', 'SET_NODE_EXPAND',
@ -888,22 +724,14 @@ class Render {
) )
} }
/** // 设置节点文本
* @Author: 王林
* @Date: 2021-07-09 22:04:19
* @Desc: 设置节点文本
*/
setNodeText(node, text) { setNodeText(node, text) {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
text text
}) })
} }
/** // 设置节点图片
* @Author: 王林
* @Date: 2021-07-10 08:37:40
* @Desc: 设置节点图片
*/
setNodeImage(node, { url, title, width, height }) { setNodeImage(node, { url, title, width, height }) {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
image: url, image: url,
@ -915,22 +743,14 @@ class Render {
}) })
} }
/** // 设置节点图标
* @Author: 王林
* @Date: 2021-07-10 08:44:06
* @Desc: 设置节点图标
*/
setNodeIcon(node, icons) { setNodeIcon(node, icons) {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
icon: icons icon: icons
}) })
} }
/** // 设置节点超链接
* @Author: 王林
* @Date: 2021-07-10 08:49:33
* @Desc: 设置节点超链接
*/
setNodeHyperlink(node, link, title = '') { setNodeHyperlink(node, link, title = '') {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
hyperlink: link, hyperlink: link,
@ -938,33 +758,21 @@ class Render {
}) })
} }
/** // 设置节点备注
* @Author: 王林
* @Date: 2021-07-10 08:52:59
* @Desc: 设置节点备注
*/
setNodeNote(node, note) { setNodeNote(node, note) {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
note note
}) })
} }
/** // 设置节点标签
* @Author: 王林
* @Date: 2021-07-10 08:54:53
* @Desc: 设置节点标签
*/
setNodeTag(node, tag) { setNodeTag(node, tag) {
this.setNodeDataRender(node, { this.setNodeDataRender(node, {
tag tag
}) })
} }
/** // 添加节点概要
* @Author: 王林
* @Date: 2022-07-30 20:52:42
* @Desc: 添加节点概要
*/
addGeneralization(data) { addGeneralization(data) {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -983,11 +791,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 删除节点概要
* @Author: 王林
* @Date: 2022-07-30 21:16:33
* @Desc: 删除节点概要
*/
removeGeneralization() { removeGeneralization() {
if (this.activeNodeList.length <= 0) { if (this.activeNodeList.length <= 0) {
return return
@ -1004,12 +808,7 @@ class Render {
this.mindMap.render() this.mindMap.render()
} }
/** // 设置节点自定义位置
* javascript comment
* @Author: 王林25
* @Date: 2022-08-02 19:04:24
* @Desc: 设置节点自定义位置
*/
setNodeCustomPosition(node, left = undefined, top = undefined) { setNodeCustomPosition(node, left = undefined, top = undefined) {
let nodeList = [node] || this.activeNodeList let nodeList = [node] || this.activeNodeList
nodeList.forEach(item => { nodeList.forEach(item => {
@ -1020,12 +819,7 @@ class Render {
}) })
} }
/** // 一键整理布局,即去除自定义位置
* javascript comment
* @Author: 王林25
* @Date: 2022-08-02 20:02:50
* @Desc: 一键整理布局即去除自定义位置
*/
resetLayout() { resetLayout() {
walk( walk(
this.root, this.root,
@ -1046,12 +840,7 @@ class Render {
) )
} }
/** // 设置节点形状
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 21:44:01
* @Desc: 设置节点形状
*/
setNodeShape(node, shape) { setNodeShape(node, shape) {
if (!shape || !shapeList.includes(shape)) { if (!shape || !shapeList.includes(shape)) {
return return
@ -1062,22 +851,14 @@ class Render {
}) })
} }
/** // 更新节点数据
* @Author: 王林
* @Date: 2021-05-04 14:19:48
* @Desc: 更新节点数据
*/
setNodeData(node, data) { setNodeData(node, data) {
Object.keys(data).forEach(key => { Object.keys(data).forEach(key => {
node.nodeData.data[key] = data[key] node.nodeData.data[key] = data[key]
}) })
} }
/** // 设置节点数据,并判断是否渲染
* @Author: 王林
* @Date: 2021-07-10 08:45:48
* @Desc: 设置节点数据并判断是否渲染
*/
setNodeDataRender(node, data) { setNodeDataRender(node, data) {
this.setNodeData(node, data) this.setNodeData(node, data)
let changed = node.getSize() let changed = node.getSize()
@ -1091,12 +872,7 @@ class Render {
} }
} }
/** // 移动节点到画布中心
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 11:46:57
* @Desc: 移动节点到画布中心
*/
moveNodeToCenter(node) { moveNodeToCenter(node) {
let halfWidth = this.mindMap.width / 2 let halfWidth = this.mindMap.width / 2
let halfHeight = this.mindMap.height / 2 let halfHeight = this.mindMap.height / 2

View File

@ -1,17 +1,9 @@
import { bfsWalk, throttle } from './utils' import { bfsWalk, throttle } from './utils'
/** // 选择节点类
* @Author: 王林
* @Date: 2021-07-10 22:34:51
* @Desc: 选择节点类
*/
class Select { class Select {
/** // 构造函数
* @Author: 王林
* @Date: 2021-07-10 22:35:16
* @Desc: 构造函数
*/
constructor({ mindMap }) { constructor({ mindMap }) {
this.mindMap = mindMap this.mindMap = mindMap
this.rect = null this.rect = null
@ -23,11 +15,7 @@ class Select {
this.bindEvent() this.bindEvent()
} }
/** // 绑定事件
* @Author: 王林
* @Date: 2021-07-10 22:36:36
* @Desc: 绑定事件
*/
bindEvent() { bindEvent() {
this.checkInNodes = throttle(this.checkInNodes, 500, this) this.checkInNodes = throttle(this.checkInNodes, 500, this)
this.mindMap.on('mousedown', e => { this.mindMap.on('mousedown', e => {
@ -81,11 +69,7 @@ class Select {
}) })
} }
/** // 鼠标移动事件
* @Author: 王林
* @Date: 2021-07-13 07:55:49
* @Desc: 鼠标移动事件
*/
onMove(x, y) { onMove(x, y) {
// 绘制矩形 // 绘制矩形
this.rect.plot([ this.rect.plot([
@ -128,22 +112,14 @@ class Select {
} }
} }
/** // 开启自动移动
* @Author: 王林
* @Date: 2021-07-22 08:02:23
* @Desc: 开启自动移动
*/
startAutoMove(x, y) { startAutoMove(x, y) {
this.autoMoveTimer = setTimeout(() => { this.autoMoveTimer = setTimeout(() => {
this.onMove(x, y) this.onMove(x, y)
}, 20) }, 20)
} }
/** // 创建矩形
* @Author: 王林
* @Date: 2021-07-11 10:19:37
* @Desc: 创建矩形
*/
createRect(x, y) { createRect(x, y) {
this.rect = this.mindMap.svg this.rect = this.mindMap.svg
.polygon() .polygon()
@ -156,11 +132,7 @@ class Select {
.plot([[x, y]]) .plot([[x, y]])
} }
/** // 检测在选区里的节点
* @Author: 王林
* @Date: 2021-07-11 10:20:43
* @Desc: 检测在选区里的节点
*/
checkInNodes() { checkInNodes() {
let { scaleX, scaleY, translateX, translateY } = let { scaleX, scaleY, translateX, translateY } =
this.mindMap.draw.transform() this.mindMap.draw.transform()

View File

@ -1,18 +1,10 @@
/** // 节点形状类
* @Author: 王林
* @Date: 2022-08-22 21:32:50
* @Desc: 节点形状类
*/
export default class Shape { export default class Shape {
constructor(node) { constructor(node) {
this.node = node this.node = node
} }
/** // 形状需要的padding
* @Author: 王林
* @Date: 2022-08-17 22:32:32
* @Desc: 形状需要的padding
*/
getShapePadding(width, height, paddingX, paddingY) { getShapePadding(width, height, paddingX, paddingY) {
const shape = this.node.getShape() const shape = this.node.getShape()
const defaultPaddingX = 15 const defaultPaddingX = 15
@ -64,11 +56,7 @@ export default class Shape {
} }
} }
/** // 创建形状节点
* @Author: 王林
* @Date: 2022-08-17 22:22:53
* @Desc: 创建形状节点
*/
createShape() { createShape() {
const shape = this.node.getShape() const shape = this.node.getShape()
let { width, height } = this.node let { width, height } = this.node
@ -104,11 +92,7 @@ export default class Shape {
return node return node
} }
/** // 创建菱形
* @Author: 王林
* @Date: 2022-09-04 09:08:54
* @Desc: 创建菱形
*/
createDiamond() { createDiamond() {
let { width, height } = this.node let { width, height } = this.node
let halfWidth = width / 2 let halfWidth = width / 2
@ -129,11 +113,7 @@ export default class Shape {
`) `)
} }
/** // 创建平行四边形
* @Author: 王林
* @Date: 2022-09-03 16:14:12
* @Desc: 创建平行四边形
*/
createParallelogram() { createParallelogram() {
let { paddingX } = this.node.getPaddingVale() let { paddingX } = this.node.getPaddingVale()
paddingX = paddingX || this.node.shapePadding.paddingX paddingX = paddingX || this.node.shapePadding.paddingX
@ -146,11 +126,7 @@ export default class Shape {
`) `)
} }
/** // 创建圆角矩形
* @Author: 王林
* @Date: 2022-09-03 16:50:23
* @Desc: 创建圆角矩形
*/
createRoundedRectangle() { createRoundedRectangle() {
let { width, height } = this.node let { width, height } = this.node
let halfHeight = height / 2 let halfHeight = height / 2
@ -163,12 +139,7 @@ export default class Shape {
`) `)
} }
/** // 创建八角矩形
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 16:14:08
* @Desc: 创建八角矩形
*/
createOctagonalRectangle() { createOctagonalRectangle() {
let w = 5 let w = 5
let { width, height } = this.node let { width, height } = this.node
@ -184,12 +155,7 @@ export default class Shape {
`) `)
} }
/** // 创建外三角矩形
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 20:55:50
* @Desc: 创建外三角矩形
*/
createOuterTriangularRectangle() { createOuterTriangularRectangle() {
let { paddingX } = this.node.getPaddingVale() let { paddingX } = this.node.getPaddingVale()
paddingX = paddingX || this.node.shapePadding.paddingX paddingX = paddingX || this.node.shapePadding.paddingX
@ -204,12 +170,7 @@ export default class Shape {
`) `)
} }
/** // 创建内三角矩形
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 20:59:37
* @Desc: 创建内三角矩形
*/
createInnerTriangularRectangle() { createInnerTriangularRectangle() {
let { paddingX } = this.node.getPaddingVale() let { paddingX } = this.node.getPaddingVale()
paddingX = paddingX || this.node.shapePadding.paddingX paddingX = paddingX || this.node.shapePadding.paddingX
@ -224,12 +185,7 @@ export default class Shape {
`) `)
} }
/** // 创建椭圆
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 21:06:31
* @Desc: 创建椭圆
*/
createEllipse() { createEllipse() {
let { width, height } = this.node let { width, height } = this.node
let halfWidth = width / 2 let halfWidth = width / 2
@ -242,12 +198,7 @@ export default class Shape {
`) `)
} }
/** // 创建圆
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 21:14:04
* @Desc: 创建圆
*/
createCircle() { createCircle() {
let { width, height } = this.node let { width, height } = this.node
let halfWidth = width / 2 let halfWidth = width / 2

View File

@ -1,17 +1,9 @@
import { tagColorList } from './utils/constant' import { tagColorList } from './utils/constant'
const rootProp = ['paddingX', 'paddingY'] const rootProp = ['paddingX', 'paddingY']
/** // 样式类
* @Author: 王林
* @Date: 2021-04-11 10:09:08
* @Desc: 样式类
*/
class Style { class Style {
/** // 设置背景样式
* @Author: 王林
* @Date: 2021-04-11 16:01:53
* @Desc: 设置背景样式
*/
static setBackgroundStyle(el, themeConfig) { static setBackgroundStyle(el, themeConfig) {
let { backgroundColor, backgroundImage, backgroundRepeat } = themeConfig let { backgroundColor, backgroundImage, backgroundRepeat } = themeConfig
el.style.backgroundColor = backgroundColor el.style.backgroundColor = backgroundColor
@ -21,30 +13,18 @@ class Style {
} }
} }
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-11 10:10:11
* @Desc: 构造函数
*/
constructor(ctx, themeConfig) { constructor(ctx, themeConfig) {
this.ctx = ctx this.ctx = ctx
this.themeConfig = themeConfig this.themeConfig = themeConfig
} }
/** // 更新主题配置
* @Author: 王林
* @Date: 2021-07-12 07:40:14
* @Desc: 更新主题配置
*/
updateThemeConfig(themeConfig) { updateThemeConfig(themeConfig) {
this.themeConfig = themeConfig this.themeConfig = themeConfig
} }
/** // 合并样式
* @Author: 王林
* @Date: 2021-04-11 12:02:55
* @Desc: 合并样式
*/
merge(prop, root, isActive) { merge(prop, root, isActive) {
// 三级及以下节点 // 三级及以下节点
let defaultConfig = this.themeConfig.node let defaultConfig = this.themeConfig.node
@ -78,42 +58,23 @@ class Style {
: defaultConfig[prop] : defaultConfig[prop]
} }
/** // 获取某个样式值
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 21:55:57
* @Desc: 获取某个样式值
*/
getStyle(prop, root, isActive) { getStyle(prop, root, isActive) {
return this.merge(prop, root, isActive) return this.merge(prop, root, isActive)
} }
/** // 获取自身自定义样式
* javascript comment
* @Author: flydreame
* @Date: 2022-09-17 12:09:39
* @Desc: 获取自身自定义样式
*/
getSelfStyle(prop) { getSelfStyle(prop) {
return this.ctx.nodeData.data[prop] return this.ctx.nodeData.data[prop]
} }
/** // 矩形
* @Author: 王林
* @Date: 2021-04-11 10:12:56
* @Desc: 矩形
*/
rect(node) { rect(node) {
this.shape(node) this.shape(node)
node.radius(this.merge('borderRadius')) node.radius(this.merge('borderRadius'))
} }
/** // 矩形外的其他形状
* javascript comment
* @Author: 王林
* @Date: 2022-09-12 15:04:28
* @Desc: 矩形外的其他形状
*/
shape(node) { shape(node) {
node.fill({ node.fill({
color: this.merge('fillColor') color: this.merge('fillColor')
@ -134,11 +95,7 @@ class Style {
}) })
} }
/** // 文字
* @Author: 王林
* @Date: 2021-04-11 12:07:59
* @Desc: 文字
*/
text(node) { text(node) {
node node
.fill({ .fill({
@ -153,22 +110,14 @@ class Style {
}) })
} }
/** // html文字节点
* @Author: 王林
* @Date: 2021-04-13 08:14:34
* @Desc: html文字节点
*/
domText(node, fontSizeScale = 1) { domText(node, fontSizeScale = 1) {
node.style.fontFamily = this.merge('fontFamily') node.style.fontFamily = this.merge('fontFamily')
node.style.fontSize = this.merge('fontSize') * fontSizeScale + 'px' node.style.fontSize = this.merge('fontSize') * fontSizeScale + 'px'
node.style.fontWeight = this.merge('fontWeight') || 'normal' node.style.fontWeight = this.merge('fontWeight') || 'normal'
} }
/** // 标签文字
* @Author: 王林
* @Date: 2021-06-20 20:02:18
* @Desc: 标签文字
*/
tagText(node, index) { tagText(node, index) {
node node
.fill({ .fill({
@ -179,42 +128,26 @@ class Style {
}) })
} }
/** // 标签矩形
* @Author: 王林
* @Date: 2021-06-20 21:04:11
* @Desc: 标签矩形
*/
tagRect(node, index) { tagRect(node, index) {
node.fill({ node.fill({
color: tagColorList[index].background color: tagColorList[index].background
}) })
} }
/** // 内置图标
* @Author: 王林
* @Date: 2021-07-03 22:37:19
* @Desc: 内置图标
*/
iconNode(node) { iconNode(node) {
node.attr({ node.attr({
fill: this.merge('color') fill: this.merge('color')
}) })
} }
/** // 连线
* @Author: 王林
* @Date: 2021-04-11 14:50:49
* @Desc: 连线
*/
line(node, { width, color, dasharray } = {}) { line(node, { width, color, dasharray } = {}) {
node.stroke({ width, color, dasharray }).fill({ color: 'none' }) node.stroke({ width, color, dasharray }).fill({ color: 'none' })
} }
/** // 概要连线
* @Author: 王林
* @Date: 2022-07-30 16:19:03
* @Desc: 概要连线
*/
generalizationLine(node) { generalizationLine(node) {
node node
.stroke({ .stroke({
@ -224,11 +157,7 @@ class Style {
.fill({ color: 'none' }) .fill({ color: 'none' })
} }
/** // 按钮
* @Author: 王林
* @Date: 2021-04-11 20:03:59
* @Desc: 按钮
*/
iconBtn(node, fillNode) { iconBtn(node, fillNode) {
node.fill({ color: '#808080' }) node.fill({ color: '#808080' })
fillNode.fill({ color: '#fff' }) fillNode.fill({ color: '#fff' })

View File

@ -1,18 +1,8 @@
import { getStrWithBrFromHtml } from './utils' import { getStrWithBrFromHtml } from './utils'
/** // 节点文字编辑类
* javascript comment
* @Author: 王林25
* @Date: 2021-06-19 11:11:28
* @Desc: 节点文字编辑类
*/
export default class TextEdit { export default class TextEdit {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-06-19 11:22:57
* @Desc: 构造函数
*/
constructor(renderer) { constructor(renderer) {
this.renderer = renderer this.renderer = renderer
this.mindMap = renderer.mindMap this.mindMap = renderer.mindMap
@ -23,11 +13,7 @@ export default class TextEdit {
this.bindEvent() this.bindEvent()
} }
/** // 事件
* @Author: 王林
* @Date: 2021-04-24 13:27:04
* @Desc: 事件
*/
bindEvent() { bindEvent() {
this.show = this.show.bind(this) this.show = this.show.bind(this)
// 节点双击事件 // 节点双击事件
@ -54,12 +40,7 @@ export default class TextEdit {
}) })
} }
/** // 注册临时快捷键
* javascript comment
* @Author: 王林25
* @Date: 2022-08-16 16:27:02
* @Desc: 注册临时快捷键
*/
registerTmpShortcut() { registerTmpShortcut() {
// 注册回车快捷键 // 注册回车快捷键
this.mindMap.keyCommand.addShortcut('Enter', () => { this.mindMap.keyCommand.addShortcut('Enter', () => {
@ -67,20 +48,12 @@ export default class TextEdit {
}) })
} }
/** // 显示文本编辑框
* @Author: 王林
* @Date: 2021-04-13 22:15:56
* @Desc: 显示文本编辑框
*/
show(node) { show(node) {
this.showEditTextBox(node, node._textData.node.node.getBoundingClientRect()) this.showEditTextBox(node, node._textData.node.node.getBoundingClientRect())
} }
/** // 显示文本编辑框
* @Author: 王林
* @Date: 2021-04-13 22:13:02
* @Desc: 显示文本编辑框
*/
showEditTextBox(node, rect) { showEditTextBox(node, rect) {
this.mindMap.emit('before_show_text_edit') this.mindMap.emit('before_show_text_edit')
this.registerTmpShortcut() this.registerTmpShortcut()
@ -107,11 +80,7 @@ export default class TextEdit {
this.selectNodeText() this.selectNodeText()
} }
/** // 选中文本
* @Author: 王林
* @Date: 2021-08-02 23:13:50
* @Desc: 选中文本
*/
selectNodeText() { selectNodeText() {
let selection = window.getSelection() let selection = window.getSelection()
let range = document.createRange() let range = document.createRange()
@ -120,11 +89,7 @@ export default class TextEdit {
selection.addRange(range) selection.addRange(range)
} }
/** // 隐藏文本编辑框
* @Author: 王林
* @Date: 2021-04-24 13:48:16
* @Desc: 隐藏文本编辑框
*/
hideEditTextBox() { hideEditTextBox() {
if (!this.showTextEdit) { if (!this.showTextEdit) {
return return

View File

@ -1,16 +1,6 @@
/** // 视图操作类
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:45:24
* @Desc: 视图操作类
*/
class View { class View {
/** // 构造函数
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:45:40
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
this.opt = opt this.opt = opt
this.mindMap = this.opt.mindMap this.mindMap = this.opt.mindMap
@ -24,12 +14,7 @@ class View {
this.bind() this.bind()
} }
/** // 绑定
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 15:38:51
* @Desc: 绑定
*/
bind() { bind() {
// 快捷键 // 快捷键
this.mindMap.keyCommand.addShortcut('Control+=', () => { this.mindMap.keyCommand.addShortcut('Control+=', () => {
@ -80,12 +65,7 @@ class View {
}) })
} }
/** // 获取当前变换状态数据
* javascript comment
* @Author: 王林25
* @Date: 2021-11-22 18:30:24
* @Desc: 获取当前变换状态数据
*/
getTransformData() { getTransformData() {
return { return {
transform: this.mindMap.draw.transform(), transform: this.mindMap.draw.transform(),
@ -99,12 +79,7 @@ class View {
} }
} }
/** // 动态设置变换状态数据
* javascript comment
* @Author: 王林25
* @Date: 2021-11-22 19:54:17
* @Desc: 动态设置变换状态数据
*/
setTransformData(viewData) { setTransformData(viewData) {
if (viewData) { if (viewData) {
Object.keys(viewData.state).forEach(prop => { Object.keys(viewData.state).forEach(prop => {
@ -118,55 +93,31 @@ class View {
} }
} }
/** // 平移x方向
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 15:49:06
* @Desc: 平移x方向
*/
translateX(step) { translateX(step) {
this.x += step this.x += step
this.transform() this.transform()
} }
/** // 平移x方式到
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:03:53
* @Desc: 平移x方式到
*/
translateXTo(x) { translateXTo(x) {
this.x = x this.x = x
this.transform() this.transform()
} }
/** // 平移y方向
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 15:48:52
* @Desc: 平移y方向
*/
translateY(step) { translateY(step) {
this.y += step this.y += step
this.transform() this.transform()
} }
/** // 平移y方向到
* javascript comment
* @Author: 王林25
* @Date: 2022-10-10 14:04:10
* @Desc: 平移y方向到
*/
translateYTo(y) { translateYTo(y) {
this.y = y this.y = y
this.transform() this.transform()
} }
/** // 应用变换
* @Author: 王林
* @Date: 2021-07-04 17:13:14
* @Desc: 应用变换
*/
transform() { transform() {
this.mindMap.draw.transform({ this.mindMap.draw.transform({
scale: this.scale, scale: this.scale,
@ -176,11 +127,7 @@ class View {
this.mindMap.emit('view_data_change', this.getTransformData()) this.mindMap.emit('view_data_change', this.getTransformData())
} }
/** // 恢复
* @Author: 王林
* @Date: 2021-07-11 17:41:35
* @Desc: 恢复
*/
reset() { reset() {
this.scale = 1 this.scale = 1
this.x = 0 this.x = 0
@ -188,11 +135,7 @@ class View {
this.transform() this.transform()
} }
/** // 缩小
* @Author: 王林
* @Date: 2021-07-04 17:10:34
* @Desc: 缩小
*/
narrow() { narrow() {
if (this.scale - this.mindMap.opt.scaleRatio > 0.1) { if (this.scale - this.mindMap.opt.scaleRatio > 0.1) {
this.scale -= this.mindMap.opt.scaleRatio this.scale -= this.mindMap.opt.scaleRatio
@ -203,23 +146,14 @@ class View {
this.mindMap.emit('scale', this.scale) this.mindMap.emit('scale', this.scale)
} }
/** // 放大
* @Author: 王林
* @Date: 2021-07-04 17:10:41
* @Desc: 放大
*/
enlarge() { enlarge() {
this.scale += this.mindMap.opt.scaleRatio this.scale += this.mindMap.opt.scaleRatio
this.transform() this.transform()
this.mindMap.emit('scale', this.scale) this.mindMap.emit('scale', this.scale)
} }
/** // 设置缩放
* javascript comment
* @Author: 王林25
* @Date: 2022-12-09 16:31:59
* @Desc: 设置缩放
*/
setScale(scale) { setScale(scale) {
this.scale = scale this.scale = scale
this.transform() this.transform()

View File

@ -1,16 +1,8 @@
import Node from '../Node' import Node from '../Node'
/** // 布局基类
* @Author: 王林
* @Date: 2021-04-12 22:24:30
* @Desc: 布局基类
*/
class Base { class Base {
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-12 22:25:16
* @Desc: 构造函数
*/
constructor(renderer) { constructor(renderer) {
// 渲染实例 // 渲染实例
this.renderer = renderer this.renderer = renderer
@ -22,45 +14,25 @@ class Base {
this.root = null this.root = null
} }
/** // 计算节点位置
* @Author: 王林
* @Date: 2021-04-12 22:39:50
* @Desc: 计算节点位置
*/
doLayout() { doLayout() {
throw new Error('【computed】方法为必要方法需要子类进行重写') throw new Error('【computed】方法为必要方法需要子类进行重写')
} }
/** // 连线
* @Author: 王林
* @Date: 2021-04-12 22:41:04
* @Desc: 连线
*/
renderLine() { renderLine() {
throw new Error('【renderLine】方法为必要方法需要子类进行重写') throw new Error('【renderLine】方法为必要方法需要子类进行重写')
} }
/** // 定位展开收缩按钮
* @Author: 王林
* @Date: 2021-04-12 22:42:08
* @Desc: 定位展开收缩按钮
*/
renderExpandBtn() { renderExpandBtn() {
throw new Error('【renderExpandBtn】方法为必要方法需要子类进行重写') throw new Error('【renderExpandBtn】方法为必要方法需要子类进行重写')
} }
/** // 概要节点
* @Author: 王林
* @Date: 2022-07-30 22:49:28
* @Desc: 概要节点
*/
renderGeneralization() {} renderGeneralization() {}
/** // 创建节点实例
* @Author: 王林
* @Date: 2021-07-10 21:30:54
* @Desc: 创建节点实例
*/
createNode(data, parent, isRoot, layerIndex) { createNode(data, parent, isRoot, layerIndex) {
// 创建节点 // 创建节点
let newNode = null let newNode = null
@ -98,22 +70,13 @@ class Base {
return newNode return newNode
} }
/** // 定位节点到画布中间
* @Author: 王林
* @Date: 2021-07-16 13:48:43
* @Desc: 定位节点到画布中间
*/
setNodeCenter(node) { setNodeCenter(node) {
node.left = (this.mindMap.width - node.width) / 2 node.left = (this.mindMap.width - node.width) / 2
node.top = (this.mindMap.height - node.height) / 2 node.top = (this.mindMap.height - node.height) / 2
} }
/** // 更新子节点属性
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 11:25:52
* @Desc: 更新子节点属性
*/
updateChildren(children, prop, offset) { updateChildren(children, prop, offset) {
children.forEach(item => { children.forEach(item => {
item[prop] += offset item[prop] += offset
@ -124,22 +87,14 @@ class Base {
}) })
} }
/** // 二次贝塞尔曲线
* @Author: 王林
* @Date: 2021-04-11 15:05:01
* @Desc: 二次贝塞尔曲线
*/
quadraticCurvePath(x1, y1, x2, y2) { quadraticCurvePath(x1, y1, x2, y2) {
let cx = x1 + (x2 - x1) * 0.2 let cx = x1 + (x2 - x1) * 0.2
let cy = y1 + (y2 - y1) * 0.8 let cy = y1 + (y2 - y1) * 0.8
return `M ${x1},${y1} Q ${cx},${cy} ${x2},${y2}` return `M ${x1},${y1} Q ${cx},${cy} ${x2},${y2}`
} }
/** // 三次贝塞尔曲线
* @Author: 王林
* @Date: 2021-04-11 15:05:18
* @Desc: 三次贝塞尔曲线
*/
cubicBezierPath(x1, y1, x2, y2) { cubicBezierPath(x1, y1, x2, y2) {
let cx1 = x1 + (x2 - x1) / 2 let cx1 = x1 + (x2 - x1) / 2
let cy1 = y1 let cy1 = y1
@ -148,33 +103,21 @@ class Base {
return `M ${x1},${y1} C ${cx1},${cy1} ${cx2},${cy2} ${x2},${y2}` return `M ${x1},${y1} C ${cx1},${cy1} ${cx2},${cy2} ${x2},${y2}`
} }
/** // 获取节点的marginX
* @Author: 王林
* @Date: 2021-06-27 19:00:07
* @Desc: 获取节点的marginX
*/
getMarginX(layerIndex) { getMarginX(layerIndex) {
return layerIndex === 1 return layerIndex === 1
? this.mindMap.themeConfig.second.marginX ? this.mindMap.themeConfig.second.marginX
: this.mindMap.themeConfig.node.marginX : this.mindMap.themeConfig.node.marginX
} }
/** // 获取节点的marginY
* @Author: 王林
* @Date: 2021-04-11 15:34:20
* @Desc: 获取节点的marginY
*/
getMarginY(layerIndex) { getMarginY(layerIndex) {
return layerIndex === 1 return layerIndex === 1
? this.mindMap.themeConfig.second.marginY ? this.mindMap.themeConfig.second.marginY
: this.mindMap.themeConfig.node.marginY : this.mindMap.themeConfig.node.marginY
} }
/** // 获取节点包括概要在内的宽度
* @Author: 王林
* @Date: 2022-07-31 20:53:12
* @Desc: 获取节点包括概要在内的宽度
*/
getNodeWidthWithGeneralization(node) { getNodeWidthWithGeneralization(node) {
return Math.max( return Math.max(
node.width, node.width,
@ -182,11 +125,7 @@ class Base {
) )
} }
/** // 获取节点包括概要在内的高度
* @Author: 王林
* @Date: 2022-07-31 20:53:12
* @Desc: 获取节点包括概要在内的高度
*/
getNodeHeightWithGeneralization(node) { getNodeHeightWithGeneralization(node) {
return Math.max( return Math.max(
node.height, node.height,
@ -194,10 +133,8 @@ class Base {
) )
} }
// 获取节点的边界值
/** /**
* @Author: 王林
* @Date: 2022-07-31 09:14:03
* @Desc: 获取节点的边界值
* dir生长方向h水平v垂直 * dir生长方向h水平v垂直
* isLeft是否向左生长 * isLeft是否向左生长
*/ */

View File

@ -1,27 +1,14 @@
import Base from './Base' import Base from './Base'
import { walk, asyncRun } from '../utils' import { walk, asyncRun } from '../utils'
/** // 目录组织图
* @Author: 王林
* @Date: 2021-04-12 22:25:58
* @Desc: 目录组织图
*/
class CatalogOrganization extends Base { class CatalogOrganization extends Base {
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-12 22:26:31
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
super(opt) super(opt)
} }
/** // 布局
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:04:20
* @Desc: 布局
*/
doLayout(callback) { doLayout(callback) {
let task = [ let task = [
() => { () => {
@ -40,12 +27,7 @@ class CatalogOrganization extends Base {
asyncRun(task) asyncRun(task)
} }
/** // 遍历数据计算节点的left、width、height
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:49:32
* @Desc: 遍历数据计算节点的leftwidthheight
*/
computedBaseValue() { computedBaseValue() {
walk( walk(
this.renderer.renderTree, this.renderer.renderTree,
@ -84,12 +66,7 @@ class CatalogOrganization extends Base {
) )
} }
/** // 遍历节点树计算节点的left、top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:59:25
* @Desc: 遍历节点树计算节点的lefttop
*/
computedLeftTopValue() { computedLeftTopValue() {
walk( walk(
this.root, this.root,
@ -124,12 +101,7 @@ class CatalogOrganization extends Base {
) )
} }
/** // 调整节点left、top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 10:04:05
* @Desc: 调整节点lefttop
*/
adjustLeftTopValue() { adjustLeftTopValue() {
walk( walk(
this.root, this.root,
@ -164,12 +136,7 @@ class CatalogOrganization extends Base {
) )
} }
/** // 递归计算节点的宽度
* javascript comment
* @Author: 王林25
* @Date: 2021-04-12 18:55:03
* @Desc: 递归计算节点的宽度
*/
getNodeAreaWidth(node) { getNodeAreaWidth(node) {
let widthArr = [] let widthArr = []
let loop = (node, width) => { let loop = (node, width) => {
@ -187,12 +154,7 @@ class CatalogOrganization extends Base {
return Math.max(...widthArr) return Math.max(...widthArr)
} }
/** // 调整兄弟节点的left
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 11:12:51
* @Desc: 调整兄弟节点的left
*/
updateBrothersLeft(node, addWidth) { updateBrothersLeft(node, addWidth) {
if (node.parent) { if (node.parent) {
let childrenList = node.parent.children let childrenList = node.parent.children
@ -238,12 +200,7 @@ class CatalogOrganization extends Base {
} }
} }
/** // 调整兄弟节点的top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:26:03
* @Desc: 调整兄弟节点的top
*/
updateBrothersTop(node, addHeight) { updateBrothersTop(node, addHeight) {
if (node.parent && !node.parent.isRoot) { if (node.parent && !node.parent.isRoot) {
let childrenList = node.parent.children let childrenList = node.parent.children
@ -271,11 +228,7 @@ class CatalogOrganization extends Base {
} }
} }
/** // 绘制连线,连接该节点到其子节点
* @Author: 王林
* @Date: 2021-04-11 14:42:48
* @Desc: 绘制连线连接该节点到其子节点
*/
renderLine(node, lines, style) { renderLine(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -396,11 +349,7 @@ class CatalogOrganization extends Base {
} }
} }
/** // 渲染按钮
* @Author: 王林
* @Date: 2021-04-11 19:54:26
* @Desc: 渲染按钮
*/
renderExpandBtn(node, btn) { renderExpandBtn(node, btn) {
let { width, height, expandBtnSize, isRoot } = node let { width, height, expandBtnSize, isRoot } = node
if (!isRoot) { if (!isRoot) {
@ -412,11 +361,7 @@ class CatalogOrganization extends Base {
} }
} }
/** // 创建概要节点
* @Author: 王林
* @Date: 2022-07-30 08:30:35
* @Desc: 创建概要节点
*/
renderGeneralization(node, gLine, gNode) { renderGeneralization(node, gLine, gNode) {
let { let {
top, top,

View File

@ -1,27 +1,14 @@
import Base from './Base' import Base from './Base'
import { walk, asyncRun } from '../utils' import { walk, asyncRun } from '../utils'
/** // 逻辑结构图
* @Author: 王林
* @Date: 2021-04-12 22:25:58
* @Desc: 逻辑结构图
*/
class LogicalStructure extends Base { class LogicalStructure extends Base {
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-12 22:26:31
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
super(opt) super(opt)
} }
/** // 布局
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:04:20
* @Desc: 布局
*/
doLayout(callback) { doLayout(callback) {
let task = [ let task = [
() => { () => {
@ -40,12 +27,7 @@ class LogicalStructure extends Base {
asyncRun(task) asyncRun(task)
} }
/** // 遍历数据计算节点的left、width、height
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:49:32
* @Desc: 遍历数据计算节点的leftwidthheight
*/
computedBaseValue() { computedBaseValue() {
walk( walk(
this.renderer.renderTree, this.renderer.renderTree,
@ -80,12 +62,7 @@ class LogicalStructure extends Base {
) )
} }
/** // 遍历节点树计算节点的top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:59:25
* @Desc: 遍历节点树计算节点的top
*/
computedTopValue() { computedTopValue() {
walk( walk(
this.root, this.root,
@ -111,12 +88,7 @@ class LogicalStructure extends Base {
) )
} }
/** // 调整节点top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 10:04:05
* @Desc: 调整节点top
*/
adjustTopValue() { adjustTopValue() {
walk( walk(
this.root, this.root,
@ -139,12 +111,7 @@ class LogicalStructure extends Base {
) )
} }
/** // 更新兄弟节点的top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:26:03
* @Desc: 更新兄弟节点的top
*/
updateBrothers(node, addHeight) { updateBrothers(node, addHeight) {
if (node.parent) { if (node.parent) {
let childrenList = node.parent.children let childrenList = node.parent.children
@ -175,11 +142,7 @@ class LogicalStructure extends Base {
} }
} }
/** // 绘制连线,连接该节点到其子节点
* @Author: 王林
* @Date: 2021-04-11 14:42:48
* @Desc: 绘制连线连接该节点到其子节点
*/
renderLine(node, lines, style, lineStyle) { renderLine(node, lines, style, lineStyle) {
if (lineStyle === 'curve') { if (lineStyle === 'curve') {
this.renderLineCurve(node, lines, style) this.renderLineCurve(node, lines, style)
@ -190,12 +153,7 @@ class LogicalStructure extends Base {
} }
} }
/** // 直线风格连线
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:17:30
* @Desc: 直线风格连线
*/
renderLineStraight(node, lines, style) { renderLineStraight(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -221,12 +179,7 @@ class LogicalStructure extends Base {
}) })
} }
/** // 直连风格
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:34:41
* @Desc: 直连风格
*/
renderLineDirect(node, lines, style) { renderLineDirect(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -248,12 +201,7 @@ class LogicalStructure extends Base {
}) })
} }
/** // 曲线风格连线
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:17:43
* @Desc: 曲线风格连线
*/
renderLineCurve(node, lines, style) { renderLineCurve(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -280,11 +228,7 @@ class LogicalStructure extends Base {
}) })
} }
/** // 渲染按钮
* @Author: 王林
* @Date: 2021-04-11 19:54:26
* @Desc: 渲染按钮
*/
renderExpandBtn(node, btn) { renderExpandBtn(node, btn) {
let { width, height } = node let { width, height } = node
let { translateX, translateY } = btn.transform() let { translateX, translateY } = btn.transform()
@ -298,11 +242,7 @@ class LogicalStructure extends Base {
) )
} }
/** // 创建概要节点
* @Author: 王林
* @Date: 2022-07-30 08:30:35
* @Desc: 创建概要节点
*/
renderGeneralization(node, gLine, gNode) { renderGeneralization(node, gLine, gNode) {
let { let {
top, top,

View File

@ -1,28 +1,17 @@
import Base from './Base' import Base from './Base'
import { walk, asyncRun } from '../utils' import { walk, asyncRun } from '../utils'
/** // 思维导图
* @Author: 王林
* @Date: 2021-04-12 22:25:58
* @Desc: 思维导图
* 在逻辑结构图的基础上增加一个变量来记录生长方向向左还是向右同时在计算left的时候根据方向来计算调整top时只考虑同方向的节点即可
*/
class MindMap extends Base { class MindMap extends Base {
/** // 构造函数
* @Author: 王林 // 在逻辑结构图的基础上增加一个变量来记录生长方向向左还是向右同时在计算left的时候根据方向来计算、调整top时只考虑同方向的节点即可
* @Date: 2021-04-12 22:26:31
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
super(opt) super(opt)
} }
/** // 布局
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:04:20
* @Desc: 布局
*/
doLayout(callback) { doLayout(callback) {
let task = [ let task = [
() => { () => {
@ -41,12 +30,8 @@ class MindMap extends Base {
asyncRun(task) asyncRun(task)
} }
/** // 遍历数据计算节点的left、width、height
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:49:32
* @Desc: 遍历数据计算节点的leftwidthheight
*/
computedBaseValue() { computedBaseValue() {
walk( walk(
this.renderer.renderTree, this.renderer.renderTree,
@ -110,12 +95,8 @@ class MindMap extends Base {
) )
} }
/** // 遍历节点树计算节点的top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:59:25
* @Desc: 遍历节点树计算节点的top
*/
computedTopValue() { computedTopValue() {
walk( walk(
this.root, this.root,
@ -147,12 +128,8 @@ class MindMap extends Base {
) )
} }
/** // 调整节点top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 10:04:05
* @Desc: 调整节点top
*/
adjustTopValue() { adjustTopValue() {
walk( walk(
this.root, this.root,
@ -174,12 +151,8 @@ class MindMap extends Base {
) )
} }
/** // 更新兄弟节点的top
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:26:03
* @Desc: 更新兄弟节点的top
*/
updateBrothers(node, leftAddHeight, rightAddHeight) { updateBrothers(node, leftAddHeight, rightAddHeight) {
if (node.parent) { if (node.parent) {
// 过滤出和自己同方向的节点 // 过滤出和自己同方向的节点
@ -214,11 +187,8 @@ class MindMap extends Base {
} }
} }
/** // 绘制连线,连接该节点到其子节点
* @Author: 王林
* @Date: 2021-04-11 14:42:48
* @Desc: 绘制连线连接该节点到其子节点
*/
renderLine(node, lines, style, lineStyle) { renderLine(node, lines, style, lineStyle) {
if (lineStyle === 'curve') { if (lineStyle === 'curve') {
this.renderLineCurve(node, lines, style) this.renderLineCurve(node, lines, style)
@ -229,12 +199,8 @@ class MindMap extends Base {
} }
} }
/** // 直线风格连线
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:10:47
* @Desc: 直线风格连线
*/
renderLineStraight(node, lines, style) { renderLineStraight(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -268,12 +234,8 @@ class MindMap extends Base {
}) })
} }
/** // 直连风格
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:34:41
* @Desc: 直连风格
*/
renderLineDirect(node, lines, style) { renderLineDirect(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -304,12 +266,8 @@ class MindMap extends Base {
}) })
} }
/** // 曲线风格连线
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:10:56
* @Desc: 曲线风格连线
*/
renderLineCurve(node, lines, style) { renderLineCurve(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -345,11 +303,8 @@ class MindMap extends Base {
}) })
} }
/** // 渲染按钮
* @Author: 王林
* @Date: 2021-04-11 19:54:26
* @Desc: 渲染按钮
*/
renderExpandBtn(node, btn) { renderExpandBtn(node, btn) {
let { width, height, expandBtnSize } = node let { width, height, expandBtnSize } = node
let { translateX, translateY } = btn.transform() let { translateX, translateY } = btn.transform()
@ -362,11 +317,8 @@ class MindMap extends Base {
btn.translate(x, y) btn.translate(x, y)
} }
/** // 创建概要节点
* @Author: 王林
* @Date: 2022-07-30 08:30:35
* @Desc: 创建概要节点
*/
renderGeneralization(node, gLine, gNode) { renderGeneralization(node, gLine, gNode) {
let isLeft = node.dir === 'left' let isLeft = node.dir === 'left'
let { let {

View File

@ -1,28 +1,17 @@
import Base from './Base' import Base from './Base'
import { walk, asyncRun } from '../utils' import { walk, asyncRun } from '../utils'
/** // 组织结构图
* @Author: 王林 // 和逻辑结构图基本一样只是方向变成向下生长所以先计算节点的top后计算节点的left、最后调整节点的left即可
* @Date: 2021-04-12 22:25:58
* @Desc: 组织结构图
* 和逻辑结构图基本一样只是方向变成向下生长所以先计算节点的top后计算节点的left最后调整节点的left即可
*/
class OrganizationStructure extends Base { class OrganizationStructure extends Base {
/** // 构造函数
* @Author: 王林
* @Date: 2021-04-12 22:26:31
* @Desc: 构造函数
*/
constructor(opt = {}) { constructor(opt = {}) {
super(opt) super(opt)
} }
/** // 布局
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:04:20
* @Desc: 布局
*/
doLayout(callback) { doLayout(callback) {
let task = [ let task = [
() => { () => {
@ -41,12 +30,8 @@ class OrganizationStructure extends Base {
asyncRun(task) asyncRun(task)
} }
/** // 遍历数据计算节点的left、width、height
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:49:32
* @Desc: 遍历数据计算节点的leftwidthheight
*/
computedBaseValue() { computedBaseValue() {
walk( walk(
this.renderer.renderTree, this.renderer.renderTree,
@ -81,12 +66,8 @@ class OrganizationStructure extends Base {
) )
} }
/** // 遍历节点树计算节点的left
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 09:59:25
* @Desc: 遍历节点树计算节点的left
*/
computedLeftValue() { computedLeftValue() {
walk( walk(
this.root, this.root,
@ -112,12 +93,8 @@ class OrganizationStructure extends Base {
) )
} }
/** // 调整节点left
* javascript comment
* @Author: 王林25
* @Date: 2021-04-08 10:04:05
* @Desc: 调整节点left
*/
adjustLeftValue() { adjustLeftValue() {
walk( walk(
this.root, this.root,
@ -140,12 +117,8 @@ class OrganizationStructure extends Base {
) )
} }
/** // 更新兄弟节点的left
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 14:26:03
* @Desc: 更新兄弟节点的left
*/
updateBrothers(node, addWidth) { updateBrothers(node, addWidth) {
if (node.parent) { if (node.parent) {
let childrenList = node.parent.children let childrenList = node.parent.children
@ -176,11 +149,8 @@ class OrganizationStructure extends Base {
} }
} }
/** // 绘制连线,连接该节点到其子节点
* @Author: 王林
* @Date: 2021-04-11 14:42:48
* @Desc: 绘制连线连接该节点到其子节点
*/
renderLine(node, lines, style, lineStyle) { renderLine(node, lines, style, lineStyle) {
if (lineStyle === 'direct') { if (lineStyle === 'direct') {
this.renderLineDirect(node, lines, style) this.renderLineDirect(node, lines, style)
@ -189,12 +159,8 @@ class OrganizationStructure extends Base {
} }
} }
/** // 直连风格
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:34:41
* @Desc: 直连风格
*/
renderLineDirect(node, lines, style) { renderLineDirect(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -215,12 +181,8 @@ class OrganizationStructure extends Base {
}) })
} }
/** // 直线风格连线
* javascript comment
* @Author: 王林25
* @Date: 2022-09-30 14:39:07
* @Desc: 直线风格连线
*/
renderLineStraight(node, lines, style) { renderLineStraight(node, lines, style) {
if (node.children.length <= 0) { if (node.children.length <= 0) {
return [] return []
@ -269,11 +231,8 @@ class OrganizationStructure extends Base {
} }
} }
/** // 渲染按钮
* @Author: 王林
* @Date: 2021-04-11 19:54:26
* @Desc: 渲染按钮
*/
renderExpandBtn(node, btn) { renderExpandBtn(node, btn) {
let { width, height, expandBtnSize } = node let { width, height, expandBtnSize } = node
let { translateX, translateY } = btn.transform() let { translateX, translateY } = btn.transform()
@ -283,11 +242,8 @@ class OrganizationStructure extends Base {
) )
} }
/** // 创建概要节点
* @Author: 王林
* @Date: 2022-07-30 08:30:35
* @Desc: 创建概要节点
*/
renderGeneralization(node, gLine, gNode) { renderGeneralization(node, gLine, gNode) {
let { let {
bottom, bottom,

View File

@ -1,12 +1,7 @@
import JSZip from 'jszip' import JSZip from 'jszip'
import xmlConvert from 'xml-js' import xmlConvert from 'xml-js'
/** // 解析.xmind文件
* javascript comment
* @Author: 王林25
* @Date: 2022-09-21 14:07:47
* @Desc: 解析.xmind文件
*/
const parseXmindFile = file => { const parseXmindFile = file => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
JSZip.loadAsync(file).then( JSZip.loadAsync(file).then(
@ -37,12 +32,7 @@ const parseXmindFile = file => {
}) })
} }
/** // 转换xmind数据
* javascript comment
* @Author: 王林25
* @Date: 2022-09-21 18:57:25
* @Desc: 转换xmind数据
*/
const transformXmind = content => { const transformXmind = content => {
let data = JSON.parse(content)[0] let data = JSON.parse(content)[0]
let nodeTree = data.rootTopic let nodeTree = data.rootTopic
@ -82,12 +72,7 @@ const transformXmind = content => {
return newTree return newTree
} }
/** // 转换旧版xmind数据xmind8
* javascript comment
* @Author: 王林25
* @Date: 2022-09-23 15:51:51
* @Desc: 转换旧版xmind数据xmind8
*/
const transformOldXmind = content => { const transformOldXmind = content => {
let data = JSON.parse(content) let data = JSON.parse(content)
let elements = data.elements let elements = data.elements

View File

@ -1,15 +1,7 @@
/** // 展开按钮
* @Author: 王林
* @Date: 2021-04-11 19:46:10
* @Desc: 展开按钮
*/
const open = `<svg t="1618141562310" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13476" width="200" height="200"><path d="M475.136 327.168v147.968h-147.968v74.24h147.968v147.968h74.24v-147.968h147.968v-74.24h-147.968v-147.968h-74.24z m36.864-222.208c225.28 0 407.04 181.76 407.04 407.04s-181.76 407.04-407.04 407.04-407.04-181.76-407.04-407.04 181.76-407.04 407.04-407.04z m0-74.24c-265.216 0-480.768 215.552-480.768 480.768s215.552 480.768 480.768 480.768 480.768-215.552 480.768-480.768-215.552-480.768-480.768-480.768z" p-id="13477"></path></svg>` const open = `<svg t="1618141562310" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13476" width="200" height="200"><path d="M475.136 327.168v147.968h-147.968v74.24h147.968v147.968h74.24v-147.968h147.968v-74.24h-147.968v-147.968h-74.24z m36.864-222.208c225.28 0 407.04 181.76 407.04 407.04s-181.76 407.04-407.04 407.04-407.04-181.76-407.04-407.04 181.76-407.04 407.04-407.04z m0-74.24c-265.216 0-480.768 215.552-480.768 480.768s215.552 480.768 480.768 480.768 480.768-215.552 480.768-480.768-215.552-480.768-480.768-480.768z" p-id="13477"></path></svg>`
/** // 收缩按钮
* @Author: 王林
* @Date: 2021-04-11 19:46:23
* @Desc: 收缩按钮
*/
const close = `<svg t="1618141589243" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13611" width="200" height="200"><path d="M512 105.472c225.28 0 407.04 181.76 407.04 407.04s-181.76 407.04-407.04 407.04-407.04-181.76-407.04-407.04 181.76-407.04 407.04-407.04z m0-74.24c-265.216 0-480.768 215.552-480.768 480.768s215.552 480.768 480.768 480.768 480.768-215.552 480.768-480.768-215.552-480.768-480.768-480.768z" p-id="13612"></path><path d="M252.928 474.624h518.144v74.24h-518.144z" p-id="13613"></path></svg>` const close = `<svg t="1618141589243" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13611" width="200" height="200"><path d="M512 105.472c225.28 0 407.04 181.76 407.04 407.04s-181.76 407.04-407.04 407.04-407.04-181.76-407.04-407.04 181.76-407.04 407.04-407.04z m0-74.24c-265.216 0-480.768 215.552-480.768 480.768s215.552 480.768 480.768 480.768 480.768-215.552 480.768-480.768-215.552-480.768-480.768-480.768z" p-id="13612"></path><path d="M252.928 474.624h518.144v74.24h-518.144z" p-id="13613"></path></svg>`
export default { export default {

View File

@ -278,11 +278,7 @@ export const nodeIconList = [
} }
] ]
/** // 获取nodeIconList icon内容
* @Author: 王林
* @Date: 2021-06-23 22:36:56
* @Desc: 获取nodeIconList icon内容
*/
const getNodeIconListIcon = name => { const getNodeIconListIcon = name => {
let arr = name.split('_') let arr = name.split('_')
let typeData = nodeIconList.find(item => { let typeData = nodeIconList.find(item => {

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 天空蓝
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 天空蓝
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(115, 161, 191)', lineColor: 'rgb(115, 161, 191)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 脑残粉
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 脑残粉
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(191, 115, 148)', lineColor: 'rgb(191, 115, 148)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 脑图经典
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 脑图经典
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: '#fff', lineColor: '#fff',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 经典2
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 经典2
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(51, 51, 51)', lineColor: 'rgb(51, 51, 51)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 经典3
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 经典3
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(94, 202, 110)', lineColor: 'rgb(94, 202, 110)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 经典4
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 经典4
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(30, 53, 86)', lineColor: 'rgb(30, 53, 86)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 经典蓝
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 经典蓝
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(51, 51, 51)', lineColor: 'rgb(51, 51, 51)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 经典绿
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 经典绿
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(123, 199, 120)', lineColor: 'rgb(123, 199, 120)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 暗色
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 暗色
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(17, 68, 23)', lineColor: 'rgb(17, 68, 23)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 暗色2
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 暗色2
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(75, 81, 78)', lineColor: 'rgb(75, 81, 78)',

View File

@ -1,8 +1,4 @@
/** // 默认主题
* @Author: 王林
* @Date: 2021-04-11 10:19:55
* @Desc: 默认主题
*/
export default { export default {
// 节点内边距 // 节点内边距
paddingX: 15, paddingX: 15,

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 泥土黄
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 泥土黄
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(191, 147, 115)', lineColor: 'rgb(191, 147, 115)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 清新绿
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 清新绿
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: '#333', lineColor: '#333',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 清新红
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 清新红
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(191, 115, 115)', lineColor: 'rgb(191, 115, 115)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 金色vip
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 金色vip
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(51, 56, 62)', lineColor: 'rgb(51, 56, 62)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 绿叶
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 绿叶
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(40, 193, 84)', lineColor: 'rgb(40, 193, 84)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 小黄人
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 小黄人
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(51, 51, 51)', lineColor: 'rgb(51, 51, 51)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 薄荷
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 薄荷
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(104, 204, 202)', lineColor: 'rgb(104, 204, 202)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 粉红葡萄
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 粉红葡萄
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(166, 101, 106)', lineColor: 'rgb(166, 101, 106)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 浪漫紫
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 浪漫紫
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(123, 115, 191)', lineColor: 'rgb(123, 115, 191)',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 天清绿
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 天清绿
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: '#fff', lineColor: '#fff',

View File

@ -1,11 +1,7 @@
import defaultTheme from './default' import defaultTheme from './default'
import merge from 'deepmerge' import merge from 'deepmerge'
/** // 活力橙
* @Author: 王林
* @Date: 2021-04-11 15:22:18
* @Desc: 活力橙
*/
export default merge(defaultTheme, { export default merge(defaultTheme, {
// 连线的颜色 // 连线的颜色
lineColor: 'rgb(254, 146, 0)', lineColor: 'rgb(254, 146, 0)',

View File

@ -1,8 +1,4 @@
/** // 标签颜色列表
* @Author: 王林
* @Date: 2021-06-24 21:42:07
* @Desc: 标签颜色列表
*/
export const tagColorList = [ export const tagColorList = [
{ {
color: 'rgb(77, 65, 0)', color: 'rgb(77, 65, 0)',
@ -26,12 +22,7 @@ export const tagColorList = [
} }
] ]
/** // 布局结构列表
* javascript comment
* @Author: 王林25
* @Date: 2021-07-13 15:56:28
* @Desc: 布局结构列表
*/
export const layoutList = [ export const layoutList = [
{ {
name: '逻辑结构图', name: '逻辑结构图',
@ -61,11 +52,7 @@ export const layoutValueList = [
'organizationStructure' 'organizationStructure'
] ]
/** // 主题列表
* @Author: 王林
* @Date: 2021-06-24 22:58:42
* @Desc: 主题列表
*/
export const themeList = [ export const themeList = [
{ {
name: '默认', name: '默认',

View File

@ -1,9 +1,4 @@
/** // 深度优先遍历树
* javascript comment
* @Author: 王林25
* @Date: 2021-04-06 14:13:17
* @Desc: 深度优先遍历树
*/
export const walk = ( export const walk = (
root, root,
parent, parent,
@ -34,12 +29,7 @@ export const walk = (
afterCallback && afterCallback(root, parent, isRoot, layerIndex, index) afterCallback && afterCallback(root, parent, isRoot, layerIndex, index)
} }
/** // 广度优先遍历树
* javascript comment
* @Author: 王林25
* @Date: 2021-04-07 18:47:20
* @Desc: 广度优先遍历树
*/
export const bfsWalk = (root, callback) => { export const bfsWalk = (root, callback) => {
callback(root) callback(root)
let stack = [root] let stack = [root]
@ -60,12 +50,7 @@ export const bfsWalk = (root, callback) => {
} }
} }
/** // 缩放图片尺寸
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 10:44:54
* @Desc: 缩放图片尺寸
*/
export const resizeImgSize = (width, height, maxWidth, maxHeight) => { export const resizeImgSize = (width, height, maxWidth, maxHeight) => {
let nRatio = width / height let nRatio = width / height
let arr = [] let arr = []
@ -98,12 +83,7 @@ export const resizeImgSize = (width, height, maxWidth, maxHeight) => {
return arr return arr
} }
/** // 缩放图片
* javascript comment
* @Author: 王林25
* @Date: 2021-04-09 10:18:42
* @Desc: 缩放图片
*/
export const resizeImg = (imgUrl, maxWidth, maxHeight) => { export const resizeImg = (imgUrl, maxWidth, maxHeight) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let img = new Image() let img = new Image()
@ -123,11 +103,7 @@ export const resizeImg = (imgUrl, maxWidth, maxHeight) => {
}) })
} }
/** // 从头html结构字符串里获取带换行符的字符串
* @Author: 王林
* @Date: 2021-05-04 12:26:56
* @Desc: 从头html结构字符串里获取带换行符的字符串
*/
export const getStrWithBrFromHtml = str => { export const getStrWithBrFromHtml = str => {
str = str.replace(/<br>/gim, '\n') str = str.replace(/<br>/gim, '\n')
let el = document.createElement('div') let el = document.createElement('div')
@ -136,11 +112,7 @@ export const getStrWithBrFromHtml = str => {
return str return str
} }
/** // 极简的深拷贝
* @Author: 王林
* @Date: 2021-05-04 14:45:39
* @Desc: 极简的深拷贝
*/
export const simpleDeepClone = data => { export const simpleDeepClone = data => {
try { try {
return JSON.parse(JSON.stringify(data)) return JSON.parse(JSON.stringify(data))
@ -149,11 +121,7 @@ export const simpleDeepClone = data => {
} }
} }
/** // 复制渲染树数据
* @Author: 王林
* @Date: 2021-05-04 14:40:11
* @Desc: 复制渲染树数据
*/
export const copyRenderTree = (tree, root) => { export const copyRenderTree = (tree, root) => {
tree.data = simpleDeepClone(root.data) tree.data = simpleDeepClone(root.data)
tree.children = [] tree.children = []
@ -165,11 +133,7 @@ export const copyRenderTree = (tree, root) => {
return tree return tree
} }
/** // 复制节点树数据
* @Author: 王林
* @Date: 2021-05-04 14:40:11
* @Desc: 复制节点树数据
*/
export const copyNodeTree = (tree, root, removeActiveState = false) => { export const copyNodeTree = (tree, root, removeActiveState = false) => {
tree.data = simpleDeepClone(root.nodeData ? root.nodeData.data : root.data) tree.data = simpleDeepClone(root.nodeData ? root.nodeData.data : root.data)
if (removeActiveState) { if (removeActiveState) {
@ -192,11 +156,7 @@ export const copyNodeTree = (tree, root, removeActiveState = false) => {
return tree return tree
} }
/** // 图片转成dataURL
* @Author: 王林
* @Date: 2021-07-04 09:08:43
* @Desc: 图片转成dataURL
*/
export const imgToDataUrl = src => { export const imgToDataUrl = src => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const img = new Image() const img = new Image()
@ -222,11 +182,7 @@ export const imgToDataUrl = src => {
}) })
} }
/** // 下载文件
* @Author: 王林
* @Date: 2021-07-04 16:20:06
* @Desc: 下载文件
*/
export const downloadFile = (file, fileName) => { export const downloadFile = (file, fileName) => {
let a = document.createElement('a') let a = document.createElement('a')
a.href = file a.href = file
@ -234,11 +190,7 @@ export const downloadFile = (file, fileName) => {
a.click() a.click()
} }
/** // 节流函数
* @Author: 王林
* @Date: 2021-07-11 10:36:47
* @Desc: 节流函数
*/
export const throttle = (fn, time = 300, ctx) => { export const throttle = (fn, time = 300, ctx) => {
let timer = null let timer = null
return () => { return () => {
@ -252,12 +204,7 @@ export const throttle = (fn, time = 300, ctx) => {
} }
} }
/** // 异步执行任务队列
* javascript comment
* @Author: 王林25
* @Date: 2021-07-12 10:27:36
* @Desc: 异步执行任务队列
*/
export const asyncRun = (taskList, callback = () => {}) => { export const asyncRun = (taskList, callback = () => {}) => {
let index = 0 let index = 0
let len = taskList.length let len = taskList.length