Custom editor focus change with EditorGUILayout.LabelField

Hello everyone,

I’ve an issue working with custom editor, my editing focus is changed without any action from my part.
Basically, this is a screen of my custom editor in a neutral state (just added empty translation entity):

5109089--504173--CaptureNeutral.PNG

And this is a screen when my focus got change without reason. As you can see, my editor detected that 2 keys was the same and notify it by a message at the top of the box, the issue is that I was actually editing the second box’s “key” field, and my focus changed on the first box (highlighted blue). If I don’t display the warning message, I don’t have any issue so I guess it comes from there…

5109089--504176--CaptureFocusChange.PNG

This is my custom editor script :

[CustomEditor(typeof(InternationalizationDatabaseSO))]
    public class InternationalizationDatabaseSOEditor : Editor
    {
        #region Constantes
        private const string ITEMS_PROPERTY_NAME = "_mItems";

        private const string ITEM_CATEGORY_NAME = "_mCategory";
        private const string ITEM_KEY_NAME = "_mKey";
        private const string ITEM_VALUES_NAME = "_mValues";

        private const string ITEM_VALUE_LANGUAGE = "_mLanguage";
        private const string ITEM_VALUE_VALUE = "_mValue";
        #endregion

        #region Attributs
        private InternationalizationDatabaseSO _mDatabase;
        #endregion

        #region Methods
        private void OnEnable()
        {
            Init();
        }

        private void Init()
        {
            _mDatabase = target as InternationalizationDatabaseSO;
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            SerializedProperty itemsProperty = serializedObject.FindProperty(ITEMS_PROPERTY_NAME);

            int arraySize = itemsProperty.arraySize;

            EditorGUI.BeginDisabledGroup(false);
            {
                EditorGUILayout.BeginHorizontal();
                {
                    GUILayout.FlexibleSpace();
                    if (OnInspectorGUIButton("+", 40, 25, Color.white, Color.green))
                    {
                        itemsProperty.arraySize++;
                        itemsProperty.GetArrayElementAtIndex(itemsProperty.arraySize - 1).FindPropertyRelative(ITEM_CATEGORY_NAME).stringValue = "";
                        itemsProperty.GetArrayElementAtIndex(itemsProperty.arraySize - 1).FindPropertyRelative(ITEM_KEY_NAME).stringValue = "";
                        serializedObject.ApplyModifiedProperties();
                        Init();
                        return;
                    }
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.Space();

                for(int i = 0; i < arraySize; i++)
                {
                    if(OnInspectorGUIItem(i) == false)
                    {
                        serializedObject.ApplyModifiedProperties();
                        Init();
                        return;
                    }
                }
            }

            EditorGUI.EndDisabledGroup();
            serializedObject.ApplyModifiedProperties();
        }

        private bool OnInspectorGUIItem(int index)
        {
            SerializedProperty itemsProperty = serializedObject.FindProperty(ITEMS_PROPERTY_NAME);

            SerializedProperty itemCategory = itemsProperty.GetArrayElementAtIndex(index).FindPropertyRelative(ITEM_CATEGORY_NAME);
            SerializedProperty itemKey = itemsProperty.GetArrayElementAtIndex(index).FindPropertyRelative(ITEM_KEY_NAME);

            EditorGUI.indentLevel += 1;
          
            EditorGUILayout.BeginVertical(GUI.skin.box);
            {
                EditorGUILayout.Space();
                EditorGUILayout.BeginHorizontal();
                {
                    EditorGUILayout.BeginVertical();
                    {
                        if(KeyAlreadyExist(index, itemKey.stringValue))
                        {
                            OnInspectorGUIText("Key already exists", 12, Color.red, FontStyle.Bold, false);
                        }
                        OnInspectorGUIText("Key : " + itemKey.stringValue, 12, FontStyle.Normal, false);
                    }
                    EditorGUILayout.EndVertical();
                  
                    GUILayout.FlexibleSpace();
                    if(OnInspectorGUIButton("-", 40, 25, Color.white, Color.red))
                    {
                        itemCategory.stringValue = "";
                        itemKey.stringValue = "";
                        itemsProperty.DeleteArrayElementAtIndex(index);
                        return false;
                    }
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Space();

                EditorGUILayout.BeginVertical();
                {
                    GUIStyle style = EditorStyles.foldout;
                    style.fontSize = 15;
                    style.fontStyle = FontStyle.Bold;

                  
                    itemCategory.isExpanded = EditorGUILayout.Foldout(itemCategory.isExpanded, "General informations", style);
                    if(itemCategory.isExpanded)
                    {
                        EditorGUILayout.Space();
                        EditorGUILayout.PropertyField(itemCategory, new GUIContent("Category"));
                        EditorGUILayout.PropertyField(itemKey, new GUIContent("Key"));
                    }
                }
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndVertical();
            EditorGUI.indentLevel -= 1;
            return true;
        }

        private bool KeyAlreadyExist(int currentIndex, string key)
        {
            for(int i = 0; i < _mDatabase.Items.Count; i++)
            {
                InternationalizationDatabaseItem item = _mDatabase.Items[i];
                if(currentIndex != i && item.Key == key && string.IsNullOrEmpty(key) == false)
                {
                    return true;
                }
            }

            return false;
        }

        private void OnInspectorGUIText(string text, FontStyle fontStyle, bool prefixLabel)
        {
            GUIStyle style = new GUIStyle();
            style.fontStyle = fontStyle;
            style.wordWrap = true;

            if (prefixLabel)
            {
                EditorGUILayout.PrefixLabel(text, GUIStyle.none, style);
            }
            else
            {
                EditorGUILayout.LabelField(text, style);
            }
        }

        private void OnInspectorGUIText(string text, int fontSize, FontStyle fontStyle, bool prefixLabel)
        {
            GUIStyle style = new GUIStyle();
            style.fontSize = fontSize;
            style.fontStyle = fontStyle;
            style.wordWrap = true;

            if (prefixLabel)
            {
                EditorGUILayout.PrefixLabel(text, GUIStyle.none, style);
            }
            else
            {
                EditorGUILayout.LabelField(text, style);
            }
        }

        private void OnInspectorGUIText(string text, int fontSize, Color textColor, FontStyle fontStyle, bool prefixLabel)
        {
            GUIStyle style = new GUIStyle();
            style.fontSize = fontSize;
            style.normal.textColor = textColor;
            style.fontStyle = fontStyle;
            style.wordWrap = true;
          
            if(prefixLabel)
            {
                EditorGUILayout.PrefixLabel(text, GUIStyle.none, style);
            }
            else
            {
                EditorGUILayout.LabelField(text, style);
            }
        }

        private bool OnInspectorGUIButton(string label, int width, int height, Color textColor, Color backgroundColor)
        {
            Color saveColor = GUI.backgroundColor;
            GUILayoutOption[] options = { GUILayout.Width(width), GUILayout.Height(height) };
            GUIStyle style = new GUIStyle(GUI.skin.button);
            style.normal.textColor = textColor;
            GUI.backgroundColor = backgroundColor;

            bool pressed = GUILayout.Button(label, style, options);
            GUI.backgroundColor = saveColor;

            return pressed;
        }
      
        #endregion
    }

Have you any suggestion ? Thanks
Have a nice day.

Ok finally figure it out, I mean, I’m not still totally certain why it happens, but found a workaround thanks to : Editor GUI inputfield loses focus when GUI updates

Basically, I’m just displaying always the LabelField, but if there is no error, I simply set the errorMessage to an empty string