From ab5c06cf17be06661c7098f2890862eb6b4093d5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 3 Feb 2026 04:55:32 -0800 Subject: [PATCH] Merge abstract and smooth scrollable elements --- src/browser/scrollable/scrollableElement.ts | 68 ++++++++++----------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/src/browser/scrollable/scrollableElement.ts b/src/browser/scrollable/scrollableElement.ts index e9fc27ef..01e0bbbd 100644 --- a/src/browser/scrollable/scrollableElement.ts +++ b/src/browser/scrollable/scrollableElement.ts @@ -148,7 +148,7 @@ class MouseWheelClassifier { } } -export abstract class AbstractScrollableElement extends Widget { +export class SmoothScrollableElement extends Widget { private readonly _options: IScrollableElementResolvedOptions; protected readonly _scrollable: Scrollable; @@ -182,16 +182,33 @@ export abstract class AbstractScrollableElement extends Widget { return this._options; } - public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable: Scrollable) { + public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) { super(); + options = options ?? {}; + let resolvedScrollable: Scrollable; + const ownsScrollable = !scrollable; + if (scrollable) { + resolvedScrollable = scrollable; + } else { + options.mouseWheelSmoothScroll = false; + resolvedScrollable = new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: 0, + scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback) + }); + } + this._options = resolveOptions(options); - this._scrollable = scrollable; + this._scrollable = resolvedScrollable; this._register(this._scrollable.onScroll((e) => { this._onWillScroll.fire(e); this._handleScroll(e); this._onScroll.fire(e); })); + if (ownsScrollable) { + this._register(this._scrollable); + } const scrollbarHost: IScrollbarHost = { handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent), @@ -265,6 +282,18 @@ export abstract class AbstractScrollableElement extends Widget { this._scrollable.setScrollDimensions(dimensions, false); } + public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void { + if (update.reuseAnimation) { + this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation); + } else { + this._scrollable.setScrollPositionNow(update); + } + } + + public getScrollPosition(): IScrollPosition { + return this._scrollable.getCurrentScrollPosition(); + } + public updateClassName(newClassName: string): void { this._options.className = newClassName; if (platform.isMac) { @@ -515,39 +544,6 @@ export abstract class AbstractScrollableElement extends Widget { } } -export class SmoothScrollableElement extends AbstractScrollableElement { - - constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) { - options = options ?? {}; - const ownsScrollable = !scrollable; - if (!scrollable) { - options.mouseWheelSmoothScroll = false; - scrollable = new Scrollable({ - forceIntegerValues: true, - smoothScrollDuration: 0, - scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback) - }); - } - super(element, options, scrollable); - if (ownsScrollable) { - this._register(scrollable); - } - } - - public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void { - if (update.reuseAnimation) { - this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation); - } else { - this._scrollable.setScrollPositionNow(update); - } - } - - public getScrollPosition(): IScrollPosition { - return this._scrollable.getCurrentScrollPosition(); - } - -} - function resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions { const result: IScrollableElementResolvedOptions = { lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),