table tool optimization
This commit is contained in:
@@ -27,6 +27,7 @@ export class TableTool {
|
||||
private toolRowContainer: HTMLDivElement | null
|
||||
private toolColContainer: HTMLDivElement | null
|
||||
private anchorLine: HTMLDivElement | null
|
||||
private toolBox: HTMLDivElement | null
|
||||
private mousedownX: number
|
||||
private mousedownY: number
|
||||
|
||||
@@ -40,6 +41,7 @@ export class TableTool {
|
||||
this.toolRowContainer = null
|
||||
this.toolColContainer = null
|
||||
this.anchorLine = null
|
||||
this.toolBox = null
|
||||
this.mousedownX = 0
|
||||
this.mousedownY = 0
|
||||
}
|
||||
@@ -47,6 +49,7 @@ export class TableTool {
|
||||
public dispose() {
|
||||
this.toolRowContainer?.remove()
|
||||
this.toolColContainer?.remove()
|
||||
this.toolBox?.remove()
|
||||
}
|
||||
|
||||
public render(element: IElement, position: IElementPosition) {
|
||||
@@ -125,6 +128,66 @@ export class TableTool {
|
||||
colContainer.style.top = `${leftTop[1] + prePageHeight}px`
|
||||
this.container.append(colContainer)
|
||||
this.toolColContainer = colContainer
|
||||
|
||||
if (!trList?.length) return
|
||||
|
||||
// 绘制边框拖拽
|
||||
const LINE_THRESHOLD_VALUE = 3
|
||||
const tableHeight = rowList.reduce((pre, cur) => pre + cur, 0)
|
||||
const tableWidth = colList.reduce((pre, cur) => pre + cur, 0)
|
||||
|
||||
// 渲染工具外部容器
|
||||
const tableLineTool = document.createElement('div')
|
||||
tableLineTool.classList.add(`${EDITOR_PREFIX}-table-tool__line`)
|
||||
tableLineTool.style.height = tableHeight * scale + 'px'
|
||||
tableLineTool.style.width = tableWidth * scale + 'px'
|
||||
tableLineTool.style.left = `${leftTop[0]}px`
|
||||
tableLineTool.style.top = `${leftTop[1] + prePageHeight}px`
|
||||
|
||||
for (let i = 0, len = trList.length || 0; i < len; i++) {
|
||||
const tr = trList[i]
|
||||
for (let j = 0; j < tr.tdList.length; j++) {
|
||||
const td = tr.tdList[j]
|
||||
const rowLine = document.createElement('div')
|
||||
rowLine.classList.add(`${EDITOR_PREFIX}-table-tool__rline__resize`)
|
||||
rowLine.dataset.rowIndex = `${td.rowIndex}`
|
||||
rowLine.style.width = td.width! * scale + 'px'
|
||||
rowLine.style.height = LINE_THRESHOLD_VALUE + 'px'
|
||||
rowLine.style.top = td.y! * scale + td.height! * scale - LINE_THRESHOLD_VALUE / 2 + 'px'
|
||||
rowLine.style.left = td.x! * scale + 'px'
|
||||
rowLine.onmousedown = (evt) => {
|
||||
this._mousedown({
|
||||
evt,
|
||||
element,
|
||||
position,
|
||||
index: td.rowIndex || 0,
|
||||
order: TableOrder.ROW
|
||||
})
|
||||
}
|
||||
tableLineTool.appendChild(rowLine)
|
||||
|
||||
const colLine = document.createElement('div')
|
||||
colLine.classList.add(`${EDITOR_PREFIX}-table-tool__cline__resize`)
|
||||
colLine.dataset.colIndex = `${td.colIndex}`
|
||||
colLine.style.height = td.height! * scale + 'px'
|
||||
colLine.style.width = LINE_THRESHOLD_VALUE + 'px'
|
||||
colLine.style.left = td.x! * scale + (td.width! * scale) - LINE_THRESHOLD_VALUE / 2 + 'px'
|
||||
colLine.style.top = td.y! * scale + 'px'
|
||||
colLine.onmousedown = (evt) => {
|
||||
this._mousedown({
|
||||
evt,
|
||||
element,
|
||||
position,
|
||||
index: td.colIndex || 0,
|
||||
order: TableOrder.COL
|
||||
})
|
||||
}
|
||||
tableLineTool.appendChild(colLine)
|
||||
}
|
||||
}
|
||||
|
||||
this.toolBox = tableLineTool
|
||||
this.container.append(tableLineTool)
|
||||
}
|
||||
|
||||
private _mousedown(payload: IAnchorMouseDown) {
|
||||
@@ -190,7 +253,9 @@ export class TableTool {
|
||||
const curColWidth = colgroup[index].width
|
||||
// 最小移动距离计算
|
||||
const moveColWidth = curColWidth + dx
|
||||
if (moveColWidth < this.minTdWidth) {
|
||||
const nextColWidth = colgroup[index + 1]?.width
|
||||
// 如果移动距离小于最小宽度,或者大于当前列和下一列宽度之和,那么就不移动
|
||||
if (moveColWidth < this.minTdWidth || moveColWidth > curColWidth + nextColWidth) {
|
||||
dx = this.minTdWidth - curColWidth
|
||||
}
|
||||
// 最大移动距离计算
|
||||
@@ -251,4 +316,4 @@ export class TableTool {
|
||||
return { dx, dy }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user