Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { GlobalPointerMoveMonitor } from '../../globalPointerMoveMonitor.js';
7
import { Widget } from '../widget.js';
8
import { TimeoutTimer } from '../../../common/async.js';
9
import { ThemeIcon } from '../../../common/themables.js';
10
import * as dom from '../../dom.js';
11
12
/**
13
* The arrow image size.
14
*/
15
export const ARROW_IMG_SIZE = 11;
16
17
export interface ScrollbarArrowOptions {
18
onActivate: () => void;
19
className: string;
20
icon: ThemeIcon;
21
22
bgWidth: number;
23
bgHeight: number;
24
25
top?: number;
26
left?: number;
27
bottom?: number;
28
right?: number;
29
}
30
31
export class ScrollbarArrow extends Widget {
32
33
private _onActivate: () => void;
34
public bgDomNode: HTMLElement;
35
public domNode: HTMLElement;
36
private _pointerdownRepeatTimer: dom.WindowIntervalTimer;
37
private _pointerdownScheduleRepeatTimer: TimeoutTimer;
38
private _pointerMoveMonitor: GlobalPointerMoveMonitor;
39
40
constructor(opts: ScrollbarArrowOptions) {
41
super();
42
this._onActivate = opts.onActivate;
43
44
this.bgDomNode = document.createElement('div');
45
this.bgDomNode.className = 'arrow-background';
46
this.bgDomNode.style.position = 'absolute';
47
this.bgDomNode.style.width = opts.bgWidth + 'px';
48
this.bgDomNode.style.height = opts.bgHeight + 'px';
49
if (typeof opts.top !== 'undefined') {
50
this.bgDomNode.style.top = '0px';
51
}
52
if (typeof opts.left !== 'undefined') {
53
this.bgDomNode.style.left = '0px';
54
}
55
if (typeof opts.bottom !== 'undefined') {
56
this.bgDomNode.style.bottom = '0px';
57
}
58
if (typeof opts.right !== 'undefined') {
59
this.bgDomNode.style.right = '0px';
60
}
61
62
this.domNode = document.createElement('div');
63
this.domNode.className = opts.className;
64
this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));
65
66
this.domNode.style.position = 'absolute';
67
this.domNode.style.width = ARROW_IMG_SIZE + 'px';
68
this.domNode.style.height = ARROW_IMG_SIZE + 'px';
69
if (typeof opts.top !== 'undefined') {
70
this.domNode.style.top = opts.top + 'px';
71
}
72
if (typeof opts.left !== 'undefined') {
73
this.domNode.style.left = opts.left + 'px';
74
}
75
if (typeof opts.bottom !== 'undefined') {
76
this.domNode.style.bottom = opts.bottom + 'px';
77
}
78
if (typeof opts.right !== 'undefined') {
79
this.domNode.style.right = opts.right + 'px';
80
}
81
82
this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());
83
this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));
84
this._register(dom.addStandardDisposableListener(this.domNode, dom.EventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));
85
86
this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());
87
this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());
88
}
89
90
private _arrowPointerDown(e: PointerEvent): void {
91
if (!e.target || !(e.target instanceof Element)) {
92
return;
93
}
94
const scheduleRepeater = () => {
95
this._pointerdownRepeatTimer.cancelAndSet(() => this._onActivate(), 1000 / 24, dom.getWindow(e));
96
};
97
98
this._onActivate();
99
this._pointerdownRepeatTimer.cancel();
100
this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);
101
102
this._pointerMoveMonitor.startMonitoring(
103
e.target,
104
e.pointerId,
105
e.buttons,
106
(pointerMoveData) => { /* Intentional empty */ },
107
() => {
108
this._pointerdownRepeatTimer.cancel();
109
this._pointerdownScheduleRepeatTimer.cancel();
110
}
111
);
112
113
e.preventDefault();
114
}
115
}
116
117