/// <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(); } }