Skip to content

Commit b250edb

Browse files
authored
Better experience of selecting multi-lines (#651)
1 parent 7035e29 commit b250edb

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

CoreEditor/index.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ html, body {
2929
margin: 1px;
3030
}
3131

32+
.cm-gutter, .cm-gutterElement {
33+
/* Disable this to have better experience of "swipe to select multiple lines" */
34+
pointer-events: none;
35+
}
36+
3237
/* Markdown */
3338

3439
.cm-md-header:not(.cm-md-frontMatter *) {

CoreEditor/src/events/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as invisible from '../styling/nodes/invisible';
88
import * as link from '../styling/nodes/link';
99

1010
export function startObserving() {
11-
document.addEventListener('click', event => {
11+
document.addEventListener('mousedown', event => {
1212
selection.selectWholeLineIfNeeded(event);
1313
});
1414

CoreEditor/src/modules/selection/index.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { EditorView } from '@codemirror/view';
22
import { EditorSelection, Line, SelectionRange } from '@codemirror/state';
3+
import { isReleaseMode } from '../../common/env';
34
import { getClientRect } from '../../common/utils';
45

56
import { InvisiblesBehavior } from '../../config';
@@ -67,8 +68,28 @@ export function selectedMainText(): string {
6768
*/
6869
export function selectWholeLineIfNeeded(event: MouseEvent) {
6970
const target = event.target;
70-
if (target instanceof HTMLDivElement && target.classList.contains('cm-gutterElement')) {
71-
selectWholeLineAt(parseInt(target.innerText));
71+
if (!(target instanceof HTMLDivElement) || !target.classList.contains('cm-gutters')) {
72+
return;
73+
}
74+
75+
const gutterElements = [...target.querySelectorAll('.cm-gutterElement')];
76+
if (!isReleaseMode) {
77+
console.log(`Found ${gutterElements.length} gutter elements`);
78+
}
79+
80+
// For a better experience of selecting multiple lines, ".cm-gutterElement" ignores user interactions,
81+
// we need to find the actual clicked gutter element manually.
82+
const actualElement = gutterElements.find(element => {
83+
const rect = element.getBoundingClientRect();
84+
if (rect.top < event.clientY && rect.bottom > event.clientY) {
85+
return element;
86+
}
87+
88+
return undefined;
89+
}) as HTMLElement | undefined;
90+
91+
if (actualElement !== undefined) {
92+
selectWholeLineAt(parseInt(actualElement.innerText));
7293
}
7394
}
7495

0 commit comments

Comments
 (0)