Skip to content

Commit 50dd04a

Browse files
author
guqiankun
committed
feat: add multi line decorations
1 parent 38cdbcc commit 50dd04a

3 files changed

Lines changed: 71 additions & 22 deletions

File tree

packages/alex/src/core/editor/editor.module.ts

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -458,28 +458,54 @@ class EditorSpecialContribution
458458
)
459459
);
460460
let oldClickDecorations: string[] = [];
461-
const highlightLine = (lineNumber: number | [number, number]) => {
462-
const startLineNumber = typeof lineNumber === 'number' ? lineNumber : lineNumber[0];
463-
const endLineNumber = typeof lineNumber === 'number' ? lineNumber : lineNumber[1];
464-
// 延迟高亮,否则不居中
465-
oldClickDecorations = editor.monacoEditor.deltaDecorations(oldClickDecorations, [
466-
{
467-
range: new monaco.Range(startLineNumber, 1, endLineNumber, 1),
468-
options: {
469-
isWholeLine: true,
470-
linesDecorationsClassName: styles['line-anchor'],
471-
className: styles['line-content'],
461+
const highlightLine = (lineNumber: number | [number, number] | Array<[number, number]>) => {
462+
let centerLine: number;
463+
let newDecorations: monaco.editor.IModelDeltaDecoration[];
464+
if (Array.isArray(lineNumber) && Array.isArray(lineNumber[0])) {
465+
centerLine = lineNumber[0][0];
466+
newDecorations = lineNumber.map((line) => {
467+
return {
468+
range: new monaco.Range(line[0], 1, line[1], 1),
469+
options: {
470+
description: 'line-anchor-description',
471+
isWholeLine: true,
472+
linesDecorationsClassName: styles['line-anchor'],
473+
className: styles['line-content'],
474+
},
475+
};
476+
});
477+
} else {
478+
const startLineNumber =
479+
typeof lineNumber === 'number' ? lineNumber : (lineNumber[0] as number);
480+
const endLineNumber =
481+
typeof lineNumber === 'number' ? lineNumber : (lineNumber[1] as number);
482+
centerLine = startLineNumber;
483+
newDecorations = [
484+
{
485+
range: new monaco.Range(startLineNumber, 1, endLineNumber, 1),
486+
options: {
487+
// @ts-ignore
488+
description: 'line-anchor-description',
489+
isWholeLine: true,
490+
linesDecorationsClassName: styles['line-anchor'],
491+
className: styles['line-content'],
492+
},
472493
},
473-
},
474-
]);
494+
];
495+
}
496+
// 延迟高亮,否则不居中
497+
oldClickDecorations = editor.monacoEditor.deltaDecorations(
498+
oldClickDecorations,
499+
newDecorations
500+
);
475501
setTimeout(() => {
476502
if (this.propsService.props.editorConfig?.stretchHeight) {
477503
const firstLine = document.querySelector(`.${styles['line-anchor']}`) as HTMLElement;
478504
if (firstLine) {
479505
firstLine.scrollIntoView({ block: 'center' });
480506
}
481507
} else {
482-
editor.monacoEditor.revealLineInCenterIfOutsideViewport(startLineNumber);
508+
editor.monacoEditor.revealLineInCenterIfOutsideViewport(centerLine);
483509
}
484510
}, 0);
485511
};
@@ -496,7 +522,9 @@ class EditorSpecialContribution
496522
let nextLineNumber: number | [number, number] = lineNumber;
497523
if (event?.event?.shiftKey && lastLineNumber) {
498524
let startLineNumber = Array.isArray(lastLineNumber)
499-
? lastLineNumber[0]
525+
? Array.isArray(lastLineNumber[0])
526+
? lastLineNumber[0][0]
527+
: lastLineNumber[0]
500528
: lastLineNumber;
501529
if (startLineNumber > nextLineNumber) {
502530
nextLineNumber = [nextLineNumber, startLineNumber];

packages/alex/src/core/editor/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface DocumentModel {
2020
/**
2121
* 展示文件行号,如果传入数组,则表示多行
2222
*/
23-
lineNumber?: number | [number, number];
23+
lineNumber?: number | [number, number] | Array<[number, number]>;
2424
/**
2525
* 行号变更事件
2626
*/

packages/integrations/src/editor/index.tsx

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ const App = () => {
5353
const [ref, setRef] = useState('');
5454
const [filepath, setFilePath] = useState('');
5555
const [encoding, setEncoding] = useState<'utf8' | 'gbk' | undefined>('utf8');
56-
const [lineNumber, setLineNumber] = useState<number | [number, number] | undefined>();
56+
const [lineNumber, setLineNumber] = useState<
57+
number | [number, number] | Array<[number, number]> | undefined
58+
>([
59+
[10, 20],
60+
[30, 40],
61+
]);
5762

5863
const readFile = async (filepath: string) => {
5964
const res = await fetch(
@@ -73,6 +78,12 @@ const App = () => {
7378
setFilePath(filepath);
7479
};
7580

81+
function setLineNumberFn(value) {
82+
console.log(value);
83+
84+
setLineNumber(JSON.parse(value));
85+
}
86+
7687
return (
7788
<div style={{ padding: 8 }}>
7889
<div style={{ display: 'flex', marginBottom: 8 }}>
@@ -102,15 +113,25 @@ const App = () => {
102113
))}
103114
</Select>
104115
<Select
105-
value={lineNumber}
106-
onChange={setLineNumber}
116+
value={JSON.stringify(lineNumber)}
117+
onChange={setLineNumberFn}
107118
size="small"
108119
style={{ width: 120, marginRight: 8 }}
109120
placeholder="更改选中行"
110121
>
111-
{[10, 30, 100].map((line) => (
112-
<Select.Option key={line} value={line}>
113-
{line}
122+
{[
123+
10,
124+
30,
125+
100,
126+
[10, 20],
127+
[
128+
[30, 35],
129+
[40, 50],
130+
[66, 77],
131+
],
132+
].map((line, index) => (
133+
<Select.Option key={index} value={JSON.stringify(line)}>
134+
{JSON.stringify(line)}
114135
</Select.Option>
115136
))}
116137
</Select>

0 commit comments

Comments
 (0)