Пример #1
0
        private void UpdateDrawInSingleRow()
        {
            bool setDrawInSingleRow;

            if (IsNull)
            {
                setDrawInSingleRow = true;
            }
                        #if DRAW_VALUE_IN_SINGLE_ROW_IF_POSSIBLE
            else if (memberBuildState == MemberBuildState.MembersBuilt)
            {
                setDrawInSingleRow = DrawerUtility.CanDrawInSingleRow(ValueDrawer);
            }
            else if (memberBuildState == MemberBuildState.BuildListGenerated)
            {
                setDrawInSingleRow = DrawerUtility.CanDrawInSingleRow(instanceType, DebugMode);
            }
                        #else
            else if (memberBuildState != MemberBuildState.Unstarted)
            {
                setDrawInSingleRow = DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(instanceType);
            }
                        #endif
            else
            {
                setDrawInSingleRow = true;
            }

            if (setDrawInSingleRow != drawInSingleRow)
            {
                                #if DEV_MODE && DEBUG_UPDATE_DRAW_IN_SINGLE_ROW
                Debug.Log(Msg(ToString(), ".drawInSingleRow = ", setDrawInSingleRow, " (was: ", drawInSingleRow, ") with IsNull=", IsNull, ", memberBuildState = ", memberBuildState, ", instanceType=", instanceType));
                                #endif

                drawInSingleRow = setDrawInSingleRow;

                UpdatePrefixDrawer();

                if (DrawInSingleRow)
                {
                    if (inactive)
                    {
                        SetUnfoldedInstantly(true);
                    }
                    else
                    {
                        SetUnfolded(true);
                    }
                }

                UpdateVisibleMembers();
            }
            else if (prefixLabelDrawer == null)
            {
                                #if DEV_MODE
                Debug.LogError("This null check was needed!");
                                #endif
                UpdatePrefixDrawer();
            }
        }
Пример #2
0
        /// <summary>
        /// Sets up the drawer so that it is ready to be used.
        /// LateSetup should be called right after this.
        /// </summary>
        /// <param name="setStyle"> GUIStyle inside which to draw members. </param>
        /// <param name="indentLevel"> How many levels of indentation to add when drawing members. </param>
        /// <param name="setDrawHeader"> Should the prefix label header be drawn for the dataset. </param>
        /// <param name="setValue"> The initial cached value of the drawers. </param>
        /// <param name="setValueType"> Type constraint for the value. </param>
        /// <param name="setMemberInfo"> LinkedMemberInfo for the field or property that these drawers represent. </param>
        /// <param name="setParent"> Drawer whose member these Drawer are. Can be null. </param>
        /// <param name="setLabel"> The label (name) of the field. Can be null. </param>
        /// <param name="setReadOnly"> True if Drawer should be read only. </param>
        private void Setup(GUIStyle setStyle, int indentLevel, bool setDrawHeader, object setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly)
        {
            style               = new GUIStyle(setStyle);
            style.fixedHeight   = 0f;
            style.fixedWidth    = 0f;
            style.stretchHeight = true;
            style.stretchWidth  = true;

            appendIndentLevel = indentLevel;
            drawHeader        = setDrawHeader;

            if (setValueType == null)
            {
                                #if DEV_MODE
                Debug.LogWarning(GetType().Name + ".Setup called with null setValueType");
                                #endif
                setValueType = DrawerUtility.GetType(setMemberInfo, setValue);
            }

            // This is an important step, because parent is referenced by DebugMode
            parent          = setParent;
            drawInSingleRow = DrawerUtility.CanDrawInSingleRow(setValueType, DebugMode);

            base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly);

                        #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW
            if (drawInSingleRow)
            {
                Debug.Log(Msg(ToString(setLabel, setMemberInfo) + ".Setup with drawInSingleRow=", drawInSingleRow, ", type=", setValueType, ", DebugMode=", DebugMode));
            }
                        #endif
        }
