This commit is contained in:
Nathan Sobo
2023-04-11 21:56:37 -06:00
parent e6cc132b19
commit d9e4136b02
14 changed files with 235 additions and 150 deletions
+40 -16
View File
@@ -12,8 +12,9 @@ use crate::{
},
text_layout::TextLayoutCache,
util::post_inc,
AnyView, AnyViewHandle, AppContext, Element, ElementBox, MouseRegion, MouseRegionId, ParentId,
RenderParams, SceneBuilder, View, ViewContext, ViewHandle, WindowInvalidation,
AnyView, AnyViewHandle, AppContext, Element, ElementBox, Entity, ModelContext, ModelHandle,
MouseRegion, MouseRegionId, ParentId, ReadView, RenderParams, SceneBuilder, UpdateModel, View,
ViewContext, ViewHandle, WindowInvalidation,
};
use anyhow::bail;
use collections::{HashMap, HashSet};
@@ -119,6 +120,22 @@ impl DerefMut for WindowContext<'_, '_> {
}
}
impl UpdateModel for WindowContext<'_, '_> {
fn update_model<M: Entity, R>(
&mut self,
handle: &ModelHandle<M>,
update: &mut dyn FnMut(&mut M, &mut ModelContext<M>) -> R,
) -> R {
self.app_context.update_model(handle, update)
}
}
impl ReadView for WindowContext<'_, '_> {
fn read_view<W: View>(&self, handle: &crate::ViewHandle<W>) -> &W {
self.app_context.read_view(handle)
}
}
impl<'a: 'b, 'b> WindowContext<'a, 'b> {
pub fn new(app_context: &'a mut AppContext, window: &'b mut Window, window_id: usize) -> Self {
Self {
@@ -133,6 +150,14 @@ impl<'a: 'b, 'b> WindowContext<'a, 'b> {
self.window_id
}
pub fn app_context(&mut self) -> &mut AppContext {
self.app_context
}
pub fn root_view(&self) -> &AnyViewHandle {
self.window.root_view()
}
pub fn window_size(&self) -> Vector2F {
self.window.platform_window.content_size()
}
@@ -701,23 +726,22 @@ impl<'a: 'b, 'b> WindowContext<'a, 'b> {
}
pub fn rect_for_text_range(&self, range_utf16: Range<usize>) -> Option<RectF> {
todo!()
let root_view_id = self.window.root_view().id();
self.window
.rendered_views
.get(&root_view_id)?
.rect_for_text_range(range_utf16, self, root_view_id)
}
pub fn debug_elements(&self) -> Option<json::Value> {
todo!()
// let view = self.root_view()?;
// Some(json!({
// "root_view": view.debug_json(self),
// "root_element": self.window.rendered_views.get(&view.id())
// .map(|root_element| {
// root_element.debug(&DebugContext {
// rendered_views: &self.window.rendered_views,
// font_cache: &self.window.font_cache,
// app: self,
// })
// })
// }))
let view = self.window.root_view();
Some(json!({
"root_view": view.debug_json(self),
"root_element": self.window.rendered_views.get(&view.id())
.map(|root_element| {
root_element.debug(self, view.id())
})
}))
}
pub fn set_window_title(&mut self, title: &str) {