50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
|
|
import { ref } from 'vue';
|
||
|
|
|
||
|
|
export function useFormulaReferenceMode() {
|
||
|
|
const active = ref(false);
|
||
|
|
const pickedCell = ref<{ row: number; col: number } | null>(null);
|
||
|
|
const caret = ref(0);
|
||
|
|
|
||
|
|
function setCaret(pos: number) {
|
||
|
|
caret.value = Math.max(0, pos);
|
||
|
|
}
|
||
|
|
|
||
|
|
function enterIfNeeded(draft: string, focused: boolean, editable: boolean) {
|
||
|
|
if (!focused || !editable) {
|
||
|
|
active.value = false;
|
||
|
|
pickedCell.value = null;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
const on = draft.trimStart().startsWith('=');
|
||
|
|
active.value = on;
|
||
|
|
if (!on) pickedCell.value = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
function exit() {
|
||
|
|
active.value = false;
|
||
|
|
pickedCell.value = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
function insertAtCaret(draft: string, text: string): string {
|
||
|
|
const pos = caret.value;
|
||
|
|
const next = draft.slice(0, pos) + text + draft.slice(pos);
|
||
|
|
caret.value = pos + text.length;
|
||
|
|
return next;
|
||
|
|
}
|
||
|
|
|
||
|
|
function pickCell(row: number, col: number) {
|
||
|
|
pickedCell.value = { row, col };
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
active,
|
||
|
|
pickedCell,
|
||
|
|
caret,
|
||
|
|
setCaret,
|
||
|
|
enterIfNeeded,
|
||
|
|
exit,
|
||
|
|
insertAtCaret,
|
||
|
|
pickCell,
|
||
|
|
};
|
||
|
|
}
|