void UBGraphicsDelegateFrame::setCursorFromAngle(QString angle) { if (mCurrentTool == Rotate) { QWidget *controlViewport = UBApplication::boardController->controlView()->viewport(); QSize cursorSize(45,30); QImage mask_img(cursorSize, QImage::Format_Mono); mask_img.fill(0xff); QPainter mask_ptr(&mask_img); mask_ptr.setBrush( QBrush( QColor(0, 0, 0) ) ); mask_ptr.drawRoundedRect(0,0, cursorSize.width()-1, cursorSize.height()-1, 6, 6); QBitmap bmpMask = QBitmap::fromImage(mask_img); QPixmap pixCursor(cursorSize); pixCursor.fill(QColor(Qt::white)); QPainter painter(&pixCursor); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); painter.setBrush(QBrush(Qt::white)); painter.setPen(QPen(QColor(Qt::black))); painter.drawRoundedRect(1,1,cursorSize.width()-2,cursorSize.height()-2,6,6); painter.setFont(QFont("Arial", 10)); painter.drawText(1,1,cursorSize.width(),cursorSize.height(), Qt::AlignCenter, angle.append(QChar(176))); painter.end(); pixCursor.setMask(bmpMask); controlViewport->setCursor(pixCursor); } }
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)); } } } }