string GetCheersTitle(See attr, MemberInfo member)
 {
     if (attr.Title == null || string.IsNullOrEmpty(attr.Title.Trim()))
     {
         return(ObjectNames.NicifyVariableName(member.Name));
     }
     return(attr.Title);
 }
        void DrawProperty(PropertyInfo prop, See attr, Obj[] targets)
        {
            Undo.RecordObjects(targets, "PropertyChange-" + prop.Name);

            var propType = prop.PropertyType;
            var getter   = prop.GetGetMethod(true);
            var setter   = prop.GetSetMethod(true);

            var label = GetCheersTitle(attr, prop);

            bool hasMultiValues;
            bool isReadOnly = setter == null;
            // 获取所有选中项的属性值的最小集合
            var values = targets.Select(t => GetPropValue(propType, getter, t)).Distinct();
            // 用于绘制编辑器的回调
            var editorFunc = GetValuesAndEditor(propType, getter, values, label, out hasMultiValues);

            if (editorFunc == null)
            {
                return;
            }

            // 选中项的属性值是否各不相同,如果有则在编辑器中画 "-"
            EditorGUI.showMixedValue = hasMultiValues;
            // 如果为只读属性则置灰
            if (isReadOnly)
            {
                EditorGUI.BeginDisabledGroup(true);
            }
            EditorGUI.BeginChangeCheck();
            var commonValue = editorFunc();

            if (EditorGUI.EndChangeCheck())
            { // 有改动才为属性赋值
                targets.ForEach(t => setter.Invoke(t, new[] { commonValue }));
            }
            if (isReadOnly)
            {
                EditorGUI.EndDisabledGroup();
            }
            EditorGUI.showMixedValue = false;
        }
        void DrawMethod(MethodInfo method, See attr, Obj[] targets)
        {
            var @params  = method.GetParameters();
            var btnText  = new GUIContent(GetCheersTitle(attr, method));
            var canPress = true;

            if (@params.Length > 0)
            {
                btnText.text += "\n(Parameters are not supported yet)";
                btnText.image = EditorHelper.icons.warning;
                canPress      = false;
            }
            EditorGUI.BeginDisabledGroup(!canPress);

            var bgColor    = attr.BackgroundColor == Color.clear ? GUI.backgroundColor : attr.BackgroundColor;
            var oldBgColor = GUI.backgroundColor;

            GUI.backgroundColor = bgColor;
            var btnStyle = new GUIStyle(EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector).button);

            if (attr.TextColor != Color.clear)
            {
                btnStyle.normal.textColor  = attr.TextColor;
                btnStyle.hover.textColor   = attr.TextColor;
                btnStyle.focused.textColor = attr.TextColor;
                btnStyle.active.textColor  = attr.TextColor;
            }
            if (GUILayout.Button(btnText, btnStyle))
            {
                StringBuilder retSb = new StringBuilder("=== Call Returns ===\n");
                foreach (var t in targets)
                {
                    var ret = method.Invoke(t, null);
                    retSb.AppendLine(string.Format(" - {0} >> {1}", t.name, ret ?? "(null)"));
                }
                //PrettyLog.Log(retSb.ToString());
            }
            GUI.backgroundColor = oldBgColor;

            EditorGUI.EndDisabledGroup();
        }