Skip to content

Commit 6f541ca

Browse files
committed
Cover case where the scrollable does not emit an event initially
1 parent b7a8a4a commit 6f541ca

5 files changed

Lines changed: 20 additions & 19 deletions

File tree

src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export abstract class AbstractScrollbar extends Widget {
6161
this._scrollable = opts.scrollable;
6262
this._scrollbarState = opts.scrollbarState;
6363
this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'visible scrollbar ' + opts.extraScrollbarClassName, 'invisible scrollbar ' + opts.extraScrollbarClassName));
64+
this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());
6465
this._mouseMoveMonitor = this._register(new GlobalMouseMoveMonitor<IStandardMouseMoveEventData>());
6566
this._shouldRender = true;
6667
this.domNode = createFastDomNode(document.createElement('div'));

src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ import { INewScrollPosition, ScrollEvent, Scrollable, ScrollbarVisibility } from
1313
export class HorizontalScrollbar extends AbstractScrollbar {
1414

1515
constructor(scrollable: Scrollable, options: ScrollableElementResolvedOptions, host: ScrollbarHost) {
16+
const scrollDimensions = scrollable.getScrollDimensions();
17+
const scrollPosition = scrollable.getCurrentScrollPosition();
1618
super({
1719
lazyRender: options.lazyRender,
1820
host: host,
1921
scrollbarState: new ScrollbarState(
2022
(options.horizontalHasArrows ? options.arrowSize : 0),
2123
(options.horizontal === ScrollbarVisibility.Hidden ? 0 : options.horizontalScrollbarSize),
22-
(options.vertical === ScrollbarVisibility.Hidden ? 0 : options.verticalScrollbarSize)
24+
(options.vertical === ScrollbarVisibility.Hidden ? 0 : options.verticalScrollbarSize),
25+
scrollDimensions.width,
26+
scrollDimensions.scrollWidth,
27+
scrollPosition.scrollLeft
2328
),
2429
visibility: options.horizontal,
2530
extraScrollbarClassName: 'horizontal',

src/vs/base/browser/ui/scrollbar/scrollbarState.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ export class ScrollbarState {
6262
private _computedSliderRatio: number;
6363
private _computedSliderPosition: number;
6464

65-
constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number) {
65+
constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {
6666
this._scrollbarSize = Math.round(scrollbarSize);
6767
this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);
6868
this._arrowSize = Math.round(arrowSize);
6969

70-
this._visibleSize = 0;
71-
this._scrollSize = 0;
72-
this._scrollPosition = 0;
70+
this._visibleSize = visibleSize;
71+
this._scrollSize = scrollSize;
72+
this._scrollPosition = scrollPosition;
7373

7474
this._computedAvailableSize = 0;
7575
this._computedIsNeeded = false;
@@ -81,11 +81,7 @@ export class ScrollbarState {
8181
}
8282

8383
public clone(): ScrollbarState {
84-
let r = new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize);
85-
r.setVisibleSize(this._visibleSize);
86-
r.setScrollSize(this._scrollSize);
87-
r.setScrollPosition(this._scrollPosition);
88-
return r;
84+
return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);
8985
}
9086

9187
public setVisibleSize(visibleSize: number): boolean {

src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,19 @@ import { INewScrollPosition, ScrollEvent, Scrollable, ScrollbarVisibility } from
1313
export class VerticalScrollbar extends AbstractScrollbar {
1414

1515
constructor(scrollable: Scrollable, options: ScrollableElementResolvedOptions, host: ScrollbarHost) {
16+
const scrollDimensions = scrollable.getScrollDimensions();
17+
const scrollPosition = scrollable.getCurrentScrollPosition();
1618
super({
1719
lazyRender: options.lazyRender,
1820
host: host,
1921
scrollbarState: new ScrollbarState(
2022
(options.verticalHasArrows ? options.arrowSize : 0),
2123
(options.vertical === ScrollbarVisibility.Hidden ? 0 : options.verticalScrollbarSize),
2224
// give priority to vertical scroll bar over horizontal and let it scroll all the way to the bottom
23-
0
25+
0,
26+
scrollDimensions.height,
27+
scrollDimensions.scrollHeight,
28+
scrollPosition.scrollTop
2429
),
2530
visibility: options.vertical,
2631
extraScrollbarClassName: 'vertical',

src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import { ScrollbarState } from 'vs/base/browser/ui/scrollbar/scrollbarState';
88

99
suite('ScrollbarState', () => {
1010
test('inflates slider size', () => {
11-
let actual = new ScrollbarState(0, 14, 0);
12-
actual.setVisibleSize(339);
13-
actual.setScrollSize(42423);
14-
actual.setScrollPosition(32787);
11+
let actual = new ScrollbarState(0, 14, 0, 339, 42423, 32787);
1512

1613
assert.equal(actual.getArrowSize(), 0);
1714
assert.equal(actual.getScrollPosition(), 32787);
@@ -34,10 +31,7 @@ suite('ScrollbarState', () => {
3431
});
3532

3633
test('inflates slider size with arrows', () => {
37-
let actual = new ScrollbarState(12, 14, 0);
38-
actual.setVisibleSize(339);
39-
actual.setScrollSize(42423);
40-
actual.setScrollPosition(32787);
34+
let actual = new ScrollbarState(12, 14, 0, 339, 42423, 32787);
4135

4236
assert.equal(actual.getArrowSize(), 12);
4337
assert.equal(actual.getScrollPosition(), 32787);

0 commit comments

Comments
 (0)