diff options
Diffstat (limited to 'gui/editable.cpp')
-rw-r--r-- | gui/editable.cpp | 79 |
1 files changed, 66 insertions, 13 deletions
diff --git a/gui/editable.cpp b/gui/editable.cpp index 232873ffe3..aa95588da9 100644 --- a/gui/editable.cpp +++ b/gui/editable.cpp @@ -100,10 +100,12 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { endEditMode(); dirty = true; break; + case Common::KEYCODE_ESCAPE: abortEditMode(); dirty = true; break; + case Common::KEYCODE_BACKSPACE: if (_caretPos > 0) { _caretPos--; @@ -114,6 +116,28 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { } forcecaret = true; break; + + // Keypad & special keys + // - if num lock is set, we always go to the default case + // - if num lock is not set, we either fall down to the special key case + // or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN) + // 5, 8 (UP) and 9 (PGUP) + + case Common::KEYCODE_KP0: + case Common::KEYCODE_KP2: + case Common::KEYCODE_KP3: + case Common::KEYCODE_KP5: + case Common::KEYCODE_KP8: + case Common::KEYCODE_KP9: + if (state.flags & Common::KBD_NUM) + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + + case Common::KEYCODE_KP_PERIOD: + if (state.flags & Common::KBD_NUM) { + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + } case Common::KEYCODE_DELETE: if (_caretPos < (int)_editString.size()) { _editString.deleteChar(_caretPos); @@ -123,6 +147,22 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { } forcecaret = true; break; + + case Common::KEYCODE_KP1: + if (state.flags & Common::KBD_NUM) { + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + } + case Common::KEYCODE_END: + dirty = setCaretPos(_editString.size()); + forcecaret = true; + break; + + case Common::KEYCODE_KP4: + if (state.flags & Common::KBD_NUM) { + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + } case Common::KEYCODE_LEFT: if (_caretPos > 0) { dirty = setCaretPos(_caretPos - 1); @@ -130,6 +170,12 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { forcecaret = true; dirty = true; break; + + case Common::KEYCODE_KP6: + if (state.flags & Common::KBD_NUM) { + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + } case Common::KEYCODE_RIGHT: if (_caretPos < (int)_editString.size()) { dirty = setCaretPos(_caretPos + 1); @@ -137,24 +183,19 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { forcecaret = true; dirty = true; break; + + case Common::KEYCODE_KP7: + if (state.flags & Common::KBD_NUM) { + defaultKeyDownHandler(state, dirty, forcecaret, handled); + break; + } case Common::KEYCODE_HOME: dirty = setCaretPos(0); forcecaret = true; break; - case Common::KEYCODE_END: - dirty = setCaretPos(_editString.size()); - forcecaret = true; - break; - default: - if (tryInsertChar((byte)state.ascii, _caretPos)) { - _caretPos++; - dirty = true; - forcecaret = true; - sendCommand(_cmd, 0); - } else { - handled = false; - } + default: + defaultKeyDownHandler(state, dirty, forcecaret, handled); } if (dirty) @@ -166,6 +207,18 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) { return handled; } +void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) { + if (tryInsertChar((byte)state.ascii, _caretPos)) { + _caretPos++; + dirty = true; + forcecaret = true; + + sendCommand(_cmd, 0); + } else { + handled = false; + } +} + int EditableWidget::getCaretOffset() const { int caretpos = 0; for (int i = 0; i < _caretPos; i++) |