## Summary `uniform_list` computed the visible range and each item's origin from the scroll offset in `f32`. Past 2^27px, adjacent `f32` values are 16px apart. In a list of 24px items, that point is about 5.6 million items in. From there: - items are placed with alternating 16px and 32px gaps instead of 24px; - the visible range can start one item late, leaving a blank strip at the top of the list (and sometimes at the bottom); - smaller errors start earlier, such as a 1px offset at about a million items, because the large offset is added to the viewport origin in `f32`. This change computes the visible item indices and the viewport-relative item offsets in `f64`, then converts only the small offsets back to `Pixels`. The arithmetic stays local to `uniform_list`'s prepaint, and nothing changes for ordinary list sizes. The stored scroll offset (`ScrollHandle`) is still `f32`, so very far down a long list the scroll position itself stays quantized. `scroll_to_item` can land up to half a step (8px at this depth) away from the item's exact top, and very small scroll deltas can be lost. Fixing that would mean changing the scroll offset representation used by every scrollable element, so I left it out of this PR. I hit this in a GPUI file search app showing ~9.8 million results in a table built on `uniform_list`: <img width="1336" height="874" alt="image" src="https://github.com/user-attachments/assets/c25b2c1d-3151-4a87-9742-c3820c1d4aac" /> ## Testing - Added `test_item_positions_far_down_long_list`: 10M items of 24px in a 200px list, with the scroll offset set 16px into item 9,000,002. It asserts which items render and their tops (`-16, 8, 32, … 176`). - On `main` it fails: item 9,000,002 is missing and the tops are `0, 32, 64, 80, 96, 128, …`. - With this change it passes. - `cargo test -p gpui --lib uniform_list` passes, including the existing `test_scroll_strategy_nearest`. `cargo clippy -p gpui --lib --tests` is clean. - Manually on Windows, in a real window with 9,824,090 rows of 24px, I checked 12 scroll positions, including odd rows reached from far away. Each check verifies consecutive rows, uniform 24px spacing, and that rows cover the viewport top and bottom. - Before: 7 of 12 failed. - After: 12 of 12 passed. To reproduce: run the new test against `main`, or render a `uniform_list` with ~10M fixed-height items and scroll near the end. ## Self-review - [x] I've reviewed my diff for quality, security, reliability, and performance. - [x] UI changes follow the [checklist](https://zed.dev/docs/development/ui-checklist). (No visible UI changes in Zed.) - [x] Tests cover the new or changed behavior. I used Claude to help investigate this and write the change. I've reviewed it and understand it. Release Notes: - [GPUI] Fixed layout glitches for uniform_lists with a lot of virtualized content. --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> |
||
|---|---|---|
| .agents/skills | ||
| .cargo | ||
| .cloudflare | ||
| .config | ||
| .factory | ||
| .github | ||
| .wezel | ||
| .zed | ||
| assets | ||
| ci | ||
| crates | ||
| docs | ||
| extensions | ||
| legal | ||
| nix | ||
| script | ||
| tooling | ||
| .git-blame-ignore-revs | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| .prettierrc | ||
| .rules | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| clippy.toml | ||
| CODE_OF_CONDUCT.md | ||
| compose.yml | ||
| CONTRIBUTING.md | ||
| corgi.toml | ||
| default.nix | ||
| Dockerfile-collab | ||
| Dockerfile-collab.dockerignore | ||
| Dockerfile-cross.dockerignore | ||
| Dockerfile-distros | ||
| Dockerfile-distros.dockerignore | ||
| flake.lock | ||
| flake.nix | ||
| GEMINI.md | ||
| LICENSE-APACHE | ||
| LICENSE-GPL | ||
| Procfile | ||
| Procfile.web | ||
| README.md | ||
| rust-toolchain.toml | ||
| rustfmt.toml | ||
| shell.nix | ||
Zed
Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Installation
On macOS, Linux, and Windows you can download Zed directly or install Zed via your local package manager (macOS/Linux/Windows).
Other platforms are not yet available:
- Web (tracking discussion)
Developing Zed
Contributing
See CONTRIBUTING.md for ways you can contribute to Zed.
Also... we're hiring! Check out our jobs page for open roles.
Licensing
Zed source code is licensed primarily under GPL-3.0-or-later, with Apache-2.0 components where marked.
License information for third party dependencies must be correctly provided for CI to pass.
We use cargo-about to automatically comply with open source licenses. If CI is failing, check the following:
- Is it showing a
no license specifiederror for a crate you've created? If so, addpublish = falseunder[package]in your crate's Cargo.toml. - Is the error
failed to satisfy license requirementsfor a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to theacceptedarray inscript/licenses/zed-licenses.toml. - Is
cargo-aboutunable to find the license for a dependency? If so, add a clarification field at the end ofscript/licenses/zed-licenses.toml, as specified in the cargo-about book.
Sponsorship
Zed is developed by Zed Industries, Inc., a for-profit company.
If you’d like to financially support the project, you can do so via GitHub Sponsors. Sponsorships go directly to Zed Industries and are used as general company revenue. There are no perks or entitlements associated with sponsorship.