示例#1
0
 public static void InitializeMaterialPropertyColumn(SearchColumn column)
 {
     column.getter   = args => MaterialPropertyGetter(args.item, args.column);
     column.setter   = args => SetMaterialPropertyValue(args.item, args.column, args.value);
     column.drawer   = args => MaterialPropertyDrawer(args.rect, args.value);
     column.comparer = args => MaterialPropertyComparer(args.lhs.value, args.rhs.value, args.sortAscending);
 }
示例#2
0
        internal static MaterialProperty GetMaterialProperty(SearchItem item, SearchColumn column)
        {
            var mat = item.ToObject <Material>();

            if (!mat)
            {
                return(null);
            }

            foreach (var m in SelectorManager.Match(column.selector, item.provider?.type))
            {
                var selectorArgs = new SearchSelectorArgs(m, item);
                if (selectorArgs.name == null)
                {
                    continue;
                }

                if (!mat.HasProperty(selectorArgs.name))
                {
                    continue;
                }

                return(MaterialEditor.GetMaterialProperty(new Object[] { mat }, selectorArgs.name));
            }

            return(null);
        }
示例#3
0
        static void FillSerializedPropertyColumns(UnityEngine.Object obj, Type objType, List <SearchColumn> columns)
        {
            var iconType = Utils.FindTextureForType(objType);

            using (var so = new SerializedObject(obj))
            {
                var p    = so.GetIterator();
                var next = p.NextVisible(true);
                while (next)
                {
                    var supported = IsPropertyTypeSupported(p);
                    if (supported)
                    {
                        var column = new SearchColumn(
                            path: $"{objType.Name}/{p.propertyPath.Replace(".", "/")}",
                            selector: "#" + p.propertyPath,
                            provider: p.propertyType.ToString(),
                            content: new GUIContent(Utils.TrimText(p.displayName, 31), iconType, p.tooltip));
                        Styles.itemLabel.CalcMinMaxWidth(column.content, out column.width, out _);
                        if (p.hasVisibleChildren)
                        {
                            column.width = Mathf.Min(220, column.width);
                        }
                        columns.Add(column);
                    }

                    var isVector = p.propertyType == SerializedPropertyType.Vector3 ||
                                   p.propertyType == SerializedPropertyType.Vector4 ||
                                   p.propertyType == SerializedPropertyType.Quaternion ||
                                   p.propertyType == SerializedPropertyType.Vector2;

                    next = p.NextVisible(supported && !p.isArray && !p.isFixedBuffer && !isVector);
                }
            }
        }
示例#4
0
 public static void InitializeColumn(SearchColumn column)
 {
     column.provider = "";
     column.getter   = args => { args.item.TryGetValue(args.column.selector, out var field); return(field.value); };
     column.setter   = null;
     column.drawer   = args =>
     {
         if (args.value == null)
         {
             return(null);
         }
         if (args.value is SearchReport.ObjectValue v)
         {
             if (v.objectValue == null)
             {
                 PropertyTable.DefaultDrawing(args.rect, args.column, v.fallbackString);
             }
             else
             {
                 PropertySelectors.DrawObjectReference(args.rect, v.objectValue);
             }
         }
         else if (args.value is Color c)
         {
             return(EditorGUI.ColorField(args.rect, c, showEyedropper: false, showAlpha: true));
         }
         else
         {
             PropertyTable.DefaultDrawing(args.rect, args.column, args.value);
         }
         return(args.value);
     };
     column.comparer = null;
 }
示例#5
0
 public static void InitializeSerializedPropertyColumn(SearchColumn column)
 {
     column.getter   = args => Getter(args.item, args.column);
     column.setter   = args => Setter(args.item, args.column, args.value, args.multiple);
     column.drawer   = args => Drawer(args.rect, args.value);
     column.comparer = args => Comparer(args.lhs.value, args.rhs.value, args.sortAscending);
 }
        private AdvancedDropdownItem MakeParents(string prefix, SearchColumn desc, AdvancedDropdownItem parent)
        {
            var parts = prefix.Split('/');

            foreach (var p in parts)
            {
                var f = FindItem(p, parent);
                if (f != null)
                {
                    parent = f;
                }
                else
                {
                    AdvancedDropdownItem newItem = new AdvancedDropdownItem(p)
                    {
                        icon = desc.content.image as Texture2D, tooltip = desc.content.tooltip
                    };
                    newItem.AddChild(new AdvancedDropdownItem(k_AddlAllItemName)
                    {
                        userData = newItem
                    });
                    parent.AddChild(newItem);
                    parent = newItem;
                }
            }

            return(parent);
        }
