Example #1
0
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());
    }
}
Example #2
0
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));
            }
        }


    }
}