void QTerminal::doControlSeq(const QByteArray & seq) { switch (seq.right(1).at(0)) { case '@': this->insertPlainText(QString().fill(' ', seq.left(seq.length() - 1).toInt())); break; case 'C': for (int i = 0; i < seq.left(seq.length() - 1).toInt(); ++i) { if (this->textCursor().atEnd()) { this->insertPlainText(" "); } else { this->moveCursor(QTextCursor::Right, QTextCursor::MoveAnchor); } } break; case 'D': { QTextCursor cursor = this->textCursor(); cursor.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, seq.left(seq.length() - 1).toInt()); } break; case 'J': eraseDisplay(seq.left(seq.length() - 1).toInt()); /* Perl would parse the number at the beginning of the string :-P */ break; case 'K': eraseInLine(seq.left(seq.length() - 1).toInt()); break; case 'P': deleteChars(seq.left(seq.length() - 1).toInt()); break; case 'h': if (seq.left(seq.length() -1).toInt() == 4) { insertMode = true; } else { qDebug("No Can Do ESC [ %s", seq.constData()); } break; case 'l': if (seq.left(seq.length() -1).toInt() == 4) { insertMode = false; } else { qDebug("No Can Do ESC [ %s", seq.constData()); } break; default: qDebug("No Can Do ESC [ %s", seq.constData()); break; } }
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(1, _selEnd - _selStart); } _selStart = _selEnd; handled = true; break; case Common::KEYCODE_LEFT: case Common::KEYCODE_UP: _selEnd--; if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } handled = true; break; case Common::KEYCODE_RIGHT: case Common::KEYCODE_DOWN: _selEnd++; if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } handled = true; break; case Common::KEYCODE_HOME: if (_gameRef->_textRTL) { _selEnd = strlen(_text); if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } } else { _selEnd = 0; if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } } handled = true; break; case Common::KEYCODE_END: if (_gameRef->_textRTL) { _selEnd = 0; if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } } else { _selEnd = strlen(_text); if (!BaseKeyboardState::isShiftDown()) { _selStart = _selEnd; } } handled = true; break; 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); } _selStart = _selEnd; handled = true; break; default: break; } return handled; } else if (event->type == Common::EVENT_KEYDOWN && printable) { if (_selStart != _selEnd) { deleteChars(_selStart, _selEnd); } //WideString wstr = StringUtil::Utf8ToWide(event->kbd.ascii); WideString wstr; wstr += (char)event->kbd.ascii; _selEnd += insertChars(_selEnd, (const byte *)StringUtil::wideToAnsi(wstr).c_str(), 1); if (_gameRef->_textRTL) { _selEnd = _selStart; } else { _selStart = _selEnd; } return true; } return false; }