|
@@ -1,5 +1,11 @@
|
|
|
<template>
|
|
|
- <TempTable :data="tData" ref="tableRef" :id="data.id" />
|
|
|
+ <TempTable
|
|
|
+ :data="tData"
|
|
|
+ ref="tableRef"
|
|
|
+ :id="data.id"
|
|
|
+ @update-content="submitInputHandler"
|
|
|
+ editer
|
|
|
+ />
|
|
|
<PropertyUpdate
|
|
|
:describes="describes"
|
|
|
:data="data"
|
|
@@ -12,23 +18,10 @@
|
|
|
@show="menuShowHandler"
|
|
|
@hide="menuHideHandler"
|
|
|
/>
|
|
|
-
|
|
|
- <template v-for="(raw, rawNdx) in data.content">
|
|
|
- <template v-for="(_, colNdx) in raw">
|
|
|
- <TextDom
|
|
|
- v-if="tableRef?.texts[rawNdx] && tableRef?.texts[rawNdx][colNdx]?.getNode()"
|
|
|
- :shape="tableRef.texts[rawNdx][colNdx].getNode()!"
|
|
|
- @submit="(val) => submitInputHandler(val, rawNdx, colNdx)"
|
|
|
- @show="showInputHandler"
|
|
|
- @hide="quitInputHandler"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
import TempTable from "./temp-table.vue";
|
|
|
-import TextDom from "../share/text-area.vue";
|
|
|
import { TableData, getMouseStyle, defaultStyle, TableCollData } from "./index.ts";
|
|
|
import { PropertyUpdate, Operate } from "../../propertys";
|
|
|
import { useComponentStatus } from "@/core/hook/use-component.ts";
|
|
@@ -65,9 +58,9 @@ type TableRef = {
|
|
|
getMouseIntersect: (
|
|
|
pos?: Pos
|
|
|
) => {
|
|
|
- rawBorderNdx: number;
|
|
|
+ rowBorderNdx: number;
|
|
|
colBorderNdx: number;
|
|
|
- rawNdx: number;
|
|
|
+ rowNdx: number;
|
|
|
colNdx: number;
|
|
|
};
|
|
|
};
|
|
@@ -75,7 +68,7 @@ const tableRef = ref<TableRef>();
|
|
|
const status = useMouseShapeStatus(computed(() => tableRef.value?.shape));
|
|
|
let inter: Pick<
|
|
|
ReturnType<TableRef["getMouseIntersect"]>,
|
|
|
- "rawBorderNdx" | "colBorderNdx"
|
|
|
+ "rowBorderNdx" | "colBorderNdx"
|
|
|
> | null = null;
|
|
|
const pos = usePointerPos();
|
|
|
const cursor = useCursor();
|
|
@@ -89,9 +82,9 @@ watch(
|
|
|
() => pos.value && tableRef.value?.getMouseIntersect(pos.value),
|
|
|
(inter, _, onCleanup) => {
|
|
|
const $shape = shape.value?.getNode();
|
|
|
- if ($shape && inter && (~inter.colBorderNdx || ~inter.rawBorderNdx)) {
|
|
|
+ if ($shape && inter && (~inter.colBorderNdx || ~inter.rowBorderNdx)) {
|
|
|
onCleanup(
|
|
|
- cursor.push(getResizeCorsur(!~inter.rawBorderNdx, $shape.rotation()))
|
|
|
+ cursor.push(getResizeCorsur(!~inter.rowBorderNdx, $shape.rotation()))
|
|
|
);
|
|
|
}
|
|
|
},
|
|
@@ -107,9 +100,9 @@ watch(
|
|
|
if (!press) return;
|
|
|
inter = tableRef.value?.getMouseIntersect() || null;
|
|
|
const $shape = shape.value?.getNode();
|
|
|
- if ($shape && inter && (~inter.colBorderNdx || ~inter.rawBorderNdx)) {
|
|
|
+ if ($shape && inter && (~inter.colBorderNdx || ~inter.rowBorderNdx)) {
|
|
|
const pop = cursor.push(
|
|
|
- getResizeCorsur(!~inter.rawBorderNdx, shape.value?.getNode().rotation())
|
|
|
+ getResizeCorsur(!~inter.rowBorderNdx, shape.value?.getNode().rotation())
|
|
|
);
|
|
|
const isActive = shapesStatus.actives.includes($shape);
|
|
|
if (isActive) {
|
|
@@ -139,15 +132,15 @@ const matToData = (data: TableData, mat: Transform, initData?: TableData) => {
|
|
|
initData = copy(data);
|
|
|
}
|
|
|
const dec = mat.decompose();
|
|
|
- if (!inter || (!~inter.colBorderNdx && !~inter.rawBorderNdx)) {
|
|
|
+ if (!inter || (!~inter.colBorderNdx && !~inter.rowBorderNdx)) {
|
|
|
const oldData = copy(data);
|
|
|
data.height = dec.scaleY * initData.height;
|
|
|
data.width = dec.scaleX * initData.width;
|
|
|
|
|
|
let w = 0;
|
|
|
let h = 0;
|
|
|
- data.content.forEach((raw, rndx) => {
|
|
|
- raw.forEach((col, cndx) => {
|
|
|
+ data.content.forEach((row, rndx) => {
|
|
|
+ row.forEach((col, cndx) => {
|
|
|
const initCol = initData.content[rndx][cndx];
|
|
|
const minSize = getColMinSize(initCol);
|
|
|
col.width = Math.max(minSize.w, data.width * (initCol.width / initData.width));
|
|
@@ -190,10 +183,10 @@ const matToData = (data: TableData, mat: Transform, initData?: TableData) => {
|
|
|
x: dec.x - initDec.x,
|
|
|
y: dec.y - initDec.y,
|
|
|
});
|
|
|
- if (~inter.rawBorderNdx) {
|
|
|
- const ndxRaw = inter.rawBorderNdx - 1;
|
|
|
- const ndx = ndxRaw === -1 ? 0 : ndxRaw;
|
|
|
- let offset = ndxRaw === -1 ? -move.y : move.y;
|
|
|
+ if (~inter.rowBorderNdx) {
|
|
|
+ const ndxrow = inter.rowBorderNdx - 1;
|
|
|
+ const ndx = ndxrow === -1 ? 0 : ndxrow;
|
|
|
+ let offset = ndxrow === -1 ? -move.y : move.y;
|
|
|
const minSize = getColMinSize(data.content[ndx][0]);
|
|
|
const h = Math.max(minSize.h, initData.content[ndx][0].height + offset);
|
|
|
offset = h - initData.content[ndx][0].height;
|
|
@@ -203,7 +196,7 @@ const matToData = (data: TableData, mat: Transform, initData?: TableData) => {
|
|
|
);
|
|
|
data.height = initData.height + offset;
|
|
|
|
|
|
- if (ndxRaw === -1) {
|
|
|
+ if (ndxrow === -1) {
|
|
|
const translate = new Transform()
|
|
|
.rotate(MathUtils.degToRad(dec.rotation))
|
|
|
.point({ x: 0, y: -offset });
|
|
@@ -212,9 +205,9 @@ const matToData = (data: TableData, mat: Transform, initData?: TableData) => {
|
|
|
.multiply(new Transform(initData.mat)).m;
|
|
|
}
|
|
|
} else {
|
|
|
- const ndxRaw = inter.colBorderNdx - 1;
|
|
|
- const ndx = ndxRaw === -1 ? 0 : ndxRaw;
|
|
|
- let offset = ndxRaw === -1 ? -move.x : move.x;
|
|
|
+ const ndxrow = inter.colBorderNdx - 1;
|
|
|
+ const ndx = ndxrow === -1 ? 0 : ndxrow;
|
|
|
+ let offset = ndxrow === -1 ? -move.x : move.x;
|
|
|
const minSize = getColMinSize(data.content[0][ndx]);
|
|
|
const w = Math.max(minSize.w, initData.content[0][ndx].width + offset);
|
|
|
offset = w - initData.content[0][ndx].width;
|
|
@@ -222,7 +215,7 @@ const matToData = (data: TableData, mat: Transform, initData?: TableData) => {
|
|
|
row[ndx].width = initData.content[rowNdx][ndx].width + offset;
|
|
|
});
|
|
|
data.width = initData.width + offset;
|
|
|
- if (ndxRaw === -1) {
|
|
|
+ if (ndxrow === -1) {
|
|
|
const translate = new Transform()
|
|
|
.rotate(MathUtils.degToRad(dec.rotation))
|
|
|
.point({ x: -offset, y: 0 });
|
|
@@ -312,8 +305,8 @@ watchEffect((onCleanup) => {
|
|
|
watch(
|
|
|
() => data.value.fontSize,
|
|
|
() => {
|
|
|
- data.value.content.forEach((raw) => {
|
|
|
- raw.forEach((col) => {
|
|
|
+ data.value.content.forEach((row) => {
|
|
|
+ row.forEach((col) => {
|
|
|
col.fontSize = data.value.fontSize;
|
|
|
});
|
|
|
});
|
|
@@ -328,8 +321,8 @@ watch(
|
|
|
|
|
|
watchEffect(
|
|
|
() => {
|
|
|
- data.value.content.forEach((raw) => {
|
|
|
- raw.forEach((col) => {
|
|
|
+ data.value.content.forEach((row) => {
|
|
|
+ row.forEach((col) => {
|
|
|
col.fontColor = data.value.fontColor;
|
|
|
col.fontStyle = data.value.fontStyle;
|
|
|
col.align = data.value.align;
|
|
@@ -347,13 +340,13 @@ const menuShowHandler = () => {
|
|
|
icon: Plus,
|
|
|
label: "插入行",
|
|
|
handler: () => {
|
|
|
- const tempRaw = data.value.content[config.rawNdx];
|
|
|
+ const temprow = data.value.content[config.rowNdx];
|
|
|
data.value.content.splice(
|
|
|
- config.rawNdx,
|
|
|
+ config.rowNdx,
|
|
|
0,
|
|
|
- tempRaw.map((item) => ({ ...item, content: "" }))
|
|
|
+ temprow.map((item) => ({ ...item, content: "" }))
|
|
|
);
|
|
|
- data.value.height += tempRaw[0].height;
|
|
|
+ data.value.height += temprow[0].height;
|
|
|
sync(data.value);
|
|
|
emit("updateShape", { ...data.value });
|
|
|
},
|
|
@@ -362,9 +355,9 @@ const menuShowHandler = () => {
|
|
|
icon: Minus,
|
|
|
label: "删除行",
|
|
|
handler: () => {
|
|
|
- const tempRaw = data.value.content[config.rawNdx];
|
|
|
- data.value.content.splice(config.rawNdx, 1);
|
|
|
- data.value.height -= tempRaw[0].height;
|
|
|
+ const temprow = data.value.content[config.rowNdx];
|
|
|
+ data.value.content.splice(config.rowNdx, 1);
|
|
|
+ data.value.height -= temprow[0].height;
|
|
|
if (data.value.content.length === 0) {
|
|
|
emit("delShape");
|
|
|
} else {
|
|
@@ -379,8 +372,8 @@ const menuShowHandler = () => {
|
|
|
handler: () => {
|
|
|
const tempCol = data.value.content[0][config.colNdx];
|
|
|
for (let i = 0; i < data.value.content.length; i++) {
|
|
|
- const raw = data.value.content[i];
|
|
|
- raw.splice(config.colNdx, 0, { ...tempCol, content: "" });
|
|
|
+ const row = data.value.content[i];
|
|
|
+ row.splice(config.colNdx, 0, { ...tempCol, content: "" });
|
|
|
}
|
|
|
data.value.width += tempCol.width;
|
|
|
sync(data.value);
|
|
@@ -393,8 +386,8 @@ const menuShowHandler = () => {
|
|
|
handler: () => {
|
|
|
const tempCol = data.value.content[0][config.colNdx];
|
|
|
for (let i = 0; i < data.value.content.length; i++) {
|
|
|
- const raw = data.value.content[i];
|
|
|
- raw.splice(config.colNdx, 1);
|
|
|
+ const row = data.value.content[i];
|
|
|
+ row.splice(config.colNdx, 1);
|
|
|
}
|
|
|
data.value.width -= tempCol.width;
|
|
|
if (data.value.content[0].length === 0) {
|
|
@@ -418,22 +411,12 @@ const menuHideHandler = () => {
|
|
|
addMenu = [];
|
|
|
};
|
|
|
|
|
|
-const showText = ref(false);
|
|
|
-const showInputHandler = () => {
|
|
|
- showText.value = true;
|
|
|
- const ndx = shapesStatus.actives.indexOf(shape.value!.getNode());
|
|
|
- if (~ndx) {
|
|
|
- shapesStatus.actives = shapesStatus.actives.filter(
|
|
|
- (v) => v !== shape.value!.getNode()
|
|
|
- );
|
|
|
- }
|
|
|
-};
|
|
|
-const quitInputHandler = () => {
|
|
|
- showText.value = false;
|
|
|
-};
|
|
|
-const submitInputHandler = (val: string, rawNdx: number, colNdx: number) => {
|
|
|
- quitInputHandler();
|
|
|
- data.value.content[rawNdx][colNdx].content = val;
|
|
|
+const submitInputHandler = (playData: {
|
|
|
+ val: string;
|
|
|
+ rowNdx: number;
|
|
|
+ colNdx: number;
|
|
|
+}) => {
|
|
|
+ data.value.content[playData.rowNdx][playData.colNdx].content = playData.val;
|
|
|
emit("updateShape", data.value);
|
|
|
};
|
|
|
</script>
|