Files
endorphin-tessera-gui/src/render/scene.rs
T

91 lines
2.7 KiB
Rust

use crate::{
activity::Activity,
developer_tools::{self, DeveloperToolsLayout, Workspace as DeveloperToolsState},
display_list::{DisplayList, DrawCommand},
document::RenderDocument,
geometry::{Point, Rect},
};
#[derive(Clone, Debug, Default)]
pub struct SceneLayout {
pub developer_tools: DeveloperToolsLayout,
}
pub fn build_scene(
width: u32,
height: u32,
scale: f32,
document: &RenderDocument,
developer_tools_state: &mut DeveloperToolsState,
activity: &Activity,
sidebar: &mut crate::sidebar::State,
) -> DisplayScene {
let tool = document
.frame
.tabs
.iter()
.find(|tab| tab.active)
.and_then(|tab| tab.developer_tool.as_deref());
developer_tools_state.select(tool);
developer_tools_state.document_updated(document);
let left = sidebar.left();
let surface = &document.frame.surface;
let content = Rect::new(
left * scale,
0.0,
(width as f32 - left * scale).max(0.0),
height as f32,
);
let zoom = if tool.is_some() { 1.0 } else { surface.zoom };
let mut page = document.display_list(scale * zoom).unwrap_or_else(|_| {
RenderDocument::default()
.display_list(scale)
.expect("default document is valid")
});
page.translate(Point::new(
(left - surface.pan.x * zoom) * scale,
-surface.pan.y * zoom * scale,
));
let mut display_list = DisplayList::default();
display_list.push(DrawCommand::Clear(
crate::document::parse_color(&document.frame.background)
.unwrap_or(crate::system_ui::theme::BG),
));
display_list.push(DrawCommand::PushClip(content));
for command in page.commands() {
if !matches!(command, DrawCommand::Clear(_)) {
display_list.push(command.clone());
}
}
display_list.push(DrawCommand::PopClip);
let (mut developer_list, mut developer_layout) = developer_tools::build(
width.saturating_sub((left * scale) as u32),
height,
scale,
document,
developer_tools_state,
activity,
);
developer_list.translate(Point::new(left * scale, 0.0));
developer_layout.translate(left, 0.0);
display_list.extend(developer_list);
let mut chrome = sidebar.draw(
&document.frame.tabs,
height as f32 / scale,
developer_tools_state.accent,
);
chrome.scale(scale);
display_list.extend(chrome);
DisplayScene {
display_list,
layout: SceneLayout {
developer_tools: developer_layout,
},
}
}
pub struct DisplayScene {
pub display_list: DisplayList,
pub layout: SceneLayout,
}