cocos-enhance-kit/adapters/common/engine/Editbox.js
2024-10-16 17:12:08 +08:00

178 lines
5.5 KiB
JavaScript

(function () {
if (!(cc && cc.EditBox)) {
return;
}
const EditBox = cc.EditBox;
const js = cc.js;
const KeyboardReturnType = EditBox.KeyboardReturnType;
const MAX_VALUE = 65535;
const KEYBOARD_HIDE_TIME = 600;
let _hideKeyboardTimeout = null;
let _currentEditBoxImpl = null;
function getKeyboardReturnType (type) {
switch (type) {
case KeyboardReturnType.DEFAULT:
case KeyboardReturnType.DONE:
return 'done';
case KeyboardReturnType.SEND:
return 'send';
case KeyboardReturnType.SEARCH:
return 'search';
case KeyboardReturnType.GO:
return 'go';
case KeyboardReturnType.NEXT:
return 'next';
}
return 'done';
}
const BaseClass = EditBox._ImplClass;
function MiniGameEditBoxImpl () {
BaseClass.call(this);
this._eventListeners = {
onKeyboardInput: null,
onKeyboardConfirm: null,
onKeyboardComplete: null,
};
}
js.extend(MiniGameEditBoxImpl, BaseClass);
EditBox._ImplClass = MiniGameEditBoxImpl;
Object.assign(MiniGameEditBoxImpl.prototype, {
init (delegate) {
if (!delegate) {
cc.error('EditBox init failed');
return;
}
this._delegate = delegate;
},
beginEditing () {
// In case multiply register events
if (this._editing) {
return;
}
this._ensureKeyboardHide(() => {
let delegate = this._delegate;
this._showKeyboard();
this._registerKeyboardEvent();
this._editing = true;
_currentEditBoxImpl = this;
delegate.editBoxEditingDidBegan();
});
},
endEditing () {
this._hideKeyboard();
let cbs = this._eventListeners;
cbs.onKeyboardComplete && cbs.onKeyboardComplete();
},
_registerKeyboardEvent () {
let self = this;
let delegate = this._delegate;
let cbs = this._eventListeners;
cbs.onKeyboardInput = function (res) {
if (delegate._string !== res.value) {
delegate.editBoxTextChanged(res.value);
}
}
cbs.onKeyboardConfirm = function (res) {
delegate.editBoxEditingReturn();
let cbs = self._eventListeners;
cbs.onKeyboardComplete && cbs.onKeyboardComplete(res);
}
cbs.onKeyboardComplete = function (res) {
self._editing = false;
_currentEditBoxImpl = null;
self._unregisterKeyboardEvent();
if (res && res.value && delegate._string !== res.value) {
delegate.editBoxTextChanged(res.value);
}
delegate.editBoxEditingDidEnded();
}
__globalAdapter.onKeyboardInput(cbs.onKeyboardInput);
__globalAdapter.onKeyboardConfirm(cbs.onKeyboardConfirm);
__globalAdapter.onKeyboardComplete(cbs.onKeyboardComplete);
},
_unregisterKeyboardEvent () {
let cbs = this._eventListeners;
if (cbs.onKeyboardInput) {
__globalAdapter.offKeyboardInput(cbs.onKeyboardInput);
cbs.onKeyboardInput = null;
}
if (cbs.onKeyboardConfirm) {
__globalAdapter.offKeyboardConfirm(cbs.onKeyboardConfirm);
cbs.onKeyboardConfirm = null;
}
if (cbs.onKeyboardComplete) {
__globalAdapter.offKeyboardComplete(cbs.onKeyboardComplete);
cbs.onKeyboardComplete = null;
}
},
_otherEditing () {
return !!_currentEditBoxImpl && _currentEditBoxImpl !== this && _currentEditBoxImpl._editing;
},
_ensureKeyboardHide (cb) {
let otherEditing = this._otherEditing();
if (!otherEditing && !_hideKeyboardTimeout) {
return cb();
}
if (_hideKeyboardTimeout) {
clearTimeout(_hideKeyboardTimeout);
}
if (otherEditing) {
_currentEditBoxImpl.endEditing();
}
_hideKeyboardTimeout = setTimeout(() => {
_hideKeyboardTimeout = null;
cb();
}, KEYBOARD_HIDE_TIME);
},
_showKeyboard () {
let delegate = this._delegate;
let multiline = (delegate.inputMode === EditBox.InputMode.ANY);
let maxLength = (delegate.maxLength < 0 ? MAX_VALUE : delegate.maxLength);
__globalAdapter.showKeyboard({
defaultValue: delegate._string,
maxLength: maxLength,
multiple: multiline,
confirmHold: false,
confirmType: getKeyboardReturnType(delegate.returnType),
success (res) {
},
fail (res) {
cc.warn(res.errMsg);
}
});
},
_hideKeyboard () {
__globalAdapter.hideKeyboard({
success (res) {
},
fail (res) {
cc.warn(res.errMsg);
},
});
},
});
})();