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, }