use concinnity_core::ecs::World;
use super::{EditorHook, FormOverridesData, PanelData, TemplateDetailData, declared_id};
use crate::editor::asset_handle::AssetHandle;
use crate::editor::hud::HudAction;
use crate::editor::overrides;
use crate::editor::panels::form_panel::{self, FormView};
use crate::editor::panels::registry::PanelKey;
use crate::editor::panels::template_panel::{TemplateAction, TemplateView};
impl EditorHook {
pub(super) fn apply_template(&mut self, i: usize) {
let Some(t) = concinnity_cook::authoring::template::TEMPLATES.get(i) else {
return;
};
let entries = crate::authoring::world_template_entries(t);
let mut added = 0;
for entry in entries {
if declared_id(&entry).is_some_and(|n| self.name_taken(n)) {
continue;
}
self.entries.push(entry);
added += 1;
}
if added > 0 {
self.mark_changed();
tracing::info!("editor: applied template '{}' ({added} asset(s))", t.name);
}
}
pub(super) fn panel_data(&self, world: &World) -> PanelData {
let mut form_title = match (self.form.target.is_edit(), &self.form.selected_type) {
(true, Some(t)) => format!("Edit {t}"),
(false, Some(t)) => format!("New {t}"),
_ => "New asset".to_string(),
};
if self.form.touched {
form_title.push_str(" *");
}
let (form_extras, form_blocked) = self.form_extras_data(world);
let names = |set: &std::collections::BTreeSet<AssetHandle>| {
set.iter().filter_map(|h| self.handle_name(h)).collect()
};
PanelData {
rows: self.tree_rows(world),
hidden: names(&self.hidden_assets),
locked: names(&self.locked_assets),
row_menu: self
.assets
.row_menu
.as_ref()
.and_then(|h| self.handle_name(h)),
picker_options: self.picker_options(world),
form_title,
form_overrides: self.form_overrides_data(),
form_extras,
form_blocked,
}
}
fn form_overrides_data(&self) -> Option<FormOverridesData> {
let marks = self.form_override_marks()?;
let count = marks
.iter()
.filter(|m| **m != overrides::FieldOrigin::Inherited)
.count();
Some(FormOverridesData {
field_menu: self.form.override_menu.map(|i| {
let labels = self
.override_menu_options(i)
.into_iter()
.map(|(_, l)| l)
.collect();
(i, labels)
}),
entity_menu: self.form.entity_menu_open.then(|| {
self.entity_menu_options()
.into_iter()
.map(|(_, l)| l)
.collect()
}),
marks,
count,
})
}
pub(super) fn make_form_view<'a>(&'a self, d: &'a PanelData, mouse: [f32; 2]) -> FormView<'a> {
FormView {
title: &d.form_title,
editing: self.form.target.is_edit(),
form_fields: &self.form.fields,
form_scroll: self.form.scroll,
form_focus: self.form.focus,
field_dropdown: self.form.field_dropdown,
field_dropdown_scroll: self.form.field_dropdown_scroll,
form_error: self.form.error.as_deref(),
extras: &d.form_extras,
blocked: d.form_blocked.as_deref(),
overrides: d
.form_overrides
.as_ref()
.map(|ovr| form_panel::OverridesView {
marks: &ovr.marks,
count: ovr.count,
field_menu: ovr
.field_menu
.as_ref()
.map(|(i, opts)| (*i, opts.as_slice())),
entity_menu: ovr.entity_menu.as_deref(),
}),
mouse,
}
}
pub(super) fn apply_top(&mut self, action: HudAction, world: &mut World) {
match action {
HudAction::Save => self.save(),
HudAction::Undo => self.undo(world),
HudAction::Redo => self.redo(world),
HudAction::ToggleView => self.open[PanelKey::View] = !self.open[PanelKey::View],
HudAction::ToggleDisplay => self.toggle_display_menu(),
HudAction::PlayPause => self.sim_toggle_play(),
HudAction::Step => self.sim.step(),
HudAction::Stop => self.sim_stop(),
HudAction::Consume => {}
}
}
pub(super) fn open_template_detail(&mut self, i: usize) {
if i >= concinnity_cook::authoring::template::TEMPLATES.len() {
return;
}
self.templates.detail = Some(i);
self.templates.detail_scroll = 0;
self.focus_panel(PanelKey::TemplateDetail);
}
pub(super) fn close_template_detail(&mut self) {
self.templates.detail = None;
self.templates.detail_scroll = 0;
}
pub(super) fn apply_template_detail(&mut self, action: TemplateAction) {
match action {
TemplateAction::Apply => {
if let Some(i) = self.templates.detail {
self.apply_template(i);
}
self.close_template_detail();
}
TemplateAction::Close => self.close_template_detail(),
TemplateAction::Consume => {}
}
}
pub(super) fn template_detail_data(&self, i: usize) -> TemplateDetailData {
let (title, description) = concinnity_cook::authoring::template::TEMPLATES
.get(i)
.map(|t| (format!("Template {}", t.title), t.description.to_string()))
.unwrap_or_default();
TemplateDetailData {
title,
description,
rows: self.template_rows(i),
}
}
pub(super) fn make_template_view<'a>(
&self,
d: &'a TemplateDetailData,
mouse: [f32; 2],
) -> TemplateView<'a> {
TemplateView {
title: &d.title,
description: &d.description,
rows: &d.rows,
scroll: self.templates.detail_scroll,
mouse,
}
}
}