diff options
author | lolbot-iichan | 2019-12-16 01:09:25 +0300 |
---|---|---|
committer | Filippos Karapetis | 2019-12-19 15:50:25 +0200 |
commit | ea27ffd8a34e6bacd29f7069e9b0d028eea5ca99 (patch) | |
tree | 80f424932e7e972fd1f120102d57ed581e79532e /engines | |
parent | 8a93f2c9f49ba27d28857ebbc1435c117025dacf (diff) | |
download | scummvm-rg350-ea27ffd8a34e6bacd29f7069e9b0d028eea5ca99.tar.gz scummvm-rg350-ea27ffd8a34e6bacd29f7069e9b0d028eea5ca99.tar.bz2 scummvm-rg350-ea27ffd8a34e6bacd29f7069e9b0d028eea5ca99.zip |
WINTERMUTE: Refactor UIEdit::handleKeypress()
This fixes https://bugs.scummvm.org/ticket/11033
Removed checking printable property for system keys.
Refactored whole function to make it a bit more readable.
Reference implementations:
https://github.com/retrowork/wmelite/blob/master/src/UIEdit.cpp#L724
https://github.com/retrowork/Wintermute-Engine/blob/master/src/engine_core/wme_base/UIEdit.cpp#L708
Diffstat (limited to 'engines')
-rw-r--r-- | engines/wintermute/ui/ui_edit.cpp | 171 |
1 files changed, 74 insertions, 97 deletions
diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp index 0592464928..d78981a2db 100644 --- a/engines/wintermute/ui/ui_edit.cpp +++ b/engines/wintermute/ui/ui_edit.cpp @@ -740,116 +740,93 @@ bool UIEdit::display(int offsetX, int offsetY) { ////////////////////////////////////////////////////////////////////////// bool UIEdit::handleKeypress(Common::Event *event, bool printable) { - bool handled = false; - - if (event->type == Common::EVENT_KEYDOWN && !printable) { - switch (event->kbd.keycode) { - case Common::KEYCODE_ESCAPE: - case Common::KEYCODE_TAB: - case Common::KEYCODE_RETURN: - return false; - - // ctrl+A - case Common::KEYCODE_a: - if (BaseKeyboardState::isControlDown()) { - _selStart = 0; - _selEnd = strlen(_text); - handled = true; - } - break; - - case Common::KEYCODE_BACKSPACE: - if (_selStart == _selEnd) { - if (_gameRef->_textRTL) { - deleteChars(_selStart, _selStart + 1); - } else { - deleteChars(_selStart - 1, _selStart); - } - } else { - deleteChars(_selStart, _selEnd); - } - if (_selEnd >= _selStart) { - _selEnd -= MAX<int32>(1, _selEnd - _selStart); - } - _selStart = _selEnd; - - handled = true; - break; - - case Common::KEYCODE_LEFT: - case Common::KEYCODE_UP: + if (event->type != Common::EVENT_KEYDOWN) { + return false; + } + + switch (event->kbd.keycode) { + + // Those keys are 'printable' in WME 1.x, let's ignore them + case Common::KEYCODE_ESCAPE: + case Common::KEYCODE_TAB: + case Common::KEYCODE_KP_ENTER: + case Common::KEYCODE_RETURN: + return false; + + // Movement keys are controlling _selEnd and _selStart + case Common::KEYCODE_HOME: + case Common::KEYCODE_END: + case Common::KEYCODE_LEFT: + case Common::KEYCODE_UP: + case Common::KEYCODE_RIGHT: + case Common::KEYCODE_DOWN: + if (event->kbd.keycode == Common::KEYCODE_HOME) { + _selEnd = _gameRef->_textRTL ? strlen(_text) : 0; + } else if (event->kbd.keycode == Common::KEYCODE_END) { + _selEnd = _gameRef->_textRTL ? 0 : strlen(_text); + } else if (event->kbd.keycode == Common::KEYCODE_LEFT || + event->kbd.keycode == Common::KEYCODE_UP) { _selEnd--; - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; - } - handled = true; - break; - - case Common::KEYCODE_RIGHT: - case Common::KEYCODE_DOWN: + } else { _selEnd++; - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; - } - handled = true; - break; + } + + if (!BaseKeyboardState::isShiftDown()) { + _selStart = _selEnd; + } + return true; - case Common::KEYCODE_HOME: + // Delete right + case Common::KEYCODE_DELETE: + if (_selStart == _selEnd) { if (_gameRef->_textRTL) { - _selEnd = strlen(_text); - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; + deleteChars(_selStart - 1, _selStart); + _selEnd--; + if (_selEnd < 0) { + _selEnd = 0; } } else { - _selEnd = 0; - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; - } + deleteChars(_selStart, _selStart + 1); } - handled = true; - break; + } else { + deleteChars(_selStart, _selEnd); + } + if (_selEnd > _selStart) { + _selEnd -= (_selEnd - _selStart); + } + _selStart = _selEnd; + return true; - case Common::KEYCODE_END: + // Delete left + case Common::KEYCODE_BACKSPACE: + if (_selStart == _selEnd) { if (_gameRef->_textRTL) { - _selEnd = 0; - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; - } + deleteChars(_selStart, _selStart + 1); } else { - _selEnd = strlen(_text); - if (!BaseKeyboardState::isShiftDown()) { - _selStart = _selEnd; - } + deleteChars(_selStart - 1, _selStart); } - handled = true; - break; + } else { + deleteChars(_selStart, _selEnd); + } + if (_selEnd >= _selStart) { + _selEnd -= MAX<int32>(1, _selEnd - _selStart); + } + _selStart = _selEnd; + return true; - case Common::KEYCODE_DELETE: - if (_selStart == _selEnd) { - if (_gameRef->_textRTL) { - deleteChars(_selStart - 1, _selStart); - _selEnd--; - if (_selEnd < 0) { - _selEnd = 0; - } - } else { - deleteChars(_selStart, _selStart + 1); - } - } else { - deleteChars(_selStart, _selEnd); - } - if (_selEnd > _selStart) { - _selEnd -= (_selEnd - _selStart); - } + default: + break; + } - _selStart = _selEnd; - handled = true; - break; - default: - break; - } - return handled; - } else if (event->type == Common::EVENT_KEYDOWN && printable) { + // Ctrl+A = Select All + if (BaseKeyboardState::isControlDown() && event->kbd.keycode == Common::KEYCODE_a) { + _selStart = 0; + _selEnd = strlen(_text); + return true; + } + + // Those are actually printable characters + else if (printable) { if (_selStart != _selEnd) { deleteChars(_selStart, _selEnd); } |