using Godot; using System.Collections.Generic; using Chessistics.Engine.Model; namespace Chessistics.Scripts.UI; public partial class ObjectivePanel : VBoxContainer { private readonly Dictionary _entries = new(); public void Setup(IReadOnlyList demands) { foreach (var child in GetChildren()) child.QueueFree(); _entries.Clear(); var title = new Label { Text = "OBJECTIFS" }; title.AddThemeFontSizeOverride("font_size", 16); title.AddThemeColorOverride("font_color", new Color("#B8942A")); // aged gold AddChild(title); AddChild(new HSeparator()); foreach (var demand in demands) { var vbox = new VBoxContainer(); vbox.AddThemeConstantOverride("separation", 2); var label = new Label { Text = $"{demand.Name}: 0/{demand.Amount} {demand.Cargo}" }; label.AddThemeFontSizeOverride("font_size", 12); label.AddThemeColorOverride("font_color", new Color("#CCCCCC")); vbox.AddChild(label); var bar = new ProgressBar { MinValue = 0, MaxValue = demand.Amount, Value = 0, CustomMinimumSize = new Vector2(180, 14), ShowPercentage = false }; // Style the progress bar var bgStyle = new StyleBoxFlat { BgColor = new Color(0.2f, 0.2f, 0.22f), CornerRadiusTopLeft = 3, CornerRadiusTopRight = 3, CornerRadiusBottomLeft = 3, CornerRadiusBottomRight = 3 }; var fillStyle = new StyleBoxFlat { BgColor = new Color("#3D6B8E"), // teal fill CornerRadiusTopLeft = 3, CornerRadiusTopRight = 3, CornerRadiusBottomLeft = 3, CornerRadiusBottomRight = 3 }; bar.AddThemeStyleboxOverride("background", bgStyle); bar.AddThemeStyleboxOverride("fill", fillStyle); vbox.AddChild(bar); var deadline = new Label { Text = $"Deadline: {demand.Deadline} coups" }; deadline.AddThemeFontSizeOverride("font_size", 10); deadline.AddThemeColorOverride("font_color", new Color("#777777")); vbox.AddChild(deadline); AddChild(vbox); _entries[demand.Position] = (label, bar, deadline); } } public void UpdateProgress(Coords demandCell, string name, int current, int required) { if (!_entries.TryGetValue(demandCell, out var entry)) return; entry.label.Text = $"{name}: {current}/{required}"; // Animate the progress bar value var tween = entry.bar.CreateTween(); tween.TweenProperty(entry.bar, "value", (double)current, 0.2f) .SetEase(Tween.EaseType.Out).SetTrans(Tween.TransitionType.Cubic); if (current >= required) { entry.label.AddThemeColorOverride("font_color", new Color("#5AAC5A")); // warm green // Flash the progress bar green var fillStyle = new StyleBoxFlat { BgColor = new Color("#5AAC5A"), CornerRadiusTopLeft = 3, CornerRadiusTopRight = 3, CornerRadiusBottomLeft = 3, CornerRadiusBottomRight = 3 }; entry.bar.AddThemeStyleboxOverride("fill", fillStyle); } } }