From ba206bad1ca37892dadebc89dc9274135771f8c2 Mon Sep 17 00:00:00 2001 From: mopsicus Date: Tue, 10 Dec 2024 16:51:59 +0300 Subject: [PATCH] feat: set caret position #120 --- .../java/com/mopsicus/umi/MobileInput.java | 25 ++++++++++++++-- CHANGELOG.md | 4 +++ Documentation~/index.md | 5 ++++ Plugins/Android/Mobileinput.aar | Bin 23897 -> 24129 bytes Plugins/iOS/MobileInput.mm | 15 ++++++++++ README.md | 4 +++ README.ru.md | 4 +++ Runtime/MobileInputField.cs | 27 +++++++++++++++--- 8 files changed, 78 insertions(+), 6 deletions(-) diff --git a/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java b/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java index 840a882..96e9c26 100644 --- a/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java +++ b/Android~/plugin/src/main/java/com/mopsicus/umi/MobileInput.java @@ -47,6 +47,7 @@ public class MobileInput { private static final String SET_PTEXT_COLOR = "SET_PTEXT_COLOR"; private static final String SET_BG_COLOR = "SET_BG_COLOR"; private static final String SET_READ_ONLY = "SET_READ_ONLY"; + private static final String SET_CARET = "SET_CARET"; private static final String SET_RECT = "SET_RECT"; private static final String SET_FOCUS = "SET_FOCUS"; private static final String ON_FOCUS = "ON_FOCUS"; @@ -183,6 +184,10 @@ private void processData(JSONObject data) { case SET_BG_COLOR: edit.setBackgroundColor(this.getColor(data)); break; + case SET_CARET: + Integer position = data.getInt("value"); + this.setCaret(position); + break; case SET_READ_ONLY: boolean value = data.getBoolean("value"); edit.setInputType(value ? EditorInfo.TYPE_NULL : editInputType); @@ -207,7 +212,7 @@ private void processData(JSONObject data) { break; case SET_LANGUAGE: String code = data.getString("value"); - setKeyboardLanguage(code); + this.setKeyboardLanguage(code); break; case ANDROID_KEY_DOWN: String strKey = data.getString("key"); @@ -446,7 +451,7 @@ private void Create(int id, JSONObject data) { } sendData(editData); } - SetFocus(isFocus); + this.SetFocus(isFocus); JSONObject focusData = new JSONObject(); try { focusData.put("msg", (isFocus) ? ON_FOCUS : ON_UNFOCUS); @@ -640,6 +645,21 @@ private void setKeyboardLanguage(String languageCode) { imm.restartInput(edit); } + /** + * Set caret position + * + * @param position Position in string + */ + private void setCaret(Integer position) { + int length = edit.getText().length(); + if (position < 0) { + position = 0; + } else if (position > length) { + position = length; + } + edit.setSelection(position, position); + } + /** * Remove MobileInput */ @@ -658,6 +678,7 @@ private void Remove() { private void SetText(String newText) { if (edit != null) { edit.setText(newText); + edit.setSelection(edit.getText().length()); } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fa559a..ba2c46c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## [2.0.5] - 2024-12-10 +- ### Added +- Set caret position + ## [2.0.4] - 2024-09-10 - ### Added - Change keyboard language diff --git a/Documentation~/index.md b/Documentation~/index.md index c72ad68..22e6ca8 100644 --- a/Documentation~/index.md +++ b/Documentation~/index.md @@ -28,6 +28,9 @@ public class Bootstrap : MonoBehaviour { } ``` +> [!IMPORTANT] +> UMI will not work with the **Render Over Native UI** option enabled. + ### MobileInput.cs This script manages the interaction between the Unity app and native part. It contains references and identifiers of all MobileInputField scripts and some additional functions. @@ -101,6 +104,8 @@ This is the basic script for using UMI. Add this script to a game object with `T `SetLanguage(string value)` – change keyboard language +`SetCaret` – set caret position + `SetRect(RectTransform inputRect)` – set new field size and position, this is useful if you want to move or resize the input field manually, at other times this is done automatically using the game object parameters `SetContentType(InputContentType type)` – set content type to field diff --git a/Plugins/Android/Mobileinput.aar b/Plugins/Android/Mobileinput.aar index 4211e99bb2027752c399275fe8b512d86d1543b1..22cb6c8eb98c01f0caebda40e80cb5a71ea112e6 100644 GIT binary patch delta 23041 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 U0000800;p40RR9nTmS$70PgU}3IG5A delta 22824 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 length) { + position = (int)length; + } + if (isMultiline) { + [(PlaceholderTextView *)editView setSelectedRange: NSMakeRange(position, 0)]; + } else { + UITextPosition *tpos = [(UITextField *)editView positionFromPosition:[(UITextField *)editView beginningOfDocument] offset:position]; + [(UITextField *)editView setSelectedTextRange: [(UITextField *)editView textRangeFromPosition:tpos toPosition:tpos]]; + } } else if ([msg isEqualToString:SET_PTEXT_COLOR]) { UIColor *color = [self getColor:data]; if (isMultiline) { diff --git a/README.md b/README.md index 1bf6467..bde555f 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,9 @@ public class Bootstrap : MonoBehaviour { > [!NOTE] > Make sure you do this before creating all input fields, otherwise UMI will raise an exception. +> [!IMPORTANT] +> UMI will not work with the **Render Over Native UI** option enabled. + ### Setup To begin using UMI in your project, add `MobileInputField` script to game object with `TMP Input field`. @@ -142,6 +145,7 @@ With `OnKeyboardAction` you can control UI elements, such as moving the input fi - `SetContentType` – change input field content type - `SetReadonly` – change readonly mode - `SetLanguage` – change keyboard language +- `SetCaret` – set caret position ### How to use custom fonts diff --git a/README.ru.md b/README.ru.md index 69b3fa1..0e33d91 100644 --- a/README.ru.md +++ b/README.ru.md @@ -76,6 +76,9 @@ public class Bootstrap : MonoBehaviour { > [!NOTE] > Убедитесь что вы сделали это до создания и появления всех полей ввода, иначе UMI выдаст ошибку. +> [!IMPORTANT] +> UMI не будет работать с включенной опцией **Render Over Native UI**. + ### Настройка Для начала использования UMI в вашем проекте, добавьте скрипт `MobileInputField` на объект с полем ввода `TMP Input field`. @@ -141,6 +144,7 @@ public class Bootstrap : MonoBehaviour { - `SetContentType` – изменение типа поля ввода - `SetReadonly` – изменение состояния "только для чтения" - `SetLanguage` – изменение языка клавиатуры +- `SetCaret` – установка позиции курсора ### Как использовать свои шрифты diff --git a/Runtime/MobileInputField.cs b/Runtime/MobileInputField.cs index e1ee1d6..b5cf747 100644 --- a/Runtime/MobileInputField.cs +++ b/Runtime/MobileInputField.cs @@ -138,6 +138,11 @@ public enum ReturnKeyType { /// const string SET_LANGUAGE = "SET_LANGUAGE"; + /// + /// Set caret position + /// + const string SET_CARET = "SET_CARET"; + /// /// Event when text changing in InputField /// @@ -173,7 +178,7 @@ public enum ReturnKeyType { /// /// Custom keyboard language, ISO code /// - public string KeyboardLanguage = "default"; + public string KeyboardLanguage = "default"; /// /// Background color @@ -382,7 +387,7 @@ IEnumerator InitProcess() { if (_initStarted) { yield break; } - _initStarted = true; + _initStarted = true; yield return WaitForEndOfFrame; PrepareNativeEdit(); #if (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR @@ -416,6 +421,9 @@ void Update() { var inputRect = this._inputObjectText.rectTransform.rect; for (var i = 0; i < touchCount; i++) { if (!inputRect.Contains(Input.touches[i].position)) { +#if UMI_DEBUG + Debug.Log($"[UMI] manual hide control: {IsManualHideControl}"); +#endif if (!IsManualHideControl) { Hide(); } @@ -610,7 +618,7 @@ void CreateNativeEdit() { ReturnKeyType.Search => (JsonNode)"Search", ReturnKeyType.Send => (JsonNode)"Send", _ => (JsonNode)"Default", - }; + }; Execute(data); } #endif @@ -701,7 +709,18 @@ public void SetLanguage(string value) { data["msg"] = SET_LANGUAGE; data["value"] = value; Execute(data); - } + } + + /// + /// Set caret position + /// + /// Position in string + public void SetCaret(int value) { + var data = new JsonObject(); + data["msg"] = SET_CARET; + data["value"] = value; + Execute(data); + } /// /// Set text to field