Require window to have a root view and focused view

This is possible now that the window doesn't need to own the view. We can create the root view before we create the window.
This commit is contained in:
Nathan Sobo
2021-05-05 23:21:19 -06:00
parent 45a01d1526
commit 6cb656db9a
+20 -15
View File
@@ -539,7 +539,7 @@ impl MutableAppContext {
self.ctx
.windows
.get(&window_id)
.and_then(|window| window.root_view.as_ref().unwrap().clone().downcast::<T>())
.and_then(|window| window.root_view.clone().downcast::<T>())
}
pub fn root_view_id(&self, window_id: usize) -> Option<usize> {
@@ -732,19 +732,25 @@ impl MutableAppContext {
{
self.pending_flushes += 1;
let window_id = post_inc(&mut self.next_window_id);
self.ctx.windows.insert(window_id, Window::default());
let root_view = self.add_view(window_id, build_root_view);
self.ctx.windows.insert(
window_id,
Window {
root_view: root_view.clone().into(),
focused_view_id: root_view.id(),
invalidation: None,
},
);
self.open_platform_window(window_id);
let root_handle = self.add_view(window_id, build_root_view);
self.ctx.windows.get_mut(&window_id).unwrap().root_view = Some(root_handle.clone().into());
self.focus(window_id, root_handle.id());
self.flush_effects();
(window_id, root_handle)
(window_id, root_view)
}
pub fn remove_window(&mut self, window_id: usize) {
self.ctx.windows.remove(&window_id);
self.presenters_and_platform_windows.remove(&window_id);
self.remove_dropped_entities();
}
fn open_platform_window(&mut self, window_id: usize) {
@@ -1100,7 +1106,7 @@ impl MutableAppContext {
.ctx
.windows
.get(&window_id)
.and_then(|w| w.focused_view)
.map(|w| w.focused_view_id)
.map_or(false, |cur_focused| cur_focused == focused_id)
{
return;
@@ -1108,9 +1114,9 @@ impl MutableAppContext {
self.pending_flushes += 1;
let blurred_id = self.ctx.windows.get_mut(&window_id).and_then(|window| {
let blurred_id = window.focused_view;
window.focused_view = Some(focused_id);
let blurred_id = self.ctx.windows.get_mut(&window_id).map(|window| {
let blurred_id = window.focused_view_id;
window.focused_view_id = focused_id;
blurred_id
});
@@ -1323,13 +1329,13 @@ impl AppContext {
pub fn root_view_id(&self, window_id: usize) -> Option<usize> {
self.windows
.get(&window_id)
.and_then(|window| window.root_view.as_ref().map(|v| v.id()))
.map(|window| window.root_view.id())
}
pub fn focused_view_id(&self, window_id: usize) -> Option<usize> {
self.windows
.get(&window_id)
.and_then(|window| window.focused_view)
.map(|window| window.focused_view_id)
}
pub fn render_view(&self, window_id: usize, view_id: usize) -> Result<ElementBox> {
@@ -1397,10 +1403,9 @@ impl ReadView for AppContext {
}
}
#[derive(Default)]
struct Window {
root_view: Option<AnyViewHandle>,
focused_view: Option<usize>,
root_view: AnyViewHandle,
focused_view_id: usize,
invalidation: Option<WindowInvalidation>,
}