Esempio n. 1
0
    /// <summary>
    /// Draw dictionary
    /// </summary>
    /// <param name="width"></param>
    protected void DrawConfig(float width)
    {
        if (arabicDiacriticDictionary != null && arabicDiacriticDictionary.diacriticConfigs.Count > 0)
        {
            GUILayout.Space(20);
            GUILayout.BeginHorizontal();
            GUILayout.Label("Search for Hexa");


            searchCharContexteHexa = EditorGUILayout.TextField(searchCharContexteHexa, GUILayout.ExpandWidth(false));
            searchCharUpdateHexa   = EditorGUILayout.TextField(searchCharUpdateHexa, GUILayout.ExpandWidth(false));
            if (GUILayout.Button("Search", GUILayout.ExpandWidth(false)))
            {
                var index = arabicDiacriticDictionary.diacriticConfigs.FindIndex(a => a.hexaCharContext == searchCharContexteHexa && a.hexaCharUpdate == searchCharUpdateHexa);
                if (index >= 0)
                {
                    viewIndex      = index;
                    textSearchHexa = "";
                }
                else
                {
                    textSearchHexa = "Not found";
                }
            }
            GUILayout.EndHorizontal();
            if (textSearchHexa != "")
            {
                GUILayout.Label(textSearchHexa);
                if (GUILayout.Button("Add new one", GUILayout.ExpandWidth(false)))
                {
                    var index = arabicDiacriticDictionary.diacriticConfigs.FindIndex(a => a.hexaCharContext == searchCharContexteHexa && a.hexaCharUpdate == searchCharUpdateHexa);
                    if (index == -1)
                    {
                        arabicDiacriticDictionary.diacriticConfigs.Add(new DiacriticConfig("", searchCharContexteHexa, searchCharUpdateHexa, 0, 0));
                        EditorUtility.SetDirty(arabicDiacriticDictionary);
                        AssetDatabase.SaveAssets();
                        AssetDatabase.Refresh();
                        var New_index = arabicDiacriticDictionary.diacriticConfigs.FindIndex(a => a.hexaCharContext == searchCharContexteHexa && a.hexaCharUpdate == searchCharUpdateHexa);
                        if (New_index >= 0)
                        {
                            viewIndex = New_index;
                        }
                        else
                        {
                            Debug.Log("Error : Creation of entry did not work for : " + searchCharContexteHexa + " - " + searchCharUpdateHexa);
                        }
                    }
                    else
                    {
                        Debug.Log("Error : Trying to add entries that are already found at " + index + " :" + searchCharContexteHexa + " - " + searchCharUpdateHexa);
                    }
                    textSearchHexa = "";
                }
            }

            GUILayout.Space(20);


            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Prev", GUILayout.ExpandWidth(false)))
            {
                if (viewIndex > 0)
                {
                    viewIndex--;
                }
            }
            viewIndex = EditorGUILayout.IntSlider(viewIndex, 0, arabicDiacriticDictionary.diacriticConfigs.Count - 1);
            if (GUILayout.Button("Next", GUILayout.ExpandWidth(false)))
            {
                if (viewIndex < arabicDiacriticDictionary.diacriticConfigs.Count)
                {
                    viewIndex++;
                }
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(10);


            GUILayout.BeginHorizontal();
            EditorGUILayout.TextField("Char Contexte " + ArabicDiacriticHelper.GetLetterFromUnicode(arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).hexaCharContext), arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).hexaCharContext);
            EditorGUILayout.TextField(ArabicDiacriticHelper.GetLetterFromUnicode(arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).hexaCharContext));
            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();
            EditorGUILayout.TextField("Char to Update", arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).hexaCharUpdate);
            EditorGUILayout.TextField(ArabicDiacriticHelper.GetLetterFromUnicode(arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).hexaCharUpdate));
            GUILayout.EndHorizontal();
            arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).positionX = EditorGUILayout.FloatField("Position X to Correct", arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).positionX);
            arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).positionY = EditorGUILayout.FloatField("Position Y to Correct", arabicDiacriticDictionary.diacriticConfigs.ElementAt(viewIndex).positionY);


            if (GUILayout.Button("Apply on Current Scene", GUILayout.ExpandWidth(false)))
            {
                // save the asset
                EditorUtility.SetDirty(arabicDiacriticDictionary);
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
                var objects = GameObject.FindObjectsOfType <TextMeshProUGUI>();
                foreach (var obj in objects)
                {
                    // force the correction for this specific element
                    arabicDiacriticSupport.FixDiacriticsPositionsInTMP(obj);
                    // dont judge me please... it is only to force TMP to reload during runtime for viewing purposes
                    obj.isRightToLeftText = !obj.isRightToLeftText;
                    obj.isRightToLeftText = !obj.isRightToLeftText;
                }
            }
        }
        else
        {
            GUILayout.Label("Error : Count not find or generate a dictionary.");
        }
    }
    /// <summary>
    /// Fix the diacritics positions inside a TMP component
    /// </summary>
    /// <param name="obj"></param>
    public void FixDiacriticsPositionsInTMP(UnityEngine.Object obj)
    {
        var tmp = obj as TMPro.TMP_Text;

        if (tmp == null)
        {
            return;
        }
        var textInfo = tmp.textInfo;

        if (textInfo == null)
        {
            return;
        }


        var characterInfo  = textInfo.characterInfo;
        var characterCount = textInfo.characterCount;
        var changed        = false;

        // Only apply changes if the count of characters is superior to 1
        if (characterCount > 1)
        {
            Vector2 modificationDelta = new Vector2(0, 0);
            // From right to left. Looking for pairs
            for (var charPosition = characterCount - 1; charPosition > 0; charPosition--)
            {
                if (debug)
                {
                    Debug.Log("Combo Results : " + characterInfo[charPosition].character + " " +
                              ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition].character) + " " +
                              characterInfo[charPosition - 1].character + " " +
                              ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition - 1].character) + " "
                              + FindDiacriticConfig(
                                  ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition].character),
                                  ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition - 1].character)
                                  )
                              );
                }
                // Look for the configuration to apply for the current pair of characters
                modificationDelta = FindDiacriticConfig(
                    ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition].character),
                    ArabicDiacriticHelper.GetHexUnicodeFromChar(characterInfo[charPosition - 1].character)
                    );

                // If a modification has to be applied
                if (modificationDelta.sqrMagnitude > 0f)
                {
                    changed = true;

                    // Retrieve information from the character
                    var materialReferenceIndex = characterInfo[charPosition - 1].materialReferenceIndex;
                    var vertexIndex            = characterInfo[charPosition - 1].vertexIndex;
                    var originalVertices       = textInfo.meshInfo[materialReferenceIndex].vertices;

                    // Calculate the required changes to apply
                    var charsize = (originalVertices[vertexIndex + 2].y - originalVertices[vertexIndex + 0].y);
                    var offsetX  = charsize * modificationDelta.x / 100f;
                    var offsetY  = charsize * modificationDelta.y / 100f;
                    var offset   = new Vector3(offsetX, offsetY, 0f);

                    // Apply new vertices
                    var finalVertices = textInfo.meshInfo[materialReferenceIndex].vertices;
                    finalVertices[vertexIndex + 0] = originalVertices[vertexIndex + 0] + offset;
                    finalVertices[vertexIndex + 1] = originalVertices[vertexIndex + 1] + offset;
                    finalVertices[vertexIndex + 2] = originalVertices[vertexIndex + 2] + offset;
                    finalVertices[vertexIndex + 3] = originalVertices[vertexIndex + 3] + offset;
                }
            }
        }
        if (changed)
        {
            // Force the element to update the vertex data
            tmp.UpdateVertexData();
        }
    }