您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

180 行
6.6 KiB

using Unity.UIWidgets.ui;
using UnityEngine;
namespace Unity.UIWidgets.service {
public class KeyboadManager {
int _client;
string _lastCompositionString;
TextInputConfiguration _configuration;
TextEditingValue _value;
TouchScreenKeyboard _keyboard;
RangeInt? _pendingSelection;
bool _screenKeyboardDone;
readonly TextInput _textInput;
public KeyboadManager(TextInput textInput) {
this._textInput = textInput;
}
public void Update() {
if (!TouchScreenKeyboard.isSupported) {
return;
}
if (this._client == 0 || this._keyboard == null) {
return;
}
if (this._keyboard.canSetSelection && this._pendingSelection != null) {
this._keyboard.selection = this._pendingSelection.Value;
this._pendingSelection = null;
}
if (this._keyboard.status == TouchScreenKeyboard.Status.Done) {
if (!this._screenKeyboardDone) {
this._screenKeyboardDone = true;
Window.instance.run(() => {
this._textInput._performAction(this._client,
TextInputAction.done);
});
}
}
else if (this._keyboard.status == TouchScreenKeyboard.Status.Visible) {
var keyboardSelection = this._keyboard.selection;
var newValue = new TextEditingValue(
this._keyboard.text,
this._keyboard.canGetSelection
? new TextSelection(keyboardSelection.start, keyboardSelection.end)
: this._value.selection
);
var changed = this._value != newValue;
this._value = newValue;
if (changed) {
Window.instance.run(() => {
this._textInput._updateEditingState(this._client,
this._value);
});
}
}
}
public void OnGUI() {
if (TouchScreenKeyboard.isSupported) {
return;
}
if (this._client == 0) {
return;
}
var currentEvent = Event.current;
if (currentEvent != null && currentEvent.type == EventType.KeyDown) {
var action = TextInputUtils.getInputAction(currentEvent);
if (action != null) {
Window.instance.run(() => { this._textInput._performAction(this._client, action.Value); });
}
if (action == null || action == TextInputAction.newline) {
if (currentEvent.keyCode == KeyCode.None) {
this._value = this._value.clearCompose().insert(new string(currentEvent.character, 1));
Window.instance.run(() => { this._textInput._updateEditingState(this._client, this._value); });
}
}
currentEvent.Use();
}
if (!string.IsNullOrEmpty(Input.compositionString) &&
this._lastCompositionString != Input.compositionString) {
this._value = this._value.compose(Input.compositionString);
Window.instance.run(() => { this._textInput._updateEditingState(this._client, this._value); });
}
this._lastCompositionString = Input.compositionString;
}
public void show() {
if (!TouchScreenKeyboard.isSupported) {
return;
}
var secure = this._configuration.obscureText;
var multiline = this._configuration.inputType == TextInputType.multiline;
var autocorrection = this._configuration.autocorrect;
this._keyboard = TouchScreenKeyboard.Open(this._value.text,
getKeyboardTypeForConfiguration(this._configuration),
autocorrection, multiline, secure, false, "", 0);
this._pendingSelection = null;
this._screenKeyboardDone = false;
if (this._value.selection != null && this._value.selection.isValid) {
int start = this._value.selection.start;
int end = this._value.selection.end;
this._pendingSelection = new RangeInt(start, end - start);
}
}
public void clearClient() {
this._client = 0;
}
public void setClient(int client, TextInputConfiguration configuration) {
this._client = client;
this._configuration = configuration;
}
public void hide() {
if (this._keyboard != null) {
this._keyboard.active = false;
this._keyboard = null;
}
}
public void setEditingState(TextEditingValue state) {
this._value = state;
if (this._keyboard != null && this._keyboard.active) {
this._keyboard.text = state.text;
if (this._value.selection != null && this._value.selection.isValid) {
int start = this._value.selection.start;
int end = this._value.selection.end;
this._pendingSelection = new RangeInt(start, end - start);
RangeInt selection = new RangeInt(state.selection.start, end - start);
if (this._keyboard.canGetSelection) {
this._pendingSelection = null;
this._keyboard.selection = selection;
}
else {
this._pendingSelection = selection;
}
}
}
}
public bool textInputOnKeyboard() {
return TouchScreenKeyboard.isSupported;
}
static TouchScreenKeyboardType getKeyboardTypeForConfiguration(TextInputConfiguration config) {
var inputType = config.inputType;
if (inputType.index == TextInputType.url.index) {
return TouchScreenKeyboardType.URL;
}
if (inputType.index == TextInputType.emailAddress.index) {
return TouchScreenKeyboardType.EmailAddress;
}
if (inputType.index == TextInputType.phone.index) {
return TouchScreenKeyboardType.PhonePad;
}
if (inputType.index == TextInputType.number.index) {
return TouchScreenKeyboardType.NumberPad;
}
return TouchScreenKeyboardType.Default;
}
}
}