aboutsummaryrefslogtreecommitdiff
path: root/engines/wintermute
diff options
context:
space:
mode:
authorlolbot-iichan2019-12-16 01:09:25 +0300
committerFilippos Karapetis2019-12-19 15:50:25 +0200
commitea27ffd8a34e6bacd29f7069e9b0d028eea5ca99 (patch)
tree80f424932e7e972fd1f120102d57ed581e79532e /engines/wintermute
parent8a93f2c9f49ba27d28857ebbc1435c117025dacf (diff)
downloadscummvm-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/wintermute')
-rw-r--r--engines/wintermute/ui/ui_edit.cpp171
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);
}