e-virt-table
Version:
A powerful data table based on canvas. You can use it as data grid、Microsoft Excel or Google sheets. It supports virtual scroll、cell edit etc.
93 lines (92 loc) • 2.12 kB
TypeScript
import type { Align } from './types';
import type Context from './Context';
export type TextSelectionRange = {
start: number;
end: number;
};
export type TextGlyph = {
char: string;
index: number;
line: number;
x: number;
y: number;
width: number;
height: number;
};
export type TextLineItem = {
char: string;
sourceIndex: number;
ellipsis?: boolean;
};
export type TextLayoutLine = {
items: TextLineItem[];
text: string;
caretIndex: number;
lineIndex: number;
drawX: number;
drawY: number;
width: number;
segments: TextLineSegment[];
};
export type TextLineSegment = {
char: string;
itemIndex: number;
sourceIndex: number;
x: number;
width: number;
};
export type TextLayout = {
text: string;
chars: string[];
glyphs: TextGlyph[];
lines: TextLayoutLine[];
box: {
x: number;
y: number;
width: number;
height: number;
};
contentBox: {
x: number;
y: number;
width: number;
height: number;
};
contentY: number;
lineHeight: number;
font: string;
color: string;
align: Align;
ellipsis: boolean;
};
export default class TextSelector {
private static readonly DRAG_THRESHOLD;
private ctx;
private layouts;
private activeCellKey;
private selectionStart;
private selectionEnd;
private pending;
constructor(ctx: Context);
private get canSelect();
/** 跨表头列或从表头拖入 body 时,让位给列/区域选择 */
private yieldToColumnDrag;
private onMouseDown;
private onMouseMove;
private tryStartDrag;
private onMouseUp;
private onCopyKeydown;
/**
* 命中最顶层文字(固定列/表头后绘制会覆盖普通单元格,取最后一个命中)。
*/
private hitTest;
private updateSelection;
private hitTestText;
clearLayouts(): void;
draw(): void;
private drawTextSelection;
private getSelectionRange;
private getSelectedText;
private resetSelection;
destroy(): void;
}