Code at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Go to file
Mikayla Maki 6f40da77b6
Fix scrolling in collab panel (#4105)
When the `List` element's state is `ListState::reset()`, it eagerly
trashes it's cached element heights in anticipation of a prompt render.
But, due to the recent `display_layer` changes, that re-render is not
always forthcoming. This is a problem for `ListState::scroll()`, which
depends on these cached elements to correctly calculate the new logical
scroll offset.

Solutions we attempted:

- Cache the element heights and continue the scroll calculation 
- This was conceptually incorrect, reset should only be called when the
underlying data has been changed, making any calculation with the old
results meaningless.
- Lazily re-compute the element heights in scroll 
- Beyond being a non-trivial refactor, this would probably also cause us
to double-render the list in a single frame, which is bad.
- Cache the scroll offset and only calculate it in paint 
- This solution felt awkward to implement and meant we can't supply
synchronous list scroll events.
- Delay resetting until paint 
- This means that all of the other APIs that `ListState` supplies would
give temporarily incorrect results, worsening the problem

Given these issues, we settled on the solution with the least
compromises: drop scroll events if the state has been `reset()` between
`paint()` and `scroll()`. This shifts the responsibility for the problem
out of the List element and into consumers of `List`, if you want
perfectly smooth scrolling then you need to use `reset()` judiciously
and prefer `splice()`.

That said, I tested this by aggressively scrolling the Collab panel, and
it seems to work as well as it did before.

This PR also includes some initial testing infrastructure for working
with input from the platform and rendered elements.

Release Notes:

- N/A
2024-01-17 14:11:34 -08:00
.cargo Remove 2 suffix from gpui_macros, fix compile errors in tests 2024-01-03 13:12:21 -08:00
.config tests: Test 'db' package sequentially (#2654) 2023-06-28 15:00:43 +02:00
.github One of these days... 2024-01-11 21:22:00 -07:00
.vscode Hit the local server when debugging 2021-08-24 17:11:40 -06:00
.zed Use auto formatter settings for Zed repo. 2024-01-12 12:00:18 +02:00
assets Add CONTRIBUTING.md (#3656) 2024-01-17 13:12:14 -05:00
crates Fix scrolling in collab panel (#4105) 2024-01-17 14:11:34 -08:00
docs Add migration information to release docs and fix scripts (#4026) 2024-01-17 14:10:27 -08:00
plugins Use the same serde version across the entire workspace 2023-03-28 09:42:00 -07:00
script Add migration information to release docs and fix scripts (#4026) 2024-01-17 14:10:27 -08:00
.dockerignore Removed old experiments settings and staff mode flag, added new StaffMode global that is set based on the webserver's staff bit 2023-01-27 15:43:12 -08:00
.gitignore Ignore .idea directory 2023-09-15 11:17:02 -04:00
.gitmodules WIP: start on live_kit_server 2022-10-17 09:59:16 +02:00
Cargo.lock Add the color crate (#4063) 2024-01-17 11:47:23 -05:00
Cargo.toml chore: Revert asset compression 2024-01-11 13:42:57 +01:00
CONTRIBUTING.md Refine MVP CONTRIBUTING.md 2024-01-17 12:32:08 -05:00
debug.plist WIP 2023-12-14 09:25:14 -07:00
docker-compose.sql Add config files for running Postgres inside Docker Compose (#3637) 2023-12-13 17:25:07 -05:00
docker-compose.yml Add config files for running Postgres inside Docker Compose (#3637) 2023-12-13 17:25:07 -05:00
Dockerfile Bump Rust to 1.75 (#3815) 2023-12-28 19:22:43 +01:00
Procfile show warnings by default 2023-10-13 15:07:49 -06:00
README.md Update README.md 2024-01-17 13:24:05 -05:00
rust-toolchain.toml Remove redundant install Rust steps 2024-01-11 14:11:13 +02:00

🚧 TODO 🚧

  • Add intro
  • Add link to contributing guide
  • Add barebones running zed from source instructions
  • Link out to further dev docs

Zed

CI

Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.

Developing Zed

Licensing

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 specified error for a crate you've created? If so, add publish = false under [package] in your crate's Cargo.toml.
  • Is the error failed to satisfy license requirements for 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 the accepted array in script/licenses/zed-licenses.toml.
  • Is cargo-about unable to find the license for a dependency? If so, add a clarification field at the end of script/licenses/zed-licenses.toml, as specified in the cargo-about book.