use godot::{ classes::{Control, IControl, Label, LinkButton, MarginContainer, VBoxContainer}, prelude::*, }; use crate::credits::{CreditPerson, Credits}; const CREDITS: &'static str = include_str!("../../../credits.toml"); #[derive(GodotClass)] #[class(base=Control, tool)] pub struct CreditsMenu { #[export] credits_container: Option>, credits: Credits, base: Base, } #[godot_api] impl IControl for CreditsMenu { fn init(base: Base) -> Self { let credits = toml::from_str(CREDITS).unwrap_or(Default::default()); CreditsMenu { credits_container: None, credits, base, } } fn ready(&mut self) { if let Some(container) = &mut self.credits_container { for child in container.get_children().iter_shared() { container.remove_child(&child); } } for person in self.credits.people.clone() { self.add_credit(person); } } } #[godot_api] impl CreditsMenu { pub fn add_credit(&mut self, credit: CreditPerson) { if let Some(container) = &mut self.credits_container { let mut margin = MarginContainer::new_alloc(); margin.add_theme_constant_override("margin_bottom", 15); let mut vbox = VBoxContainer::new_alloc(); let name = if let Some(uri) = credit.link { let mut link = LinkButton::new_alloc(); link.set_text(&credit.name); link.set_uri(&uri); link.upcast::() } else { let mut label = Label::new_alloc(); label.set_text(&credit.name); label.upcast() }; vbox.add_child(&name); for credit in credit.credits { let mut credit_margin = MarginContainer::new_alloc(); credit_margin.add_theme_constant_override("margin_left", 20); let credit = if let Some(uri) = credit.link { let mut link = LinkButton::new_alloc(); link.set_text(&format!("- {}", credit.credit)); link.set_uri(&uri); link.upcast::() } else { let mut label = Label::new_alloc(); label.set_text(&format!("- {}", credit.credit)); label.upcast() }; credit_margin.add_child(&credit); vbox.add_child(&credit_margin); } margin.add_child(&vbox); container.add_child(&margin); } } #[func] pub fn close(&mut self) { self.base_mut().queue_free(); } }