VR Development Framework
v 1.0.0
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Events Pages
AVRUI_Link_Dropdown.cs
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using UnityEngine.UI;
5 using UnityEditor;
6 
7 using AVR.Core;
8 namespace AVR.UI.Link {
9  [ExecuteInEditMode]
10  [RequireComponent(typeof(Dropdown))]
12  {
13  public override List<System.Type> validTypes => new List<System.Type> {typeof(System.Enum)};
14 
15  private Dropdown input;
16 
17  protected virtual UnityEngine.Events.UnityAction<int> updateValueListener => delegate { this.updateValue(); };
18 
19  public override void setup() {
20  init();
21 
22  if(!target) return;
23 
24  System.Type field_type = null;
25  if(memberType==MemberType.FIELD) field_type = target.GetType().GetField(field).FieldType;
26  else field_type = target.GetType().GetProperty(field).PropertyType;
27 
28  object current_value = target.GetType().GetField(field).GetValue(target);
29  string current_name = System.Enum.GetName(field_type, current_value);
30 
31  string[] names = System.Enum.GetNames(field_type);
32 
33  input.options.Clear();
34  for (int i = 0; i < names.Length; i++)
35  {
36  input.options.Add(new Dropdown.OptionData(names[i]));
37  if (names[i] == current_name) input.value = i;
38  }
39 
40  updateOutput();
41 
42  // Make sure we have the adequate persisten listeners by (possibly) removing and re-adding
43  #if UNITY_EDITOR
44  UnityEditor.Events.UnityEventTools.RemovePersistentListener(input.onValueChanged, updateValueListener);
45  UnityEditor.Events.UnityEventTools.AddPersistentListener(input.onValueChanged, updateValueListener);
46  #endif
47 
48  }
49 
50  public override void init() {
51  if(!input) input = GetComponent<Dropdown>();
52 
53  if(input) old_value = input.value.ToString();
54  }
55 
56  public override void updateValue()
57  {
58  // Get the value currently displayed
59  string text = input.options[input.value].text;
60 
61  // Update it to the target, if possible.
62  try {
63  switch (memberType)
64  {
65  case MemberType.FIELD:
66  {
67  int numval = (int)System.Enum.Parse(target.GetType().GetField(field).FieldType, text);
68  target.GetType().GetField(field).SetValue(target, numval);
69  break;
70  }
71  case MemberType.PROPERTY:
72  {
73  int numval = (int)System.Enum.Parse(target.GetType().GetProperty(field).PropertyType, text);
74  target.GetType().GetProperty(field).SetValue(target, numval);
75  break;
76  }
77  }
78  }
79  catch(System.Exception) {
80  AVR_DevConsole.cwarn("Could not update the given target value to "+text, this);
81  }
82  }
83 
84  private string old_value;
85 
86  public override void updateOutput()
87  {
88  // Do nothing if the user is still typing the value
89  int current_value = 0;
90 
91  switch (memberType)
92  {
93  case MemberType.FIELD:
94  {
95  current_value = (int)target.GetType().GetField(field).GetValue(target);
96  break;
97  }
98  case MemberType.PROPERTY:
99  {
100  current_value = (int)target.GetType().GetProperty(field).GetValue(target);
101  break;
102  }
103  }
104 
105  input.value = current_value;
106 
107 #if UNITY_EDITOR
108  if (old_value != current_value.ToString() && !Application.isPlaying)
109  {
110  EditorUtility.SetDirty(input);
111  old_value = current_value.ToString();
112  }
113 #endif
114  }
115  }
116 }