123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import { useStage } from "@/core/hook/use-global-vars";
- import { useUnitTransform } from "@/core/hook/use-viewer";
- import { Text } from "konva/lib/shapes/Text";
- export const useGetPointerTextNdx = () => {
- const stage = useStage();
- return (shape: Text) => {
- let pointerPos = stage.value?.getNode().pointerPos;
- const str = shape.text();
- if (!pointerPos || str.length === 0) {
- return str.length;
- }
- const transform = shape.getAbsoluteTransform().invert()
- const textPos = {x: 0, y: 0}
- const finalPos = transform.point({
- x: pointerPos.x - textPos.x,
- y: pointerPos.y - textPos.y,
- });
- const width = shape.width();
- const textHeight = shape.textHeight;
- const lineNdx = Math.floor(finalPos.y / textHeight);
- const textArr = shape.textArr;
- let ndx = str.length;
- if (lineNdx >= textArr.length || lineNdx < 0) return ndx;
- console.log(textArr, lineNdx)
- const line = textArr[lineNdx];
- const hanlfSize = shape.fontSize() / 2
- let i = 0;
- let x = (width - line.width) / 2;
- let after = false;
- for (; i < line.text.length; i++) {
- const size = shape.measureSize(line.text[i]);
- x += size.width;
- if (x > finalPos.x) {
- const diff = x - finalPos.x
- console.log(diff, hanlfSize, shape.fontSize())
- if (diff < hanlfSize && line.text.length >= i + 1) {
- after = true;
- }
- break;
- }
- }
- console.log(i, after)
- if (i === line.text.length) {
- ndx = line.text.length - 1;
- after = true;
- } else {
- ndx = i;
- }
- let strNdx = 0;
- let emptyCount = 0;
- for (let i = 0; i < lineNdx; i++) {
- const cStr = textArr[i].text;
- if (!cStr) {
- // emptyCount++;
- } else if (i !== lineNdx) {
- strNdx = strNdx + str.substring(strNdx).indexOf(cStr) + cStr.length;
- emptyCount = 0;
- } else {
- strNdx = strNdx + str.substring(strNdx).indexOf(cStr);
- emptyCount = 0;
- }
- if (i !== lineNdx) {
- if (textArr[i].lastInParagraph) {
- strNdx += 1;
- }
- }
- }
- const char = line.text[ndx];
- const yStr = str.substring(strNdx + emptyCount);
- i = ndx;
- for (; i < yStr.length; i++) {
- if (yStr[i] === char) {
- break;
- }
- }
- ndx = strNdx + emptyCount + i + (after ? 1 : 0);
- if (import.meta.env.DEV) {
- console.log(
- strNdx,
- ndx,
- emptyCount,
- str.substring(strNdx + emptyCount),
- i,
- char,
- yStr,
- yStr[i]
- );
- }
- return ndx;
- };
- };
|