Detailed changes
@@ -12,10 +12,7 @@ use client::{
use collections::{HashMap, HashSet};
use fs::FakeFs;
use futures::{channel::oneshot, StreamExt as _};
-use gpui::{
- elements::*, executor::Deterministic, AnyElement, Entity, ModelHandle, TestAppContext, View,
- ViewContext, ViewHandle, WeakViewHandle,
-};
+use gpui::{executor::Deterministic, ModelHandle, TestAppContext, WindowHandle};
use language::LanguageRegistry;
use parking_lot::Mutex;
use project::{Project, WorktreeId};
@@ -466,43 +463,8 @@ impl TestClient {
&self,
project: &ModelHandle<Project>,
cx: &mut TestAppContext,
- ) -> ViewHandle<Workspace> {
- struct WorkspaceContainer {
- workspace: Option<WeakViewHandle<Workspace>>,
- }
-
- impl Entity for WorkspaceContainer {
- type Event = ();
- }
-
- impl View for WorkspaceContainer {
- fn ui_name() -> &'static str {
- "WorkspaceContainer"
- }
-
- fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
- if let Some(workspace) = self
- .workspace
- .as_ref()
- .and_then(|workspace| workspace.upgrade(cx))
- {
- ChildView::new(&workspace, cx).into_any()
- } else {
- Empty::new().into_any()
- }
- }
- }
-
- // We use a workspace container so that we don't need to remove the window in order to
- // drop the workspace and we can use a ViewHandle instead.
- let window = cx.add_window(|_| WorkspaceContainer { workspace: None });
- let container = window.root(cx);
- let workspace = window.add_view(cx, |cx| Workspace::test_new(project.clone(), cx));
- container.update(cx, |container, cx| {
- container.workspace = Some(workspace.downgrade());
- cx.notify();
- });
- workspace
+ ) -> WindowHandle<Workspace> {
+ cx.add_window(|cx| Workspace::test_new(project.clone(), cx))
}
}
@@ -6441,8 +6441,10 @@ async fn test_basic_following(
.await
.unwrap();
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let window_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = window_a.root(cx_a);
+ let window_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = window_b.root(cx_b);
// Client A opens some editors.
let pane_a = workspace_a.read_with(cx_a, |workspace, _| workspace.active_pane().clone());
@@ -6525,7 +6527,7 @@ async fn test_basic_following(
cx_c.foreground().run_until_parked();
let active_call_c = cx_c.read(ActiveCall::global);
let project_c = client_c.build_remote_project(project_id, cx_c).await;
- let workspace_c = client_c.build_workspace(&project_c, cx_c);
+ let workspace_c = client_c.build_workspace(&project_c, cx_c).root(cx_c);
active_call_c
.update(cx_c, |call, cx| call.set_location(Some(&project_c), cx))
.await
@@ -6543,7 +6545,7 @@ async fn test_basic_following(
cx_d.foreground().run_until_parked();
let active_call_d = cx_d.read(ActiveCall::global);
let project_d = client_d.build_remote_project(project_id, cx_d).await;
- let workspace_d = client_d.build_workspace(&project_d, cx_d);
+ let workspace_d = client_d.build_workspace(&project_d, cx_d).root(cx_d);
active_call_d
.update(cx_d, |call, cx| call.set_location(Some(&project_d), cx))
.await
@@ -6870,9 +6872,7 @@ async fn test_basic_following(
});
// Client B activates a panel, and the previously-opened screen-sharing item gets activated.
- let panel = cx_b.add_view(workspace_b.window_id(), |_| {
- TestPanel::new(DockPosition::Left)
- });
+ let panel = window_b.add_view(cx_b, |_| TestPanel::new(DockPosition::Left));
workspace_b.update(cx_b, |workspace, cx| {
workspace.add_panel(panel, cx);
workspace.toggle_panel_focus::<TestPanel>(cx);
@@ -6900,7 +6900,7 @@ async fn test_basic_following(
// Client B activates an item that doesn't implement following,
// so the previously-opened screen-sharing item gets activated.
- let unfollowable_item = cx_b.add_view(workspace_b.window_id(), |_| TestItem::new());
+ let unfollowable_item = window_b.add_view(cx_b, |_| TestItem::new());
workspace_b.update(cx_b, |workspace, cx| {
workspace.active_pane().update(cx, |pane, cx| {
pane.add_item(Box::new(unfollowable_item), true, true, None, cx)
@@ -7062,10 +7062,10 @@ async fn test_following_tab_order(
.await
.unwrap();
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
let pane_a = workspace_a.read_with(cx_a, |workspace, _| workspace.active_pane().clone());
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
let pane_b = workspace_b.read_with(cx_b, |workspace, _| workspace.active_pane().clone());
let client_b_id = project_a.read_with(cx_a, |project, _| {
@@ -7188,7 +7188,7 @@ async fn test_peers_following_each_other(
.unwrap();
// Client A opens some editors.
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
let pane_a1 = workspace_a.read_with(cx_a, |workspace, _| workspace.active_pane().clone());
let _editor_a1 = workspace_a
.update(cx_a, |workspace, cx| {
@@ -7200,7 +7200,7 @@ async fn test_peers_following_each_other(
.unwrap();
// Client B opens an editor.
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
let pane_b1 = workspace_b.read_with(cx_b, |workspace, _| workspace.active_pane().clone());
let _editor_b1 = workspace_b
.update(cx_b, |workspace, cx| {
@@ -7359,7 +7359,7 @@ async fn test_auto_unfollowing(
.unwrap();
// Client A opens some editors.
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
let _editor_a1 = workspace_a
.update(cx_a, |workspace, cx| {
workspace.open_path((worktree_id, "1.txt"), None, true, cx)
@@ -7370,7 +7370,7 @@ async fn test_auto_unfollowing(
.unwrap();
// Client B starts following client A.
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
let pane_b = workspace_b.read_with(cx_b, |workspace, _| workspace.active_pane().clone());
let leader_id = project_b.read_with(cx_b, |project, _| {
project.collaborators().values().next().unwrap().peer_id
@@ -7498,14 +7498,14 @@ async fn test_peers_simultaneously_following_each_other(
client_a.fs.insert_tree("/a", json!({})).await;
let (project_a, _) = client_a.build_local_project("/a", cx_a).await;
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
let project_id = active_call_a
.update(cx_a, |call, cx| call.share_project(project_a.clone(), cx))
.await
.unwrap();
let project_b = client_b.build_remote_project(project_id, cx_b).await;
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
deterministic.run_until_parked();
let client_a_id = project_b.read_with(cx_b, |project, _| {
@@ -7887,7 +7887,7 @@ async fn test_mutual_editor_inlay_hint_cache_update(
.await
.unwrap();
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
cx_a.foreground().start_waiting();
let _buffer_a = project_a
@@ -7955,7 +7955,7 @@ async fn test_mutual_editor_inlay_hint_cache_update(
"Host editor update the cache version after every cache/view change",
);
});
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
let editor_b = workspace_b
.update(cx_b, |workspace, cx| {
workspace.open_path((worktree_id, "main.rs"), None, true, cx)
@@ -8194,8 +8194,8 @@ async fn test_inlay_hint_refresh_is_forwarded(
.await
.unwrap();
- let workspace_a = client_a.build_workspace(&project_a, cx_a);
- let workspace_b = client_b.build_workspace(&project_b, cx_b);
+ let workspace_a = client_a.build_workspace(&project_a, cx_a).root(cx_a);
+ let workspace_b = client_b.build_workspace(&project_b, cx_b).root(cx_b);
cx_a.foreground().start_waiting();
cx_b.foreground().start_waiting();
@@ -297,8 +297,7 @@ mod tests {
let project = Project::test(app_state.fs.clone(), [], cx).await;
let window = cx.add_window(|cx| Workspace::test_new(project.clone(), cx));
let workspace = window.root(cx);
- let window_id = window.id();
- let editor = cx.add_view(window_id, |cx| {
+ let editor = window.add_view(cx, |cx| {
let mut editor = Editor::single_line(None, cx);
editor.set_text("abc", cx);
editor
@@ -857,7 +857,6 @@ mod tests {
let project = Project::test(fs.clone(), ["/test".as_ref()], cx).await;
let window = cx.add_window(|cx| Workspace::test_new(project.clone(), cx));
let workspace = window.root(cx);
- let window_id = window.id();
// Create some diagnostics
project.update(cx, |project, cx| {
@@ -944,7 +943,7 @@ mod tests {
});
// Open the project diagnostics view while there are already diagnostics.
- let view = cx.add_view(window_id, |cx| {
+ let view = window.add_view(cx, |cx| {
ProjectDiagnosticsEditor::new(project.clone(), workspace.downgrade(), cx)
});
@@ -1252,9 +1251,8 @@ mod tests {
let project = Project::test(fs.clone(), ["/test".as_ref()], cx).await;
let window = cx.add_window(|cx| Workspace::test_new(project.clone(), cx));
let workspace = window.root(cx);
- let window_id = window.id();
- let view = cx.add_view(window_id, |cx| {
+ let view = window.add_view(cx, |cx| {
ProjectDiagnosticsEditor::new(project.clone(), workspace.downgrade(), cx)
});
@@ -525,9 +525,8 @@ async fn test_navigation_history(cx: &mut TestAppContext) {
let project = Project::test(fs, [], cx).await;
let window = cx.add_window(|cx| Workspace::test_new(project, cx));
let workspace = window.root(cx);
- let window_id = window.id();
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
- cx.add_view(window_id, |cx| {
+ window.add_view(cx, |cx| {
let buffer = MultiBuffer::build_simple(&sample_text(300, 5, 'a'), cx);
let mut editor = build_editor(buffer.clone(), cx);
let handle = cx.handle();
@@ -162,15 +162,6 @@ impl TestAppContext {
WindowHandle::new(window.id())
}
- pub fn add_view<T, F>(&mut self, window_id: usize, build_view: F) -> ViewHandle<T>
- where
- T: View,
- F: FnOnce(&mut ViewContext<T>) -> T,
- {
- self.update_window(window_id, |cx| cx.add_view(build_view))
- .expect("window not found")
- }
-
pub fn observe_global<E, F>(&mut self, callback: F) -> Subscription
where
E: Any,
@@ -328,10 +328,9 @@ mod tests {
let window = cx.add_window(|cx| Workspace::test_new(project.clone(), cx));
let workspace = window.root(cx);
- let window_id = window.id();
// Create the project symbols view.
- let symbols = cx.add_view(window_id, |cx| {
+ let symbols = window.add_view(cx, |cx| {
ProjectSymbols::new(
ProjectSymbolsDelegate::new(workspace.downgrade(), project.clone()),
cx,
@@ -850,12 +850,9 @@ mod tests {
)
});
let window = cx.add_window(|_| EmptyView);
+ let editor = window.add_view(cx, |cx| Editor::for_buffer(buffer.clone(), None, cx));
- let editor = cx.add_view(window.id(), |cx| {
- Editor::for_buffer(buffer.clone(), None, cx)
- });
-
- let search_bar = cx.add_view(window.id(), |cx| {
+ let search_bar = window.add_view(cx, |cx| {
let mut search_bar = BufferSearchBar::new(cx);
search_bar.set_active_pane_item(Some(&editor), cx);
search_bar.show(cx);
@@ -1234,9 +1231,9 @@ mod tests {
let window = cx.add_window(|_| EmptyView);
let window_id = window.id();
- let editor = cx.add_view(window_id, |cx| Editor::for_buffer(buffer.clone(), None, cx));
+ let editor = window.add_view(cx, |cx| Editor::for_buffer(buffer.clone(), None, cx));
- let search_bar = cx.add_view(window_id, |cx| {
+ let search_bar = window.add_view(cx, |cx| {
let mut search_bar = BufferSearchBar::new(cx);
search_bar.set_active_pane_item(Some(&editor), cx);
search_bar.show(cx);
@@ -1421,11 +1418,9 @@ mod tests {
let buffer = cx.add_model(|cx| Buffer::new(0, buffer_text, cx));
let window = cx.add_window(|_| EmptyView);
- let editor = cx.add_view(window.id(), |cx| {
- Editor::for_buffer(buffer.clone(), None, cx)
- });
+ let editor = window.add_view(cx, |cx| Editor::for_buffer(buffer.clone(), None, cx));
- let search_bar = cx.add_view(window.id(), |cx| {
+ let search_bar = window.add_view(cx, |cx| {
let mut search_bar = BufferSearchBar::new(cx);
search_bar.set_active_pane_item(Some(&editor), cx);
search_bar.show(cx);
@@ -1874,7 +1874,6 @@ pub mod tests {
let project = Project::test(fs.clone(), ["/dir".as_ref()], cx).await;
let window = cx.add_window(|cx| Workspace::test_new(project, cx));
let workspace = window.root(cx);
- let window_id = window.id();
workspace.update(cx, |workspace, cx| {
ProjectSearchView::deploy(workspace, &workspace::NewSearch, cx)
});
@@ -1889,7 +1888,7 @@ pub mod tests {
.expect("Search view expected to appear after new search event trigger")
});
- let search_bar = cx.add_view(window_id, |cx| {
+ let search_bar = window.add_view(cx, |cx| {
let mut search_bar = ProjectSearchBar::new();
search_bar.set_active_pane_item(Some(&search_view), cx);
// search_bar.show(cx);