import { IStoreState, ID, ISelectionType, ISelection, ICell } from '../../index.data'; import { pickPatch } from '../../utils'; import { getCell, getCellByij, getCellij } from '../selectors'; /** * 设置selection相关内容 * @param state * @type 行 和 cell 两种选择模式 * @id 如果是选行模式, 则指rowid, 否则指cellid * @return selection相关 */ export function setSelection( state: IStoreState, type: 'cell' | 'row', id: ID, forceClear = false, ): ISelection | {} { const lastSelection = { selectionType: state.selectionType, selectedRowRange: state.selectedRowRange, selectedColumnRange: state.selectedColumnRange, selectedCellRange: state.selectedCellRange, }; const clear = forceClear || type !== lastSelection.selectionType; const result = { selectionType: type } as ISelection; if (type === 'row') { if (clear) { result['selectedRowRange'] = [id, id]; } else { result['selectedRowRange'] = [lastSelection.selectedRowRange[0], id]; } } else if (type === 'cell') { if (clear) { result['selectedCellRange'] = [id, id]; } else { result['selectedCellRange'] = [lastSelection.selectedCellRange[0], id]; } } else if (type === 'column') { if (clear) { result['selectedColumnRange'] = [id, id]; } else { result['selectedColumnRange'] = [lastSelection.selectedColumnRange[0], id]; } } return pickPatch(state, { ...result, mode: 'view' }); } /** * 反选全部 * deprecated 直接使用状态机 */ // export function clearSelection(state: IStoreState): ISelection { // return { // selectionType: null, // } as any; // } //////////////////////////////// 光标上下移动 ///////////////////////////////////////////////////////// // 是否可以改变当前选择 function _canChangeCellSelection(state: IStoreState): boolean { const { selectionType, selectedCellRange } = state; if (selectionType !== 'cell') return false; // 当前未选择单元格, 或多选了单元格 if (selectedCellRange.length < 2 || selectedCellRange[0] !== selectedCellRange[1]) return false; return true; } export function selectCellAbove(state: IStoreState) { if (!_canChangeCellSelection(state)) return; const { selectedCellRange } = state; const selectedCell = getCell(state, selectedCellRange[0])!; const { i, j } = getCellij(state, selectedCell.id); // 第一行 if (i === 0) return; const nextCell = getCellByij(state, i - 1, j); return setSelection(state, 'cell', nextCell!.id, true); } export function selectCellBelow(state: IStoreState) { if (!_canChangeCellSelection(state)) return; const { selectedCellRange } = state; const selectedCell = getCell(state, selectedCellRange[0])!; const { i, j } = getCellij(state, selectedCell.id); // 最后一行 if (i === state.rows.length - 1) return; const nextCell = getCellByij(state, i! + (selectedCell.rowspan || 1), j!); return setSelection(state, 'cell', nextCell!.id, true); } export function selectCellLeft(state: IStoreState) { if (!_canChangeCellSelection(state)) return; const { selectedCellRange } = state; const selectedCell = getCell(state, selectedCellRange[0])!; const { i, j } = getCellij(state, selectedCell.id); // 第一列 if (j === 0) return; const nextCell = getCellByij(state, i, j - 1); return setSelection(state, 'cell', nextCell!.id, true); } export function selectCellRight(state: IStoreState) { if (!_canChangeCellSelection(state)) return; const { selectedCellRange } = state; const selectedCell = getCell(state, selectedCellRange[0])!; const { i, j } = getCellij(state, selectedCell.id); // 第一列 if (j === state.columns.length - 1) return; const nextCell = getCellByij(state, i, j + (selectedCell.colspan || 1)); return setSelection(state, 'cell', nextCell!.id, true); }