Files
endorphin-tessera-gui/src/render/scene.rs
T
2026-10-25 21:25:43 +08:00

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