Ejemplo n.º 1
0
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;
  }
}
Ejemplo n.º 2
0
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;
}