Пример #3
0
        /// <summary>
        /// Given a non-abstract explicitly chosen type, returns the drawer for the value of the drawer using said type.
        /// </summary>
        /// <param name="typeForValue"> Type of value. </param>
        /// <returns> Drawer instance to use for the value. </returns>
        protected virtual IDrawer BuildDrawerForValue(Type typeForValue)
        {
                        #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW
            Debug.Log("BuildDrawerForValue(" + typeForValue.Name + ") called with DrawInSingleRow=" + DrawInSingleRow + ", CanDrawInSingleRow(" + typeForValue.Name + ")=" + DrawerUtility.CanDrawInSingleRow(typeForValue, DebugMode) + ", CanDrawMultipleControlsOfTypeInSingleRow(" + typeForValue.Name + ")=" + DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(typeForValue));
                        #endif

            if (typeForValue.IsUnityObject())
            {
                return(ObjectReferenceDrawer.Create(null, memberInfo, GetTypeForObjectReferenceField(), this, GUIContent.none, AllowSceneObjects(), false, ReadOnly));
            }

            var label = GUIContentPool.Create(StringUtils.SplitPascalCaseToWords(StringUtils.ToStringSansNamespace(typeForValue)));

            // infinite loop danger!
            if (memberInfo != null && typeForValue == memberInfo.Type)
            {
                                #if DEV_MODE
                Debug.LogError("Infinite loop! typeForValue " + StringUtils.ToString(typeForValue) + " same as Type! instanceType=" + StringUtils.ToString(instanceType) + ", userSelectedType=" + StringUtils.ToString(userSelectedType));
                                #endif
                return(ReadOnlyTextDrawer.Create(StringUtils.ToString(Value), memberInfo, this, label));
            }

            return(BuildDrawerForValue(typeForValue, Value, memberInfo, this, label, ReadOnly));
        }
Пример #4
0
        /// <inheritdoc />
        protected override void DoBuildMembers()
        {
                        #if DEV_MODE && DEBUG_BUILD_MEMBERS
            Debug.Log(StringUtils.ToColorizedString(ToString(), ".DoBuildMembers called with memberBuildList=", memberBuildList, ", IsNull = ", IsNull, ", CanBeUnityObject=", CanBeUnityObject, ", DrawToggleNullButton=", DrawToggleNullButton, ", memberInfo=", memberInfo, ", memberInfo.Data=", (memberInfo == null ? "n/a" : StringUtils.ToString(memberInfo.Data))));
                        #endif

            var typeForValue = TypeForValue;

            if (typeForValue == null)
            {
                if (CanBeUnityObject)
                {
                    var referenceField = ObjectReferenceDrawer.Create(null, memberInfo, GetTypeForObjectReferenceField(), this, GUIContent.none, AllowSceneObjects(), false, ReadOnly);
                    if (DrawToggleNullButton)
                    {
                        DrawerArrayPool.Resize(ref members, 2);
                        members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly);
                        members[1] = referenceField;
                    }
                    else
                    {
                        DrawerArrayPool.Resize(ref members, 1);
                        members[0] = referenceField;
                    }
                }
                else if (DrawToggleNullButton)
                {
                    DrawerArrayPool.Resize(ref members, 1);
                    members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly);
                }
                else
                {
                    DrawerArrayPool.Resize(ref members, 1);
                    members[0] = ReadOnlyTextDrawer.Create("null", null, this, GUIContent.none);
                }
            }
            else
            {
                                #if DEV_MODE && PI_ASSERTATIONS
                Assert(typeForValue != null, ToString(), ".BuildMembers was called with isNull=false but with userSelectedType=", null, ".\nDrawInSingleRow=", DrawInSingleRow, ", Value=", Value, ", Value.Type=", StringUtils.TypeToString(Value));
                Assert(!typeForValue.IsAbstract, ToString(), ".BuildMembers was called with isNull=false but with userSelectedType ", userSelectedType, " IsAbstract=" + true + ".\nDrawInSingleRow=", DrawInSingleRow, ", Value=", Value, ", Value.Type=", StringUtils.TypeToString(Value));
                                #endif

                var valueDrawer = BuildDrawerForValue(typeForValue);

                                #if DEV_MODE && PI_ASSERTATIONS
                Assert(valueDrawer.GetType() != GetType());
                                #endif

                valueDrawer.OnValueChanged += (changed, setValue) => SetValue(setValue);
                if (DrawToggleNullButton)
                {
                    DrawerArrayPool.Resize(ref members, 2);
                    members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly);
                    members[1] = valueDrawer;
                }
                else
                {
                    DrawerArrayPool.Resize(ref members, 1);
                    members[0] = valueDrawer;
                }

                                #if DRAW_VALUE_IN_SINGLE_ROW_IF_POSSIBLE
                if (DrawerUtility.CanDrawInSingleRow(valueDrawer))
                {
                    valueDrawer.Label = GUIContentPool.Empty();
                }
                                #endif
            }
        }
