void Oubliette::keyPressEvent(QKeyEvent *ke) { QPoint newPos = m_character.position(); switch (ke->key()) { case Qt::Key_Up: case Qt::Key_K: newPos.ry() -= 1; break; case Qt::Key_Down: case Qt::Key_J: newPos.ry() += 1; break; case Qt::Key_Left: case Qt::Key_H: newPos.rx() -= 1; break; case Qt::Key_Right: case Qt::Key_L: newPos.rx() += 1; break; case Qt::Key_I: showInventory(); break; default: QWidget::keyPressEvent(ke); } if (tryMove(newPos)) { QRect r(QPoint((newPos.x() - 8) * TileWidth, (newPos.y() - 8) * TileHeight), QSize(24 * TileWidth, 24 * TileHeight)); update(r); emit characterMoved(visualCursorPos()); } }
void TextField::OnCursorPosChanged(TextManipulator* mani) { TriggerRedraw(); int cursorPos = mani->GetCursorPos(); Vec2I textStartWPos = mUIObject->GetTextStartWPos(); textStartWPos.x += mCursorOffset; if (mani->IsHighlighting()) { auto start = mani->GetHighlightStart(); auto end = cursorPos; if (start > end) { std::swap(start, end); } if (end - start > 0) { auto font = Renderer::GetInstance().GetFontWithHeight(mTextSize); if (font) { float width = font->GetTextWidth( ((const char*)mTextw.c_str()) + (start * 2), (end - start) * 2); float leftGap = font->GetTextWidth( (const char*)mTextw.c_str(), start * 2); KeyboardCursor::GetInstance().SetSize(Vec2I((int)width, (int)mTextSize)); KeyboardCursor::GetInstance().SetPos( Vec2I(textStartWPos.x + (int)leftGap, textStartWPos.y - Round(mTextSize)) ); } } else { auto font = Renderer::GetInstance().GetFontWithHeight(mTextSize); float aWidth = font->GetTextWidth((const char*)AnsiToWide("A", 1), 2); Vec2I cursorSize(Round(aWidth), 2); KeyboardCursor::GetInstance().SetSize(Vec2I((int)1, (int)mTextSize)); KeyboardCursor::GetInstance().SetPos( Vec2I(textStartWPos.x, textStartWPos.y - Round(mTextSize)) ); } } else { auto font = Renderer::GetInstance().GetFontWithHeight(mTextSize); float aWidth = font->GetTextWidth((const char*)AnsiToWide("A", 1), 2); Vec2I cursorSize(Round(aWidth), 2); KeyboardCursor::GetInstance().SetSize(cursorSize); float width = font->GetTextWidth( (const char*)mTextw.c_str(), cursorPos * 2); Vec2I visualCursorPos(textStartWPos.x + Round(width), textStartWPos.y - WinBase::BOTTOM_GAP - 2); KeyboardCursor::GetInstance().SetPos(visualCursorPos); // check region // right Rect region = GetScissorRegion(); if (region.right - mTextGap.y < visualCursorPos.x + cursorSize.x) { int offset = visualCursorPos.x + cursorSize.x - (region.right - mTextGap.y); mCursorOffset -= offset; mUIObject->SetTextOffsetForCursorMovement(Vec2I(mCursorOffset, 0)); KeyboardCursor::GetInstance().SetPos(Vec2I(visualCursorPos.x - offset, visualCursorPos.y)); } else { if (region.left + mTextGap.x > visualCursorPos.x) { int offset = region.left + mTextGap.x - visualCursorPos.x; mCursorOffset += offset; mUIObject->SetTextOffsetForCursorMovement(Vec2I(mCursorOffset, 0)); KeyboardCursor::GetInstance().SetPos(Vec2I(visualCursorPos.x + offset, visualCursorPos.y)); } } } }