pane: When opening a buffer, actually scroll to the selected tab. (#3306)

Kirill Bulatov created

Previously it might've reused a shared state.

Deals with https://github.com/zed-industries/community/issues/2262 also
fixes influencer's feedback.

No gpui2 port, due to 0 scrollable functionality in it yet.

Release Notes:

- Fixed tabs not being scrolled to on buffer (re)open
(https://github.com/zed-industries/community/issues/2262)

Change summary

crates/gpui/src/elements/flex.rs | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

Detailed changes

crates/gpui/src/elements/flex.rs 🔗

@@ -67,14 +67,21 @@ impl<V: 'static> Flex<V> {
     where
         Tag: 'static,
     {
+        // Don't assume that this initialization is what scroll_state really is in other panes:
+        // `element_state` is shared and there could be init races.
         let scroll_state = cx.element_state::<Tag, Rc<ScrollState>>(
             element_id,
             Rc::new(ScrollState {
-                scroll_to: Cell::new(scroll_to),
-                scroll_position: Default::default(),
                 type_tag: TypeTag::new::<Tag>(),
+                scroll_to: Default::default(),
+                scroll_position: Default::default(),
             }),
         );
+        // Set scroll_to separately, because the default state is already picked as `None` by other panes
+        // by the time we start setting it here, hence update all others' state too.
+        scroll_state.update(cx, |this, _| {
+            this.scroll_to.set(scroll_to);
+        });
         self.scroll_state = Some((scroll_state, cx.handle().id()));
         self
     }