namespace UIWidgets { using UIWidgets.Styles; using UnityEngine; using UnityEngine.UI; /// /// Picker for the TreeViewCustom. /// /// Type of the TreeView. /// Type of the TreeView component. /// Type of the value. /// Type of the node. /// Type of the this picker. public class PickerTreeViewCustom : Picker where TTreeView : TreeViewCustom where TTreeViewComponent : TreeViewComponentBase where TNode : TreeNode where TPicker : Picker { /// /// TreeView. /// [SerializeField] public TTreeView TreeView; /// /// OK button. /// [SerializeField] public Button OkButton; /// /// Prepare picker to open. /// /// Default value. public override void BeforeOpen(TNode defaultValue) { TreeView.SelectedIndex = Node2Index(defaultValue); TreeView.NodeSelected.AddListener(NodeChanged); TreeView.NodeDeselected.AddListener(NodeChanged); OkButton.onClick.AddListener(OkClick); NodeChanged(null); } /// /// Get node index. /// /// Node. /// Index. protected int Node2Index(TNode node) { for (int i = 0; i < TreeView.DataSource.Count; i++) { if (TreeView.DataSource[i].Node.Equals(node)) { return i; } } return -1; } /// /// Handle selected node event. /// /// Node. protected virtual void NodeChanged(TreeNode node) { OkButton.interactable = TreeView.SelectedNode != null; } /// /// Handle OkButton click. /// public void OkClick() { var node = TreeView.SelectedNode; if (node == null) { return; } Selected(node as TNode); } /// /// Prepare picker to close. /// public override void BeforeClose() { TreeView.NodeSelected.RemoveListener(NodeChanged); TreeView.NodeDeselected.RemoveListener(NodeChanged); OkButton.onClick.RemoveListener(OkClick); } #region IStylable implementation /// public override bool SetStyle(Style style) { base.SetStyle(style); TreeView.SetStyle(style); style.Dialog.Button.ApplyTo(OkButton.gameObject); style.Dialog.Button.ApplyTo(transform.Find("Buttons/Cancel")); return true; } /// public override bool GetStyle(Style style) { base.GetStyle(style); TreeView.GetStyle(style); style.Dialog.Button.GetFrom(OkButton.gameObject); style.Dialog.Button.GetFrom(transform.Find("Buttons/Cancel")); return true; } #endregion } }