105 lines
3.1 KiB
Rust
105 lines
3.1 KiB
Rust
use crate::{
|
|
activity::Activity,
|
|
developer_tools::{self, DeveloperToolsLayout, Workspace as DeveloperToolsState},
|
|
display_list::DisplayList,
|
|
document::RenderDocument,
|
|
};
|
|
|
|
#[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,
|
|
tab_chrome: crate::tabs::Chrome,
|
|
) -> 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 mut display_list = document.display_list(scale).unwrap_or_else(|_| {
|
|
RenderDocument::default()
|
|
.display_list(scale)
|
|
.expect("default document is valid")
|
|
});
|
|
let offset = crate::tabs::height(&document.frame.tabs);
|
|
let inset = crate::tabs::INSET;
|
|
let left = crate::tabs::RAIL;
|
|
let content = crate::geometry::Rect::new(
|
|
left * scale,
|
|
offset * scale,
|
|
(width as f32 - (left + inset) * scale).max(0.0),
|
|
(height as f32 - (offset + inset) * scale).max(0.0),
|
|
);
|
|
display_list.translate(crate::geometry::Point::new(left * scale, offset * scale));
|
|
let mut framed = DisplayList::default();
|
|
use crate::display_list::DrawCommand;
|
|
framed.push(DrawCommand::Clear(crate::system_ui::theme::BAR));
|
|
framed.push(DrawCommand::PushClip(content));
|
|
for command in display_list.commands() {
|
|
if let DrawCommand::Clear(color) = command {
|
|
framed.push(DrawCommand::FillRoundedRect {
|
|
rect: content,
|
|
radius: 10.0 * scale,
|
|
color: *color,
|
|
});
|
|
} else {
|
|
framed.push(command.clone());
|
|
}
|
|
}
|
|
framed.push(DrawCommand::PopClip);
|
|
let mut display_list = framed;
|
|
crate::tabs::draw(
|
|
tab_chrome.offset,
|
|
&mut display_list,
|
|
&document.frame.tabs,
|
|
width as f32 / scale,
|
|
scale,
|
|
tab_chrome.pointer,
|
|
&tab_chrome.visual,
|
|
);
|
|
if let Some(index) = tab_chrome.insertion {
|
|
crate::tabs::draw_insertion(
|
|
tab_chrome.offset,
|
|
&mut display_list,
|
|
&document.frame.tabs,
|
|
width as f32 / scale,
|
|
index,
|
|
scale,
|
|
);
|
|
}
|
|
let (mut developer_list, mut developer_layout) = developer_tools::build(
|
|
width.saturating_sub(((left + inset) * scale) as u32),
|
|
height.saturating_sub(((offset + inset) * scale) as u32),
|
|
scale,
|
|
document,
|
|
developer_tools_state,
|
|
activity,
|
|
);
|
|
developer_list.translate(crate::geometry::Point::new(left * scale, offset * scale));
|
|
developer_layout.translate(left, offset);
|
|
display_list.extend(developer_list);
|
|
|
|
DisplayScene {
|
|
display_list,
|
|
layout: SceneLayout {
|
|
developer_tools: developer_layout,
|
|
},
|
|
}
|
|
}
|
|
|
|
pub struct DisplayScene {
|
|
pub display_list: DisplayList,
|
|
pub layout: SceneLayout,
|
|
}
|