private InspectorField InstantiateDrawer(InspectorField drawer, Transform drawerParent) { List <InspectorField> drawerPool; if (drawersPool.TryGetValue(drawer.GetType(), out drawerPool)) { for (int i = drawerPool.Count - 1; i >= 0; i--) { InspectorField instance = drawerPool[i]; drawerPool.RemoveAt(i); if (instance) { instance.transform.SetParent(drawerParent, false); instance.gameObject.SetActive(true); return(instance); } } } InspectorField newDrawer = (InspectorField)Instantiate(drawer, drawerParent, false); newDrawer.Initialize(); return(newDrawer); }
protected override void GenerateElements() { if (components.Count == 0) { return; } CreateDrawer(typeof(bool), "Is Active", () => ((GameObject)Value).activeSelf, (value) => ((GameObject)Value).SetActive((bool)value)); nameField = CreateDrawer(typeof(string), "Name", () => ((GameObject)Value).name, (value) => { ((GameObject)Value).name = (string)value; NameRaw = Value.GetNameWithType(); RuntimeHierarchy hierarchy = Inspector.ConnectedHierarchy; if (hierarchy != null) { hierarchy.RefreshNameOf(((GameObject)Value).transform); } }) as StringField; tagField = CreateDrawer(typeof(string), "Tag", () => { GameObject go = (GameObject)Value; if (!go.CompareTag(currentTag)) { currentTag = go.tag; } return(currentTag); }, (value) => ((GameObject)Value).tag = (string)value) as StringField; CreateDrawerForVariable(typeof(GameObject).GetProperty("layer"), "Layer"); for (int i = 0, j = elements.Count; i < components.Count; i++) { InspectorField componentDrawer = CreateDrawerForComponent(components[i]); if (componentDrawer != null) { if (j < componentsExpandedStates.Count && componentsExpandedStates[j] && componentDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)componentDrawer).IsExpanded = true; } j++; } } if (nameField != null) { nameField.SetterMode = StringField.Mode.OnSubmit; } if (tagField != null) { tagField.SetterMode = StringField.Mode.OnSubmit; } componentsExpandedStates.Clear(); }
protected override void Update() { base.Update(); if (IsBound) { float time = Time.realtimeSinceStartup; if (isDirty) { // Rebind to refresh the exposed variables in Inspector object inspectedObject = m_inspectedObject; StopInspect(); Inspect(inspectedObject); isDirty = false; nextRefreshTime = time + refreshInterval; } else { if (time > nextRefreshTime) { nextRefreshTime = time + refreshInterval; Refresh(); } } // Check if a pointer has remained static over a drawer for a while; if so, show a tooltip if (hoveringPointer != null) { Vector2 pointerDelta = hoveringPointer.delta; if (pointerDelta.x != 0f || pointerDelta.y != 0f) { hoveredDrawerTooltipShowTime = time + m_tooltipDelay; } else if (time > hoveredDrawerTooltipShowTime) { // Make sure that everything is OK if (!hoveredDrawer || !hoveredDrawer.gameObject.activeSelf) { hoveredDrawer = null; hoveringPointer = null; } else { RuntimeInspectorUtils.ShowTooltip(hoveredDrawer.NameRaw, hoveringPointer, Skin, m_canvas); // Don't show the tooltip again until the pointer moves hoveredDrawerTooltipShowTime = float.PositiveInfinity; } } } } else if (currentDrawer != null) { StopInspect(); } }
protected override void GenerateElements() { if (Value == null) { return; } if (isArray) { Array array = (Array)Value; for (int i = 0; i < array.Length; i++) { InspectorField elementDrawer = Inspector.CreateDrawerForType(elementType, drawArea, Depth + 1); if (elementDrawer == null) { break; } int j = i; elementDrawer.BindTo(elementType, string.Empty, () => ((Array)Value).GetValue(j), (value) => { Array _array = (Array)Value; _array.SetValue(value, j); Value = _array; }); elementDrawer.NameRaw = Inspector.ArrayIndicesStartAtOne ? (i + 1) + ":" : i + ":"; elements.Add(elementDrawer); } } else { IList list = (IList)Value; for (int i = 0; i < list.Count; i++) { InspectorField elementDrawer = Inspector.CreateDrawerForType(elementType, drawArea, Depth + 1); if (elementDrawer == null) { break; } int j = i; string variableName = Inspector.ArrayIndicesStartAtOne ? (i + 1) + ":" : i + ":"; elementDrawer.BindTo(elementType, variableName, () => ((IList)Value)[j], (value) => { IList _list = (IList)Value; _list[j] = value; Value = _list; }); elements.Add(elementDrawer); } } sizeInput.Text = "" + Length; }
protected InspectorField CreateDrawer(Type variableType, string variableName, Getter getter, Setter setter, bool drawObjectsAsFields = true) { InspectorField variableDrawer = Inspector.CreateDrawerForType(variableType, drawArea, Depth + 1, drawObjectsAsFields); if (variableDrawer != null) { variableDrawer.BindTo(variableType, variableName, getter, setter); elements.Add(variableDrawer); } return(variableDrawer); }
public void BindTo(InspectorField parent, MemberInfo variable, string variableName = null) { if (variable is FieldInfo) { FieldInfo field = (FieldInfo)variable; if (variableName == null) { variableName = field.Name; } #if UNITY_EDITOR || !NETFX_CORE if (!parent.BoundVariableType.IsValueType) #else if (!parent.BoundVariableType.GetTypeInfo().IsValueType) #endif { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => field.SetValue(parent.Value, value), variable); } else { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => { field.SetValue(parent.Value, value); parent.Value = parent.Value; }, variable); } } else if (variable is PropertyInfo) { PropertyInfo property = (PropertyInfo)variable; if (variableName == null) { variableName = property.Name; } #if UNITY_EDITOR || !NETFX_CORE if (!parent.BoundVariableType.IsValueType) #else if (!parent.BoundVariableType.GetTypeInfo().IsValueType) #endif { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => property.SetValue(parent.Value, value, null), variable); } else { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => { property.SetValue(parent.Value, value, null); parent.Value = parent.Value; }, variable); } } else { throw new ArgumentException("Variable can either be a field or a property"); } }
protected InspectorField CreateDrawerForVariable(MemberInfo variable, string variableName = null) { Type variableType = variable is FieldInfo ? ((FieldInfo)variable).FieldType : ((PropertyInfo)variable).PropertyType; InspectorField variableDrawer = Inspector.CreateDrawerForType(variableType, drawArea, Depth + 1, true, variable); if (variableDrawer != null) { variableDrawer.BindTo(this, variable, variableName); elements.Add(variableDrawer); } return(variableDrawer); }
public void BindTo(InspectorField parent, MemberInfo member, string variableName = null) { if (member is FieldInfo) { FieldInfo field = (FieldInfo)member; if (variableName == null) { variableName = field.Name; } if (!parent.BoundVariableType.IsValueType) { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => field.SetValue(parent.Value, value)); } else { BindTo(field.FieldType, variableName, () => field.GetValue(parent.Value), (value) => { field.SetValue(parent.Value, value); parent.Value = parent.Value; }); } } else if (member is PropertyInfo) { PropertyInfo property = (PropertyInfo)member; if (variableName == null) { variableName = property.Name; } if (!parent.BoundVariableType.IsValueType) { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => property.SetValue(parent.Value, value, null)); } else { BindTo(property.PropertyType, variableName, () => property.GetValue(parent.Value, null), (value) => { property.SetValue(parent.Value, value, null); parent.Value = parent.Value; }); } } else { throw new ArgumentException("Member can either be a field or a property"); } }
public InspectorField CreateDrawerForType(Type type, Transform drawerParent, int depth, bool drawObjectsAsFields = true) { InspectorField variableDrawer = GetDrawerForType(type, drawObjectsAsFields); if (variableDrawer != null) { InspectorField drawer = InstantiateDrawer(variableDrawer, drawerParent); drawer.Inspector = this; drawer.Skin = Skin; drawer.Depth = depth; return(drawer); } return(null); }
public InspectorField CreateDrawer(Type variableType, string variableName, Getter getter, Setter setter, bool drawObjectsAsFields = true) { InspectorField variableDrawer = Inspector.CreateDrawerForType(variableType, drawArea, Depth + 1, drawObjectsAsFields); if (variableDrawer != null) { variableDrawer.BindTo(variableType, variableName == null ? null : string.Empty, getter, setter); if (variableName != null) { variableDrawer.NameRaw = variableName; } elements.Add(variableDrawer); } return(variableDrawer); }
internal void OnDrawerHovered(InspectorField drawer, PointerEventData pointer, bool isHovering) { // Hide tooltip if it is currently visible RuntimeInspectorUtils.HideTooltip(); if (isHovering) { hoveredDrawer = drawer; hoveringPointer = pointer; hoveredDrawerTooltipShowTime = Time.realtimeSinceStartup + m_tooltipDelay; } else if (hoveredDrawer == drawer) { hoveredDrawer = null; hoveringPointer = null; } }
public void StopInspect() { if (inspectLock) { return; } if (currentDrawer != null) { currentDrawer.Unbind(); currentDrawer = null; } m_inspectedObject = null; scrollView.verticalNormalizedPosition = 1f; ColorPicker.Instance.Close(); ObjectReferencePicker.Instance.Close(); }
protected InspectorField CreateDrawerForComponent(Component component, string variableName = null) { InspectorField variableDrawer = Inspector.CreateDrawerForType(component.GetType(), drawArea, Depth + 1, false); if (variableDrawer != null) { if (variableName == null) { variableName = component.GetType().Name + " component"; } variableDrawer.BindTo(component.GetType(), string.Empty, () => component, (value) => { }); variableDrawer.NameRaw = variableName; elements.Add(variableDrawer); } return(variableDrawer); }
public InspectorField CreateDrawerForType(Type type, Transform drawerParent, int depth, bool drawObjectsAsFields = true, MemberInfo variable = null) { InspectorField[] variableDrawers = GetDrawersForType(type, drawObjectsAsFields); if (variableDrawers != null) { for (int i = 0; i < variableDrawers.Length; i++) { if (variableDrawers[i].CanBindTo(type, variable)) { InspectorField drawer = InstantiateDrawer(variableDrawers[i], drawerParent); drawer.Inspector = this; drawer.Skin = Skin; drawer.Depth = depth; return(drawer); } } } return(null); }
internal void PoolDrawer(InspectorField drawer) { List <InspectorField> drawerPool; if (!drawersPool.TryGetValue(drawer.GetType(), out drawerPool)) { drawerPool = new List <InspectorField>(poolCapacity); drawersPool[drawer.GetType()] = drawerPool; } if (drawerPool.Count < poolCapacity) { drawer.gameObject.SetActive(false); drawer.transform.SetParent(poolParent, false); drawerPool.Add(drawer); } else { Destroy(drawer.gameObject); } }
protected override void GenerateElements() { if (components.Count == 0) { return; } CreateDrawer(typeof(bool), "Is Active", isActiveGetter, isActiveSetter); StringField nameField = CreateDrawer(typeof(string), "Name", nameGetter, nameSetter) as StringField; StringField tagField = CreateDrawer(typeof(string), "Tag", tagGetter, tagSetter) as StringField; CreateDrawerForVariable(layerProp, "Layer"); for (int i = 0, j = 0; i < components.Count; i++) { InspectorField componentDrawer = CreateDrawerForComponent(components[i]); if (componentDrawer as ExpandableInspectorField && j < componentsExpandedStates.Count && componentsExpandedStates[j++]) { ((ExpandableInspectorField)componentDrawer).IsExpanded = true; } } if (nameField) { nameField.SetterMode = StringField.Mode.OnSubmit; } if (tagField) { tagField.SetterMode = StringField.Mode.OnSubmit; } if (Inspector.ShowAddComponentButton) { CreateExposedMethodButton(addComponentMethod, () => this, (value) => { }); } componentsExpandedStates.Clear(); }
protected override void GenerateElements() { if (components.Count == 0) { return; } CreateDrawer(typeof(bool), "Is Active", isActiveGetter, isActiveSetter); nameField = CreateDrawer(typeof(string), "Name", nameGetter, nameSetter) as StringField; tagField = CreateDrawer(typeof(string), "Tag", tagGetter, tagSetter) as StringField; CreateDrawerForVariable(layerProp, "Layer"); for (int i = 0, j = elements.Count; i < components.Count; i++) { InspectorField componentDrawer = CreateDrawerForComponent(components[i]); if (componentDrawer != null) { if (j < componentsExpandedStates.Count && componentsExpandedStates[j] && componentDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)componentDrawer).IsExpanded = true; } j++; } } if (nameField != null) { nameField.SetterMode = StringField.Mode.OnSubmit; } if (tagField != null) { tagField.SetterMode = StringField.Mode.OnSubmit; } componentsExpandedStates.Clear(); }
public void StopInspect() { if (inspectLock) { return; } if (currentDrawer != null) { if (currentDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)currentDrawer).HeaderVisibility = HeaderVisibility.Collapsible; } currentDrawer.Unbind(); currentDrawer = null; } m_inspectedObject = null; scrollView.verticalNormalizedPosition = 1f; ColorPicker.Instance.Close(); ObjectReferencePicker.Instance.Close(); }
protected override void GenerateElements() { if (Value == null) { return; } if (isArray) { Array array = (Array)Value; for (int i = 0; i < array.Length; i++) { InspectorField elementDrawer = Inspector.CreateDrawerForType(elementType, drawArea, Depth + 1); if (elementDrawer == null) { break; } int j = i; elementDrawer.BindTo(elementType, string.Empty, () => ((Array)Value).GetValue(j), (value) => { Array _array = (Array)Value; _array.SetValue(value, j); Value = _array; }); if (i < elementsExpandedStates.Count && elementsExpandedStates[i] && elementDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)elementDrawer).IsExpanded = true; } elementDrawer.NameRaw = Inspector.ArrayIndicesStartAtOne ? ((i + 1) + ":") : (i + ":"); elements.Add(elementDrawer); } } else { IList list = (IList)Value; for (int i = 0; i < list.Count; i++) { InspectorField elementDrawer = Inspector.CreateDrawerForType(elementType, drawArea, Depth + 1); if (elementDrawer == null) { break; } int j = i; string variableName = Inspector.ArrayIndicesStartAtOne ? ((i + 1) + ":") : (i + ":"); elementDrawer.BindTo(elementType, variableName, () => ((IList)Value)[j], (value) => { IList _list = (IList)Value; _list[j] = value; Value = _list; }); if (i < elementsExpandedStates.Count && elementsExpandedStates[i] && elementDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)elementDrawer).IsExpanded = true; } elements.Add(elementDrawer); } } sizeInput.Text = Length.ToString(RuntimeInspectorUtils.numberFormat); elementsExpandedStates.Clear(); }
public void Initialize(InspectorField drawer) { this.drawer = drawer; }
public void Inspect(object obj) { if (inspectLock) { return; } isDirty = false; if (OnInspectedObjectChanging != null) { obj = OnInspectedObjectChanging(m_inspectedObject, obj); } if (m_inspectedObject == obj) { return; } StopInspect(); inspectLock = true; try { m_inspectedObject = obj; if (obj.IsNull()) { return; } if (obj.GetType().IsValueType) { m_inspectedObject = null; Debug.LogError("Can't inspect a value type!"); return; } if (!gameObject.activeSelf) { m_inspectedObject = null; Debug.LogError("Can't inspect while Inspector is inactive!"); return; } InspectorField inspectedObjectDrawer = CreateDrawerForType(obj.GetType(), drawArea, 0, false); if (inspectedObjectDrawer != null) { inspectedObjectDrawer.BindTo(obj.GetType(), string.Empty, () => m_inspectedObject, (value) => m_inspectedObject = value); inspectedObjectDrawer.NameRaw = obj.GetNameWithType(); inspectedObjectDrawer.Refresh(); if (inspectedObjectDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)inspectedObjectDrawer).IsExpanded = true; } currentDrawer = inspectedObjectDrawer; GameObject go = m_inspectedObject as GameObject; if (go == null && m_inspectedObject is Component) { go = ((Component)m_inspectedObject).gameObject; } if (!ConnectedHierarchy.IsNull() && (go == null || !ConnectedHierarchy.Select(go.transform))) { ConnectedHierarchy.Deselect(); } } else { m_inspectedObject = null; } } finally { inspectLock = false; } }
protected override void Update() { base.Update(); if (IsBound) { float time = Time.realtimeSinceStartup; if (isDirty) { // Rebind to refresh the exposed variables in Inspector object inspectedObject = m_inspectedObject; StopInspect(); Inspect(inspectedObject); isDirty = false; nextRefreshTime = time + refreshInterval; } else { if (time > nextRefreshTime) { nextRefreshTime = time + refreshInterval; Refresh(); } } // Check if a pointer has remained static over a drawer for a while; if so, show a tooltip if (hoveringPointer != null) { #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER // PointerEventData.delta isn't set to (0,0) for static pointers in the new Input System, so we use the active Pointer's delta instead // The default value isn't Vector2.zero but Vector2.one because we don't want to show tooltip if there is no pointer Vector2 pointerDelta = Pointer.current != null?Pointer.current.delta.ReadValue() : Vector2.one; #else Vector2 pointerDelta = hoveringPointer.delta; #endif if (pointerDelta.x != 0f || pointerDelta.y != 0f) { hoveredDrawerTooltipShowTime = time + m_tooltipDelay; } else if (time > hoveredDrawerTooltipShowTime) { // Make sure that everything is OK if (!hoveredDrawer || !hoveredDrawer.gameObject.activeSelf) { hoveredDrawer = null; hoveringPointer = null; } else { RuntimeInspectorUtils.ShowTooltip(hoveredDrawer.NameRaw, hoveringPointer, Skin, m_canvas); // Don't show the tooltip again until the pointer moves hoveredDrawerTooltipShowTime = float.PositiveInfinity; } } } } else if (currentDrawer != null) { StopInspect(); } }
public void Inspect(object obj) { if (inspectLock) { return; } isDirty = false; Initialize(); if (OnInspectedObjectChanging != null) { obj = OnInspectedObjectChanging(m_inspectedObject, obj); } if (m_inspectedObject == obj) { return; } StopInspect(); inspectLock = true; try { m_inspectedObject = obj; if (obj.IsNull()) { return; } #if UNITY_EDITOR || !NETFX_CORE if (obj.GetType().IsValueType) #else if (obj.GetType().GetTypeInfo().IsValueType) #endif { m_inspectedObject = null; Debug.LogError("Can't inspect a value type!"); return; } //if( !gameObject.activeSelf ) //{ // m_inspectedObject = null; // Debug.LogError( "Can't inspect while Inspector is inactive!" ); // return; //} InspectorField inspectedObjectDrawer = CreateDrawerForType(obj.GetType(), drawArea, 0, false); if (inspectedObjectDrawer != null) { inspectedObjectDrawer.BindTo(obj.GetType(), string.Empty, () => m_inspectedObject, (value) => m_inspectedObject = value); inspectedObjectDrawer.NameRaw = obj.GetNameWithType(); inspectedObjectDrawer.Refresh(); if (inspectedObjectDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)inspectedObjectDrawer).IsExpanded = true; } currentDrawer = inspectedObjectDrawer; if (currentDrawer is ExpandableInspectorField) { ((ExpandableInspectorField)currentDrawer).HeaderVisibility = m_inspectedObjectHeaderVisibility; } GameObject go = m_inspectedObject as GameObject; if (!go && m_inspectedObject as Component) { go = ((Component)m_inspectedObject).gameObject; } if (ConnectedHierarchy && go && !ConnectedHierarchy.Select(go.transform)) { ConnectedHierarchy.Deselect(); } } else { m_inspectedObject = null; } } finally { inspectLock = false; } }