@@ -806,12 +806,49 @@ impl MutableAppContext {
self.cx.focused_view_id(window_id)
}
+ pub fn render_view(
+ &mut self,
+ window_id: usize,
+ view_id: usize,
+ titlebar_height: f32,
+ refreshing: bool,
+ ) -> Result<ElementBox> {
+ let view = self
+ .cx
+ .views
+ .remove(&(window_id, view_id))
+ .ok_or(anyhow!("view not found"))?;
+ let element = view.render(window_id, view_id, titlebar_height, refreshing, self);
+ self.cx.views.insert((window_id, view_id), view);
+ Ok(element)
+ }
+
pub fn render_views(
- &self,
+ &mut self,
window_id: usize,
titlebar_height: f32,
) -> HashMap<usize, ElementBox> {
- self.cx.render_views(window_id, titlebar_height)
+ let view_ids = self
+ .views
+ .keys()
+ .filter_map(|(win_id, view_id)| {
+ if *win_id == window_id {
+ Some(*view_id)
+ } else {
+ None
+ }
+ })
+ .collect::<Vec<_>>();
+ view_ids
+ .into_iter()
+ .map(|view_id| {
+ (
+ view_id,
+ self.render_view(window_id, view_id, titlebar_height, false)
+ .unwrap(),
+ )
+ })
+ .collect()
}
pub fn update<T, F: FnOnce() -> T>(&mut self, callback: F) -> T {
@@ -1204,7 +1241,7 @@ impl MutableAppContext {
});
}
- pub fn build_presenter(&self, window_id: usize, titlebar_height: f32) -> Presenter {
+ pub fn build_presenter(&mut self, window_id: usize, titlebar_height: f32) -> Presenter {
Presenter::new(
window_id,
titlebar_height,
@@ -1215,6 +1252,23 @@ impl MutableAppContext {
)
}
+ pub fn render_cx<V: View>(
+ &mut self,
+ window_id: usize,
+ view_id: usize,
+ titlebar_height: f32,
+ refreshing: bool,
+ ) -> RenderContext<V> {
+ RenderContext {
+ app: self,
+ titlebar_height,
+ refreshing,
+ window_id,
+ view_id,
+ view_type: PhantomData,
+ }
+ }
+
pub fn add_view<T, F>(&mut self, window_id: usize, build_view: F) -> ViewHandle<T>
where
T: View,
@@ -1357,7 +1411,7 @@ impl MutableAppContext {
{
{
let mut presenter = presenter.borrow_mut();
- presenter.invalidate(invalidation, self.as_ref());
+ presenter.invalidate(invalidation, self);
let scene = presenter.build_scene(window.size(), window.scale_factor(), self);
window.present_scene(scene);
}
@@ -1382,7 +1436,7 @@ impl MutableAppContext {
.invalidation
.take();
let mut presenter = presenter.borrow_mut();
- presenter.refresh(invalidation, self.as_ref());
+ presenter.refresh(invalidation, self);
let scene = presenter.build_scene(window.size(), window.scale_factor(), self);
window.present_scene(scene);
}
@@ -1633,56 +1687,6 @@ impl AppContext {
.map(|window| window.focused_view_id)
}
- pub fn render_view(
- &self,
- window_id: usize,
- view_id: usize,
- titlebar_height: f32,
- refreshing: bool,
- ) -> Result<ElementBox> {
- self.views
- .get(&(window_id, view_id))
- .map(|v| v.render(window_id, view_id, titlebar_height, refreshing, self))
- .ok_or(anyhow!("view not found"))
- }
-
- pub fn render_views(
- &self,
- window_id: usize,
- titlebar_height: f32,
- ) -> HashMap<usize, ElementBox> {
- self.views
- .iter()
- .filter_map(|((win_id, view_id), view)| {
- if *win_id == window_id {
- Some((
- *view_id,
- view.render(*win_id, *view_id, titlebar_height, false, self),
- ))
- } else {
- None
- }
- })
- .collect::<HashMap<_, ElementBox>>()
- }
-
- pub fn render_cx<V: View>(
- &self,
- window_id: usize,
- view_id: usize,
- titlebar_height: f32,
- refreshing: bool,
- ) -> RenderContext<V> {
- RenderContext {
- app: self,
- titlebar_height,
- refreshing,
- window_id,
- view_id,
- view_type: PhantomData,
- }
- }
-
pub fn background(&self) -> &Arc<executor::Background> {
&self.background
}
@@ -1834,7 +1838,7 @@ pub trait AnyView {
view_id: usize,
titlebar_height: f32,
refreshing: bool,
- cx: &AppContext,
+ cx: &mut MutableAppContext,
) -> ElementBox;
fn on_focus(&mut self, cx: &mut MutableAppContext, window_id: usize, view_id: usize);
fn on_blur(&mut self, cx: &mut MutableAppContext, window_id: usize, view_id: usize);
@@ -1867,7 +1871,7 @@ where
view_id: usize,
titlebar_height: f32,
refreshing: bool,
- cx: &AppContext,
+ cx: &mut MutableAppContext,
) -> ElementBox {
View::render(
self,
@@ -2244,7 +2248,7 @@ impl<'a, T: View> ViewContext<'a, T> {
}
pub struct RenderContext<'a, T: View> {
- pub app: &'a AppContext,
+ pub app: &'a mut MutableAppContext,
pub titlebar_height: f32,
pub refreshing: bool,
window_id: usize,
@@ -32,7 +32,7 @@ impl Presenter {
font_cache: Arc<FontCache>,
text_layout_cache: TextLayoutCache,
asset_cache: Arc<AssetCache>,
- cx: &MutableAppContext,
+ cx: &mut MutableAppContext,
) -> Self {
Self {
window_id,
@@ -57,7 +57,7 @@ impl Presenter {
path
}
- pub fn invalidate(&mut self, mut invalidation: WindowInvalidation, cx: &AppContext) {
+ pub fn invalidate(&mut self, mut invalidation: WindowInvalidation, cx: &mut MutableAppContext) {
for view_id in invalidation.removed {
invalidation.updated.remove(&view_id);
self.rendered_views.remove(&view_id);
@@ -72,7 +72,11 @@ impl Presenter {
}
}
- pub fn refresh(&mut self, invalidation: Option<WindowInvalidation>, cx: &AppContext) {
+ pub fn refresh(
+ &mut self,
+ invalidation: Option<WindowInvalidation>,
+ cx: &mut MutableAppContext,
+ ) {
if let Some(invalidation) = invalidation {
for view_id in invalidation.removed {
self.rendered_views.remove(&view_id);