Change:
Type: <bBug</bThis is just a continuation of issue The sticky part of a tree doesn't update until you've scrolled down to un-sticky it. VS Code version: Code 1.92.2 (, 2024-08-14T17:29:30.058Z) OS version: WindowsNT x64 10.0. Modes: <details<summarySystem Info</summary </details<details<summaryExtensions (62)</summaryExtensionVersion ------ logcat0.0.7 android-dev-ext1.4.0 amazon-q-vscode1.24.0 aws-toolkit-vscode3.23.0 scriptnotebook0.0.6 serialterminal0.0.36 doxdocgen1.4.0 vscode-eslint3.0.10 graphviz-preview1.7.2 magick-image-reader0.5.0 vscode-commands2.0.2 lex-flex-yacc-bison0.0.3 code-runner0.12.2 vscode-github-actions0.26.3 vscode-pull-request-github0.96.0 pdl-language0.2.2 adb-filesystem-fork0.0.4 ispc1.1.1 llvm-tablegen0.0.2 svn-scm2.17.0 cortex-debug1.12.1 debug-tracker-vscode0.0.15 memory-view0.0.25 peripheral-viewer1.4.6 rtos-views0.0.7 git-graph1.30.0 csharp2.39.29 vscode-dotnet-runtime2.1.5 vscode-edge-devtools2.1.5 debugpy2024.10.0 python2024.14.0 jupyter2024.7.0 jupyter-renderers1.0.19 remote-containers0.384.0 remote-ssh0.113.1 remote-ssh-edit0.86.0 remote-wsl0.88.2 cmake-tools1.20.3 cpptools1.22.2 cpptools-extension-pack1.3.0 hexeditor1.10.0 live-server0.4.14 makefile-tools0.10.26 powershell2024.2.2 remote-explorer0.4.3 vscode-github-issue-notebooks0.0.130 vscode-serial-monitor0.12.0 platformio-ide3.3.3 raspberry-pi-pico0.15.2 clangformat2.0.2 shader1.1.5 vscode-native-svg-preview1.72.0 memento-inputs1.0.0 rst-vscode3.0.1 pdf1.2.2 vscode-lldb1.10.0 vscodeintellicode1.3.1 vscode-gradle3.16.4 vscode-java-debug0.58.0 vscode-java-pack0.29.0 debug0.27.0 cursor-align1.1.2 </details<details<summaryA/B Experiments</summary</details<!-- generated by issue reporter --
Thanks for creating this issue! It looks like you may be using an old version of VS Code, the latest stable release is 1.93.0. Please try upgrading to the latest version and checking whether this issue remains. Happy Coding!
Still happening on 1.93.0
Hi thank you for opening this issue. Could you please explain the issue in more detail, when you talk about the sticky part of the tree, what exactly are you referring to? A screen recording showing the issue would be helpful.
This issue has been closed automatically because it needs more information and has not had recent activity. See also our guidelines. Happy Coding!
Sorry, it took me a while to get back to this and create a demonstration of the problem (a couple of tweaks to the tree-view-sample). Can this be re-opened, or should I create a new issue?
Hi of course you can just comment here. I will reopen the issue. I think our bot closes our issues too preemptively.
Thanks ! I forked the samples here: and made a couple of edits to the tree-view-sample: I've 'mark' and 'unmark' commands to the file explorer part of the tree-view-sample, which sets a folder to 'marked' or 'unmarked'. The mark command uses the $(check) icon, and is only enabled if a folder is unmarked. The unmark command uses the $(close) icon. and is only enabled if a folder is marked. In other words, if you click the check icon it turns into a close, and vice versa. Now, if you scroll the file explorer so that a folder is 'sticky' (i.e. beneath the view header and not in the scrolling region) the icon can still be clicked but doesn't change. Video attached.
Thanks for reporting this, this is a good catch. Sticky Scroll doesn't rerender in his case because it doesn't think something changed.
Moving this issue to October

Discussion:
return equals(this.stickyNodes, state.stickyNodes, stickyScrollNodeStateEquals); } <ins> contains(element: ITreeNode<T, TFilterData>): boolean { return this.stickyNodes.some(node => node.node.element === element.element); } </ins> lastNodePartiallyVisible(): boolean { if (this.count === 0) { return false;

this._register(view.onDidScroll(() => this.update())); this._register(view.onDidChangeContentHeight(() => this.update())); this._register(tree.onDidChangeCollapseState(() => this.update())); <ins> this._register(model.onDidSpliceRenderedNodes((e) => { const state = this._widget.state; if (!state) { return; } const renderedNodes = e.elements.filter(node => state.contains(node)); if (renderedNodes) { this._widget.rerender(); } })); </ins> this.update(); }

private _previousState: StickyScrollState<T, TFilterData, TRef> | undefined; private _previousElements: HTMLElement[] = []; private readonly _previousStateDisposables: DisposableStore = new DisposableStore(); <ins> get state(): StickyScrollState<T, TFilterData, TRef> | undefined { return this._previousState; } </ins> private stickyScrollFocus: StickyScrollFocus<T, TFilterData, TRef>; readonly onDidChangeHasFocus: Event<boolean>;

} // create new dom elements else { <del> this._previousStateDisposables.clear(); </del> <ins> this.renderState(state); } </ins> <del> const elements = Array(state.count); for (let stickyIndex = state.count - 1; stickyIndex >= 0; stickyIndex--) { const stickyNode = state.stickyNodes[stickyIndex]; </del> <ins> this._previousState = state; </ins> <del> const { element, disposable } = this.createElement(stickyNode, stickyIndex, state.count); elements[stickyIndex] = element; </del> <ins> // Set the height of the widget to the bottom of the last sticky node this._rootDomNode.style.height = `${lastStickyNode.position + lastStickyNode.height}px`; } </ins> <del> this._rootDomNode.appendChild(element); this._previousStateDisposables.add(disposable); } </del> <ins> private renderState(state: StickyScrollState<T, TFilterData, TRef>): void { this._previousStateDisposables.clear(); </ins> <del> this.stickyScrollFocus.updateElements(elements, state); </del> <ins> const elements = Array(state.count); for (let stickyIndex = state.count - 1; stickyIndex >= 0; stickyIndex--) { const stickyNode = state.stickyNodes[stickyIndex]; </ins> <del> this._previousElements = elements; </del> <ins> const { element, disposable } = this.createElement(stickyNode, stickyIndex, state.count); elements[stickyIndex] = element; this._rootDomNode.appendChild(element); this._previousStateDisposables.add(disposable); </ins> } <del> this._previousState = state; </del> <ins> this.stickyScrollFocus.updateElements(elements, state); </ins> <del> // Set the height of the widget to the bottom of the last sticky node this._rootDomNode.style.height = `${lastStickyNode.position + lastStickyNode.height}px`; </del> <ins> this._previousElements = elements; } rerender(): void { if (this._previousState) { this.renderState(this._previousState); } </ins> } private createElement(stickyNode: StickyScrollNode<T, TFilterData>, stickyIndex: number, stickyNodesTotal: number): { element: HTMLElement; disposable: IDisposable } {