mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-02 23:12:21 +03:00
Hold strong handle in ChildView
This eliminates a whole class of errors where the `ChildView` could be referring to a view that doesn't exist anymore. That probably still indicates that there's an underlying bug, but at least we won't panic. Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
parent
bae44d8132
commit
5d5f89231b
@ -492,14 +492,12 @@ impl ToJson for SizeConstraint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct ChildView {
|
pub struct ChildView {
|
||||||
view_id: usize,
|
view: AnyViewHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChildView {
|
impl ChildView {
|
||||||
pub fn new(view: impl Into<AnyViewHandle>) -> Self {
|
pub fn new(view: impl Into<AnyViewHandle>) -> Self {
|
||||||
Self {
|
Self { view: view.into() }
|
||||||
view_id: view.into().id(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,7 +510,7 @@ impl Element for ChildView {
|
|||||||
constraint: SizeConstraint,
|
constraint: SizeConstraint,
|
||||||
cx: &mut LayoutContext,
|
cx: &mut LayoutContext,
|
||||||
) -> (Vector2F, Self::LayoutState) {
|
) -> (Vector2F, Self::LayoutState) {
|
||||||
let size = cx.layout(self.view_id, constraint);
|
let size = cx.layout(self.view.id(), constraint);
|
||||||
(size, ())
|
(size, ())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,7 +521,7 @@ impl Element for ChildView {
|
|||||||
_: &mut Self::LayoutState,
|
_: &mut Self::LayoutState,
|
||||||
cx: &mut PaintContext,
|
cx: &mut PaintContext,
|
||||||
) -> Self::PaintState {
|
) -> Self::PaintState {
|
||||||
cx.paint(self.view_id, bounds.origin(), visible_bounds);
|
cx.paint(self.view.id(), bounds.origin(), visible_bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispatch_event(
|
fn dispatch_event(
|
||||||
@ -534,7 +532,7 @@ impl Element for ChildView {
|
|||||||
_: &mut Self::PaintState,
|
_: &mut Self::PaintState,
|
||||||
cx: &mut EventContext,
|
cx: &mut EventContext,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
cx.dispatch_event(self.view_id, event)
|
cx.dispatch_event(self.view.id(), event)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn debug(
|
fn debug(
|
||||||
@ -546,9 +544,9 @@ impl Element for ChildView {
|
|||||||
) -> serde_json::Value {
|
) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"type": "ChildView",
|
"type": "ChildView",
|
||||||
"view_id": self.view_id,
|
"view_id": self.view.id(),
|
||||||
"bounds": bounds.to_json(),
|
"bounds": bounds.to_json(),
|
||||||
"child": if let Some(view) = cx.rendered_views.get(&self.view_id) {
|
"child": if let Some(view) = cx.rendered_views.get(&self.view.id()) {
|
||||||
view.debug(cx)
|
view.debug(cx)
|
||||||
} else {
|
} else {
|
||||||
json!(null)
|
json!(null)
|
||||||
@ -556,43 +554,3 @@ impl Element for ChildView {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
// #[test]
|
|
||||||
// fn test_responder_chain() {
|
|
||||||
// let settings = settings_rx(None);
|
|
||||||
// let mut app = App::new().unwrap();
|
|
||||||
// let workspace = app.add_model(|cx| Workspace::new(Vec::new(), cx));
|
|
||||||
// let (window_id, workspace_view) =
|
|
||||||
// app.add_window(|cx| WorkspaceView::new(workspace.clone(), settings, cx));
|
|
||||||
|
|
||||||
// let invalidations = Rc::new(RefCell::new(Vec::new()));
|
|
||||||
// let invalidations_ = invalidations.clone();
|
|
||||||
// app.on_window_invalidated(window_id, move |invalidation, _| {
|
|
||||||
// invalidations_.borrow_mut().push(invalidation)
|
|
||||||
// });
|
|
||||||
|
|
||||||
// let active_pane_id = workspace_view.update(&mut app, |view, cx| {
|
|
||||||
// cx.focus(view.active_pane());
|
|
||||||
// view.active_pane().id()
|
|
||||||
// });
|
|
||||||
|
|
||||||
// app.update(|app| {
|
|
||||||
// let mut presenter = Presenter::new(
|
|
||||||
// window_id,
|
|
||||||
// Rc::new(FontCache::new()),
|
|
||||||
// Rc::new(AssetCache::new()),
|
|
||||||
// app,
|
|
||||||
// );
|
|
||||||
// for invalidation in invalidations.borrow().iter().cloned() {
|
|
||||||
// presenter.update(vec2f(1024.0, 768.0), 2.0, Some(invalidation), app);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// assert_eq!(
|
|
||||||
// presenter.responder_chain(app.cx()).unwrap(),
|
|
||||||
// vec![workspace_view.id(), active_pane_id]
|
|
||||||
// );
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user