use bevy::prelude::*;
use jackdaw_api::{
DefaultArea, ExtensionPoint, HierarchyWindow, InspectorWindow,
prelude::{ExtensionContext, ExtensionKind, JackdawExtension, WindowDescriptor},
};
use jackdaw_feathers::icons::Icon;
#[derive(Default)]
pub struct CoreWindowsExtension;
impl JackdawExtension for CoreWindowsExtension {
fn id(&self) -> String {
"jackdaw.core_windows".to_string()
}
fn label(&self) -> String {
"Core Windows".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new(HierarchyWindow::ID)
.with_name("Outliner")
.with_default_area(DefaultArea::Left)
.with_priority(0)
.with_build(|window| {
let icon_font = window
.world()
.get_resource::<jackdaw_feathers::icons::IconFont>()
.map(|f| f.0.clone())
.unwrap_or_default();
window.spawn(crate::layout::hierarchy_content(icon_font));
}),
);
ctx.register_window(
WindowDescriptor::new("jackdaw.import")
.with_name("Import")
.with_default_area(DefaultArea::Left)
.with_priority(1)
.with_build(|window| {
window.spawn((
Node {
flex_grow: 1.0,
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
..default()
},
children![(
Text::new("Import"),
TextFont {
font_size: 11.0,
..default()
},
TextColor(Color::srgba(1.0, 1.0, 1.0, 0.3)),
)],
));
}),
);
ctx.register_window(
WindowDescriptor::new("jackdaw.project_files")
.with_name("Project Files")
.with_default_area(DefaultArea::Left)
.with_priority(10)
.with_build(|window| {
window.spawn(crate::layout::project_files_panel_content());
window
.world_mut()
.resource_mut::<crate::project_files::ProjectFilesState>()
.needs_refresh = true;
}),
);
}
}
#[derive(Default)]
pub struct ViewportExtension;
impl JackdawExtension for ViewportExtension {
fn id(&self) -> String {
"jackdaw.viewport_panel".to_string()
}
fn label(&self) -> String {
"Viewport".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new("jackdaw.viewport")
.with_name("Viewport")
.with_default_area(DefaultArea::Center)
.with_priority(0)
.with_build(|window| {
let parent = window.target_entity();
crate::viewport::build_viewport_panel(window.world_mut(), parent);
}),
);
}
}
#[derive(Default)]
pub struct AssetBrowserExtension;
impl JackdawExtension for AssetBrowserExtension {
fn id(&self) -> String {
"jackdaw.asset_browser".to_string()
}
fn label(&self) -> String {
"Asset Browser".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new("jackdaw.assets")
.with_name("Assets")
.with_icon(Icon::FolderOpen.unicode())
.with_default_area(DefaultArea::BottomDock)
.with_priority(0)
.with_build(|window| {
let icon_font = window
.world()
.get_resource::<jackdaw_feathers::icons::IconFont>()
.map(|f| f.0.clone())
.unwrap_or_default();
window.spawn(crate::asset_browser::asset_browser_panel(icon_font));
window
.world_mut()
.resource_mut::<crate::asset_browser::AssetBrowserState>()
.needs_refresh = true;
}),
);
}
}
#[derive(Default)]
pub struct TimelineExtension;
impl JackdawExtension for TimelineExtension {
fn id(&self) -> String {
"jackdaw.timeline".to_string()
}
fn label(&self) -> String {
"Timeline".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new("jackdaw.timeline")
.with_name("Timeline")
.with_icon(Icon::Ruler.unicode())
.with_default_area(DefaultArea::BottomDock)
.with_priority(1)
.with_build(|window| {
window.spawn(jackdaw_animation::timeline_panel());
}),
);
}
}
#[derive(Default)]
pub struct TerminalExtension;
impl JackdawExtension for TerminalExtension {
fn id(&self) -> String {
"jackdaw.terminal".to_string()
}
fn label(&self) -> String {
"Terminal".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new("jackdaw.terminal")
.with_name("Terminal")
.with_icon(Icon::Terminal.unicode())
.with_default_area(DefaultArea::BottomDock)
.with_priority(2)
.with_build(|window| {
window.spawn((
Node {
flex_grow: 1.0,
width: Val::Percent(100.0),
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
..default()
},
children![(
Text::new("Terminal window (not implemented yet)"),
TextFont {
font_size: 11.0,
..default()
},
TextColor(Color::srgba(1.0, 1.0, 1.0, 0.3)),
)],
));
}),
);
}
}
#[derive(Default)]
pub struct InspectorExtension;
impl JackdawExtension for InspectorExtension {
fn id(&self) -> String {
"jackdaw.inspector".to_string()
}
fn label(&self) -> String {
"Inspector".to_string()
}
fn kind(&self) -> ExtensionKind {
ExtensionKind::Builtin
}
fn register(&self, ctx: &mut ExtensionContext) {
ctx.register_window(
WindowDescriptor::new(InspectorWindow::ID)
.with_name("Components")
.with_default_area(DefaultArea::RightSidebar)
.with_priority(0)
.with_build(|window| {
let icon_font = window
.world()
.get_resource::<jackdaw_feathers::icons::IconFont>()
.map(|f| f.0.clone())
.unwrap_or_default();
window.spawn(crate::layout::inspector_components_content(icon_font));
}),
);
ctx.register_window(
WindowDescriptor::new("jackdaw.inspector.materials")
.with_name("Materials")
.with_default_area(DefaultArea::RightSidebar)
.with_priority(1)
.with_build(|window| {
let icon_font = window
.world()
.get_resource::<jackdaw_feathers::icons::IconFont>()
.map(|f| f.0.clone())
.unwrap_or_default();
window.spawn(crate::material_browser::material_browser_panel(icon_font));
window
.world_mut()
.resource_mut::<crate::material_browser::MaterialBrowserState>()
.needs_rescan = true;
}),
);
ctx.register_window(
WindowDescriptor::new("jackdaw.inspector.resources")
.with_name("Resources")
.with_default_area(DefaultArea::RightSidebar)
.with_priority(2)
.with_build(|window| {
window.spawn((
Node {
flex_grow: 1.0,
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
..default()
},
children![(
Text::new("Resources"),
TextFont {
font_size: 11.0,
..default()
},
TextColor(Color::srgba(1.0, 1.0, 1.0, 0.3)),
)],
));
}),
);
ctx.register_window(
WindowDescriptor::new("jackdaw.inspector.systems")
.with_name("Systems")
.with_default_area(DefaultArea::RightSidebar)
.with_priority(3)
.with_build(|window| {
window.spawn((
Node {
flex_grow: 1.0,
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
..default()
},
children![(
Text::new("Systems"),
TextFont {
font_size: 11.0,
..default()
},
TextColor(Color::srgba(1.0, 1.0, 1.0, 0.3)),
)],
));
}),
);
}
}