示例#7
0
        private void Sort(IList <TreeViewItem> rows, int sortIdx)
        {
            Debug.Assert(sortIdx >= 0);

            SearchColumn column = Col(sortIdx);

            if (column == null)
            {
                return;
            }

            var get = column.getter;

            if (get == null)
            {
                return;
            }

            var myRows        = rows as List <TreeViewItem>;
            var sortAscending = multiColumnHeader.IsSortedAscending(sortIdx);
            var sortOrder     = sortAscending ? 1 : -1;

            var comp = column.comparer;

            if (comp == null)
            {
                if (column.getter != null)
                {
                    if (rows.Count > 0)
                    {
                        myRows.Sort((lhs, rhs) =>
                        {
                            var lhsargs = new SearchColumnEventArgs(((PropertyItem)lhs).GetData(), m_TableView.context, column);
                            var rhsargs = new SearchColumnEventArgs(((PropertyItem)rhs).GetData(), m_TableView.context, column);
                            var lhsv    = get(lhsargs);
                            if (lhsv is IComparable c)
                            {
                                return(Comparer.Default.Compare(c, get(rhsargs)) * sortOrder);
                            }
                            return(Comparer.Default.Compare(lhsv?.GetHashCode() ?? 0, get(rhsargs)?.GetHashCode() ?? 0) * sortOrder);
                        });
                    }
                }

                return;
            }

            myRows.Sort((lhs, rhs) =>
            {
                var lhsargs = new SearchColumnEventArgs(((PropertyItem)lhs).GetData(), m_TableView.context, column);
                var rhsargs = new SearchColumnEventArgs(((PropertyItem)rhs).GetData(), m_TableView.context, column);

                lhsargs.value = get(lhsargs);
                rhsargs.value = get(rhsargs);

                return(comp(new SearchColumnCompareArgs(lhsargs, rhsargs, sortAscending)) * sortOrder);
            });
        }
 internal static void InitializeSelectableColumn(SearchColumn column)
 {
     column.drawer = args =>
     {
         var itemStyle = GetItemContentStyle(args.column);
         EditorGUI.SelectableLabel(args.rect, args.value?.ToString() ?? string.Empty, itemStyle);
         return(args.value);
     };
 }
示例#9
0
        static object MaterialPropertyGetter(SearchItem item, SearchColumn column)
        {
            var matProp = GetMaterialProperty(item, column);

            if (matProp == null)
            {
                return(null);
            }

            return(matProp);
        }
示例#10
0
 public void AddColumnHeaderContextMenuItems(GenericMenu menu, SearchColumn sourceColumn)
 {
     menu.AddItem(new GUIContent("Column Format/Default"), string.IsNullOrEmpty(sourceColumn.provider), () => sourceColumn.SetProvider(null));
     foreach (var scp in SearchColumnProvider.providers)
     {
         var provider    = scp.provider;
         var selected    = string.Equals(sourceColumn.provider, provider, StringComparison.Ordinal);
         var menuContent = new GUIContent("Column Format/" + ObjectNames.NicifyVariableName(provider));
         menu.AddItem(menuContent, selected, () => sourceColumn.SetProvider(provider));
     }
 }
示例#11
0
 public SearchColumnEventArgs(SearchItem item, SearchContext context, SearchColumn column)
 {
     this.item    = item;
     this.context = context;
     this.column  = column;
     value        = null;
     multiple     = false;
     rect         = Rect.zero;
     focused      = false;
     selected     = false;
 }
示例#12
0
 public static void InitializeColorColumn(SearchColumn column)
 {
     column.drawer = args =>
     {
         if (args.value is Color c)
         {
             return(EditorGUI.ColorField(args.rect, GUIContent.none, c, showEyedropper: false, showAlpha: true, hdr: false));
         }
         return(args.value);
     };
 }
