using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// Binder for the "Paintings" library panel. The panel's visual layout (Panel_Paintings, the scrollable /// list, an entry template, and the Save / Confirm dialogs) is authored inside the PaintHudPanel layout /// prefab - this code only finds those objects by their stable names and wires the behaviour, exactly like /// does for the brush widgets. The list is populated by cloning the authored /// Lib_EntryTemplate per saved slot. Save opens a name dialog (blocked if the name already exists, no /// overwrite); Load and Delete go through a confirmation dialog. Loading replaces the current painting and, /// when networked, re-broadcasts the loaded state to every other peer. /// public partial class PaintHud { // Stable widget names, matching the objects authored in the PaintHudPanel prefab. private const string LibListContent = "Lib_ListContent"; private const string LibEntryTemplate = "Lib_EntryTemplate"; private const string LibSaveButton = "Lib_Save"; private const string LibLoadButton = "Lib_Load"; private const string LibDeleteButton = "Lib_Delete"; private const string LibSaveDialog = "Lib_SaveDialog"; private const string LibNameInput = "Lib_NameInput"; private const string LibSaveInfo = "Lib_SaveInfo"; private const string LibSaveOk = "Lib_SaveOk"; private const string LibSaveCancel = "Lib_SaveCancel"; private const string LibConfirmDialog = "Lib_ConfirmDialog"; private const string LibConfirmText = "Lib_ConfirmText"; private const string LibConfirmOk = "Lib_ConfirmOk"; private const string LibConfirmCancel = "Lib_ConfirmCancel"; private bool _libraryBound; private RectTransform _listContent; private GameObject _entryTemplate; private Button _saveButton, _loadButton, _deleteButton; private string _selectedPainting; // Save dialog private GameObject _saveDialog; private TMP_InputField _nameInput; private TMP_Text _saveInfo; private Button _saveOkButton; // Confirmation dialog (reused for Load + Delete) private GameObject _confirmDialog; private TMP_Text _confirmText; private Button _confirmButton; private Action _confirmAction; private struct EntryRef { public string name; public Image bg; } private readonly List _entries = new List(); private static readonly Color EntryNormal = new Color(0.18f, 0.18f, 0.22f, 1f); private static readonly Color EntrySelected = new Color(0.20f, 0.45f, 0.80f, 1f); private static readonly Color OkAccent = new Color(0.20f, 0.45f, 0.80f, 1f); private static readonly Color OkDanger = new Color(0.62f, 0.26f, 0.26f, 1f); // --- Bind (find authored objects, hook listeners) --- /// /// Binds the authored library panel under (the instantiated layout prefab). /// Idempotent: binds exactly once. No-op if the prefab carries no library objects. /// private void BindLibrary(Transform root) { if (_libraryBound || !root) return; _listContent = FindDeep(root, LibListContent) as RectTransform; var template = FindDeep(root, LibEntryTemplate); _entryTemplate = template ? template.gameObject : null; if (!_listContent || !_entryTemplate) return; // panel not present in this layout _entryTemplate.SetActive(false); _saveButton = Find