Example #1
0
        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);
        }
Example #2
0
        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();
            }
        }
Example #4
0
        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;
        }
Example #5
0
        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);
        }
Example #6
0
        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");
            }
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #11
0
        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;
            }
        }
Example #12
0
        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();
        }
Example #13
0
        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);
        }
Example #14
0
        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);
        }
Example #15
0
        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);
            }
        }
Example #16
0
        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();
        }
Example #17
0
        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();
        }
Example #19
0
        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;
 }
Example #21
0
        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;
            }
        }
Example #22
0
        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();
            }
        }
Example #23
0
        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;
            }
        }