From dc7f3642b83c24d9da754420c8152cca137d5d55 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sat, 14 Feb 2026 21:21:51 -0700 Subject: [PATCH] feat: Render composite arrow and tool icon for active tool cursor Co-authored-by: aider (gemini/gemini-2.5-pro) --- src/ViewportWidget.cpp | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 2e8657c..3e0c781 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -394,18 +394,34 @@ void ViewportWidget::onActiveToolChanged(int tool) if (m_toolIcons.contains(tool)) { QSvgRenderer* renderer = m_toolIcons.value(tool); if (renderer && renderer->isValid()) { + const QSize cursorSize(48, 48); + QPixmap cursorPixmap(cursorSize); + cursorPixmap.fill(Qt::transparent); + QPainter painter(&cursorPixmap); + painter.setRenderHint(QPainter::Antialiasing); + + // Draw arrow cursor manually + QPolygon arrowPolygon; + arrowPolygon << QPoint(0, 0) << QPoint(0, 11) << QPoint(4, 11) << QPoint(4, 16) << QPoint(7, 16) << QPoint(7, 11) << QPoint(11, 11); + painter.setPen(Qt::white); + painter.setBrush(Qt::black); + painter.drawPolygon(arrowPolygon); + + // Render tool icon const QSize iconSize(32, 32); + QPixmap iconPixmap(iconSize); + iconPixmap.fill(Qt::transparent); + QPainter iconPainter(&iconPixmap); + renderer->render(&iconPainter); + iconPainter.end(); - QPixmap pixmap(iconSize); - pixmap.fill(Qt::transparent); - QPainter pixmapPainter(&pixmap); - renderer->render(&pixmapPainter); - pixmapPainter.end(); + // Invert and draw icon onto cursor pixmap + QImage iconImage = iconPixmap.toImage(); + iconImage.invertPixels(QImage::InvertRgb); + painter.drawImage(QRect(12, 12, iconSize.width(), iconSize.height()), iconImage); + painter.end(); - QImage image = pixmap.toImage(); - image.invertPixels(QImage::InvertRgb); - - setCursor(QCursor(QPixmap::fromImage(image), 16, 16)); + setCursor(QCursor(cursorPixmap, 0, 0)); } } else { unsetCursor();