Пример #5
0
        /// <inheritdoc />
        protected override void DoBuildMembers()
        {
            int count = memberBuildList.Count;

                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(count == parameterInfos.Length, "memberBuildList.Count=" + memberBuildList.Count + " != " + parameterInfos.Length);
                        #endif

                        #if DEV_MODE
            Debug.Log("ParameterDrawer.DoBuildMembers called with parameterInfos.Length=" + parameterInfos.Length + ", memberBuildList.Count=" + memberBuildList.Count + ", drawInSingleRow=" + drawInSingleRow);
                        #endif

            DrawerArrayPool.Resize(ref members, count);

            //If only has one parameter, can be drawn in a single row
            if (drawInSingleRow)
            {
                                #if DEV_MODE && PI_ASSERTATIONS
                Debug.Assert(memberBuildList.Count == 1);
                Debug.Assert(parameterInfos.Length == 1);
                                #endif

                var memberFieldInfo = memberBuildList[0];
                var parameterInfo   = memberFieldInfo.ParameterInfo;
                var type            = GetParameterTypeAndLabel(memberFieldInfo, ref label);

                var member = DrawerProvider.GetForField(ParameterValues.GetValue(parameterInfo), type, memberFieldInfo, this, GUIContent.none, ReadOnly);

                                #if DEV_MODE || SAFE_MODE
                if (member == null)
                {
                    Debug.LogError(ToString() + " Failed to create Drawer for member " + memberFieldInfo + " of type " + StringUtils.ToString(type) + ".\nparent=" + StringUtils.ToString(parent));
                    DrawerArrayPool.Resize(ref members, 0);
                    return;
                }
                                #endif

                //can't draw the member in a single row after all!
                if (!DrawerUtility.CanDrawInSingleRow(member))
                {
                    drawInSingleRow = false;
                    member.Dispose();
                    DoBuildMembers();
                    return;
                }

                members[0] = member;
            }
            else
            {
                for (int n = count - 1; n >= 0; n--)
                {
                    var memberFieldInfo = memberBuildList[n];
                    var parameterInfo   = memberFieldInfo.ParameterInfo;
                    var memberLabel     = GUIContentPool.Empty();
                    var type            = GetParameterTypeAndLabel(memberFieldInfo, ref memberLabel);
                    var member          = DrawerProvider.GetForField(ParameterValues.GetValue(parameterInfo), type, memberFieldInfo, this, memberLabel, ReadOnly);

                                        #if DEV_MODE || SAFE_MODE
                    if (member == null)
                    {
                        for (int d = count - 1; d > n; d--)
                        {
                            members[d].Dispose();
                        }
                        Debug.LogError(ToString() + " Failed to create Drawer for members[" + n + "] " + memberFieldInfo + " of type " + StringUtils.ToString(type) + ".\nparent=" + StringUtils.ToString(parent));
                        DrawerArrayPool.Resize(ref members, 0);
                        return;
                    }
                                        #endif

                    members[n] = member;
                }
            }
        }
Пример #6
0
        /// <inheritdoc/>
        protected override void Setup(object setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly)
        {
                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(memberBuildState == MemberBuildState.Unstarted);
                        #endif

            if (setValue == null)
            {
                setValueType = DrawerUtility.GetType(setMemberInfo, setValue);
            }

            // This is an important step, because parent is referenced by DebugMode
            parent          = setParent;
            drawInSingleRow = (setMemberInfo != null && setMemberInfo.GetAttribute <Attributes.DrawInSingleRowAttribute>() != null) || (setValueType != null && setValueType.GetCustomAttributes(typeof(Attributes.DrawInSingleRowAttribute), false).Length > 0) || DrawerUtility.CanDrawInSingleRow(setValueType, DebugMode);

            base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly);

                        #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW
            if (drawInSingleRow)
            {
                Debug.Log(Msg(ToString(setLabel, setMemberInfo) + ".Setup with drawInSingleRow=", drawInSingleRow, ", setValueType=", setValueType, ", DebugMode=", DebugMode, ", setMemberInfo.Type=" + (setMemberInfo == null ? "n/a" : StringUtils.ToString(setMemberInfo.Type)) + ", setValue.GetType()=", StringUtils.TypeToString(setValue)));
            }
                        #endif
        }