From 0250287ba0d3cdb1b288455728c3dd3940b3a16d Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Sat, 14 Feb 2026 21:19:08 -0700 Subject: [PATCH] fix: Eliminate tool icon lag with custom QCursor Co-authored-by: aider (gemini/gemini-2.5-pro) --- src/ViewportWidget.cpp | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 1b7fd5d..2e8657c 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -159,26 +159,6 @@ void ViewportWidget::paintGL() } m_featureBrowser->paint(painter, width(), height()); - if (m_currentPlane != SketchPlane::NONE && m_activeTool != static_cast(ApplicationController::ToolType::None) && m_toolIcons.contains(m_activeTool)) { - QSvgRenderer* renderer = m_toolIcons.value(m_activeTool); - if (renderer && renderer->isValid()) { - const QSize iconSize(32, 32); - const QPoint iconPos = m_currentMousePos + QPoint(15, 15); - const QRect iconRect(iconPos, iconSize); - - QPixmap pixmap(iconSize); - pixmap.fill(Qt::transparent); - QPainter pixmapPainter(&pixmap); - renderer->render(&pixmapPainter); - pixmapPainter.end(); - - QImage image = pixmap.toImage(); - image.invertPixels(QImage::InvertRgb); - - painter.drawImage(iconRect, image); - } - } - painter.end(); } @@ -407,6 +387,30 @@ void ViewportWidget::onActiveToolChanged(int tool) { m_activeTool = tool; m_isDefiningLine = false; + + if (tool == static_cast(ApplicationController::ToolType::None)) { + unsetCursor(); + } else { + if (m_toolIcons.contains(tool)) { + QSvgRenderer* renderer = m_toolIcons.value(tool); + if (renderer && renderer->isValid()) { + const QSize iconSize(32, 32); + + QPixmap pixmap(iconSize); + pixmap.fill(Qt::transparent); + QPainter pixmapPainter(&pixmap); + renderer->render(&pixmapPainter); + pixmapPainter.end(); + + QImage image = pixmap.toImage(); + image.invertPixels(QImage::InvertRgb); + + setCursor(QCursor(QPixmap::fromImage(image), 16, 16)); + } + } else { + unsetCursor(); + } + } } QVector3D ViewportWidget::unproject(const QPoint& screenPos)