示例#13
0
 public static void InitializeTextureColumn(SearchColumn column)
 {
     column.drawer = args =>
     {
         if (args.value is Texture t)
         {
             GUI.DrawTexture(args.rect, t, ScaleMode.ScaleToFit);
         }
         return(args.value);
     };
 }
 public static GUIStyle GetItemContentStyle(SearchColumn column)
 {
     if (column.options.HasAny(SearchColumnFlags.TextAlignmentCenter))
     {
         return(Styles.itemLabelCenterAligned);
     }
     if (column.options.HasAny(SearchColumnFlags.TextAlignmentRight))
     {
         return(Styles.itemLabelrightAligned);
     }
     return(Styles.itemLabelLeftAligned);
 }
示例#15
0
 internal static void DefaultDrawing(Rect cellRect, SearchColumn column, object value)
 {
     if (value is Texture2D tex)
     {
         GUI.DrawTexture(cellRect, tex, ScaleMode.ScaleToFit);
     }
     else
     {
         var itemStyle = ItemSelectors.GetItemContentStyle(column);
         GUI.Label(cellRect, value.ToString(), itemStyle);
     }
 }
示例#16
0
        public static void Initialize(SearchColumn column)
        {
            foreach (var p in providers)
            {
                if (!string.Equals(p.provider, column.provider, StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                p.handler(column);
                break;
            }
        }
 internal static void InitializeCountColumn(SearchColumn column)
 {
     column.drawer = args =>
     {
         var itemStyle = GetItemContentStyle(args.column);
         if (Utils.TryGetNumber(args.value, out var n))
         {
             GUI.Label(args.rect, Utils.FormatCount((ulong)n), itemStyle);
         }
         else
         {
             GUI.Label(args.rect, args.value?.ToString() ?? string.Empty, itemStyle);
         }
         return(args.value);
     };
 }
示例#18
0
        internal static void SetMaterialPropertyValue(SearchItem item, SearchColumn column, object newValue)
        {
            var matProp = GetMaterialProperty(item, column);

            if (matProp == null)
            {
                return;
            }

            switch (matProp.type)
            {
            case MaterialProperty.PropType.Color:
                if (matProp.colorValue != (Color)newValue)
                {
                    matProp.colorValue = (Color)newValue;
                }
                break;

            case MaterialProperty.PropType.Vector:
                if (matProp.vectorValue != (Vector4)newValue)
                {
                    matProp.vectorValue = (Vector4)newValue;
                }
                break;

            case MaterialProperty.PropType.Float:
                if (matProp.floatValue != (float)newValue)
                {
                    matProp.floatValue = (float)newValue;
                }
                break;

            case MaterialProperty.PropType.Range:
                if (matProp.floatValue != (float)newValue)
                {
                    matProp.floatValue = (float)newValue;
                }
                break;

            case MaterialProperty.PropType.Texture:
                if (matProp.textureValue != (Texture)newValue)
                {
                    matProp.textureValue = (Texture)newValue;
                }
                break;
            }
        }
示例#19
0
        public static IEnumerable <SearchColumn> Enumerate(IEnumerable <SearchItem> items)
        {
            var descriptors     = new List <SearchColumn>();
            var shaderProcessed = new HashSet <string>();

            bool materialRootItemAdded = false;

            foreach (var item in items)
            {
                var material = item.ToObject <Material>();
                if (!material)
                {
                    continue;
                }

                if (!materialRootItemAdded)
                {
                    descriptors.Add(new SearchColumn("Material", new GUIContent("Material", Utils.FindTextureForType(typeof(Material)))));
                    materialRootItemAdded = true;
                }

                if (shaderProcessed.Contains(material.shader.name))
                {
                    continue;
                }
                shaderProcessed.Add(material.shader.name);

                var shaderPath = "Material/" + material.shader.name;
                var shaderIcon = Utils.FindTextureForType(typeof(Shader));
                descriptors.Add(new SearchColumn(shaderPath, new GUIContent(material.shader.name, shaderIcon)));

                var materialProperties = MaterialEditor.GetMaterialProperties(new Object[] { material });
                for (var i = 0; i < materialProperties.Length; i++)
                {
                    var m        = materialProperties[i];
                    var propName = m.name;
                    var propPath = shaderPath + "/" + propName;
                    var col      = new SearchColumn(propPath, "#" + propName, provider: $"{m.type}",
                                                    new GUIContent(m.displayName, shaderIcon, m.name));
                    descriptors.Add(col);
                }
            }

            return(descriptors);
        }
示例#20
0
        internal static SerializedProperty GetSerializedProperty(SearchItem item, SearchColumn column, out SerializedObject so)
        {
            foreach (var m in SelectorManager.Match(column.selector, item.provider?.type))
            {
                var selectorArgs = new SearchSelectorArgs(m, item);
                if (selectorArgs.name == null)
                {
                    continue;
                }
                var property = GetSerializedProperty(item, selectorArgs.name, out so);
                if (property == null)
                {
                    so?.Dispose();
                    continue;
                }

                so.UpdateIfRequiredOrScript();
                return(property);
            }

            so = null;
            return(null);
        }
示例#21
0
            public static void Setter(SearchItem item, SearchColumn column, object newValue, bool multiple)
            {
                if (!(newValue is SerializedProperty newValueProperty))
                {
                    return;
                }

                if (!multiple)
                {
                    newValueProperty.serializedObject.ApplyModifiedProperties();
                }
                else
                {
                    var property = GetSerializedProperty(item, column, out var so);
                    if (property != null && so != null)
                    {
                        so.CopyFromSerializedProperty(newValueProperty);
                        so.ApplyModifiedProperties();

                        property.Dispose();
                        so.Dispose();
                    }
                }
            }
示例#22
0
 public static void InitializeObjectReferenceColumn(SearchColumn column)
 {
     column.drawer = DrawObjectReference;
 }
        protected override AdvancedDropdownItem BuildRoot()
        {
            var rootItem = new AdvancedDropdownItem(m_Title);

            foreach (var column in m_Columns)
            {
                var path   = column.path;
                var pos    = path.LastIndexOf('/');
                var name   = pos == -1 ? column.name : path.Substring(pos + 1);
                var prefix = pos == -1 ? null : path.Substring(0, pos);

                AdvancedDropdownItem newItem = new AdvancedDropdownItem(name)
                {
                    displayName = string.IsNullOrEmpty(column.content.text) ? column.content.tooltip : SearchColumn.ParseName(column.content.text),
                    icon        = column.content.image as Texture2D,
                    tooltip     = column.content.tooltip,
                    userData    = column
                };

                var parent = rootItem;
                if (prefix != null)
                {
                    parent = MakeParents(prefix, column, rootItem);
                }

                if (FindItem(name, parent) == null)
                {
                    parent.AddChild(newItem);
                }
            }

            rootItem.SortChildren(SortColumnProviders);
            foreach (var c in rootItem.children)
            {
                c.SortChildren(SortColumns, true);
            }
            return(rootItem);
        }
示例#24
0
 public PropertyColumn(SearchColumn c)
 {
     userDataObj = c;
 }
示例#25
0
 public void AddColumnHeaderContextMenuItems(GenericMenu menu, SearchColumn sourceColumn) => throw new NotImplementedException();
示例#26
0
            public static object Getter(SearchItem item, SearchColumn column)
            {
                var p = GetSerializedProperty(item, column, out var _);

                return(p);
            }
        public static SearchColumn CreateColumn(string path, string selector = null, string provider = null, SearchColumnFlags options = SearchColumnFlags.Default)
        {
            var pname = SearchColumn.ParseName(path);

            return(new SearchColumn(path, selector ?? path, provider, new GUIContent(pname), options));
        }
示例#28
0
 public static void InitializeObjectPathColumn(SearchColumn column)
 {
     column.getter = GetObjectPath;
 }
示例#29
0
 public static void InitializeObjectReferenceColumn(SearchColumn column)
 {
     column.drawer = args => DrawObjectReference(args.rect, args.value);
 }
示例#30
0
 public static void InitializeObjectReferenceColumn(SearchColumn column)
 {
     column.getter = args => GetEnabled(args.item);
     column.drawer = args => DrawEnabled(args);
     column.setter = args => SetEnabled(args);
 }