From 082241e88a5fccfa569d4282e226f8fc11769910 Mon Sep 17 00:00:00 2001 From: Max Wilfinger Date: Sat, 5 Jul 2025 10:06:33 +0200 Subject: [PATCH 1/3] Gui: Change navigation cursors to SVG --- src/Gui/Icons/cursor-pan.svg | 25 +++++++ src/Gui/Icons/cursor-rotate.svg | 25 +++++++ src/Gui/Icons/cursor-zoom.svg | 26 +++++++ src/Gui/Icons/resource.qrc | 3 + src/Gui/View3DInventorViewer.cpp | 120 +++++-------------------------- 5 files changed, 96 insertions(+), 103 deletions(-) create mode 100644 src/Gui/Icons/cursor-pan.svg create mode 100644 src/Gui/Icons/cursor-rotate.svg create mode 100644 src/Gui/Icons/cursor-zoom.svg diff --git a/src/Gui/Icons/cursor-pan.svg b/src/Gui/Icons/cursor-pan.svg new file mode 100644 index 0000000000..d0a05836cd --- /dev/null +++ b/src/Gui/Icons/cursor-pan.svg @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/src/Gui/Icons/cursor-rotate.svg b/src/Gui/Icons/cursor-rotate.svg new file mode 100644 index 0000000000..afb333c3cc --- /dev/null +++ b/src/Gui/Icons/cursor-rotate.svg @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/src/Gui/Icons/cursor-zoom.svg b/src/Gui/Icons/cursor-zoom.svg new file mode 100644 index 0000000000..68193dc9f6 --- /dev/null +++ b/src/Gui/Icons/cursor-zoom.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/src/Gui/Icons/resource.qrc b/src/Gui/Icons/resource.qrc index 7ba58795d6..e49d60caf8 100644 --- a/src/Gui/Icons/resource.qrc +++ b/src/Gui/Icons/resource.qrc @@ -38,7 +38,10 @@ clear-selection.svg colors.svg critical-info.svg + cursor-pan.svg cursor-through.svg + cursor-rotate.svg + cursor-zoom.svg dagViewFail.svg dagViewPass.svg dagViewPending.svg diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 7c5a748e87..94f0cc7fa3 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -101,6 +101,8 @@ #include #include #include +#include +#include #include "View3DInventorViewer.h" #include "Application.h" @@ -146,81 +148,6 @@ FC_LOG_LEVEL_INIT("3DViewer", true, true) using namespace Gui; -// NOLINTBEGIN -// clang-format off -/*** zoom-style cursor ******/ - -#define ZOOM_WIDTH 16 -#define ZOOM_HEIGHT 16 -#define ZOOM_BYTES ((ZOOM_WIDTH + 7) / 8) * ZOOM_HEIGHT -#define ZOOM_HOT_X 5 -#define ZOOM_HOT_Y 7 - -static unsigned char zoom_bitmap[ZOOM_BYTES] = -{ - 0x00, 0x0f, 0x80, 0x1c, 0x40, 0x38, 0x20, 0x70, - 0x90, 0xe4, 0xc0, 0xcc, 0xf0, 0xfc, 0x00, 0x0c, - 0x00, 0x0c, 0xf0, 0xfc, 0xc0, 0xcc, 0x90, 0xe4, - 0x20, 0x70, 0x40, 0x38, 0x80, 0x1c, 0x00, 0x0f -}; - -static unsigned char zoom_mask_bitmap[ZOOM_BYTES] = -{ - 0x00, 0x0f, 0x80, 0x1f, 0xc0, 0x3f, 0xe0, 0x7f, - 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x00, 0x0f, - 0x00, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, - 0xe0, 0x7f, 0xc0, 0x3f, 0x80, 0x1f, 0x00, 0x0f -}; - -/*** pan-style cursor *******/ - -#define PAN_WIDTH 16 -#define PAN_HEIGHT 16 -#define PAN_BYTES ((PAN_WIDTH + 7) / 8) * PAN_HEIGHT -#define PAN_HOT_X 7 -#define PAN_HOT_Y 7 - -static unsigned char pan_bitmap[PAN_BYTES] = -{ - 0xc0, 0x03, 0x60, 0x02, 0x20, 0x04, 0x10, 0x08, - 0x68, 0x16, 0x54, 0x2a, 0x73, 0xce, 0x01, 0x80, - 0x01, 0x80, 0x73, 0xce, 0x54, 0x2a, 0x68, 0x16, - 0x10, 0x08, 0x20, 0x04, 0x40, 0x02, 0xc0, 0x03 -}; - -static unsigned char pan_mask_bitmap[PAN_BYTES] = -{ - 0xc0, 0x03, 0xe0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, - 0xe8, 0x17, 0xdc, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x3b, 0xe8, 0x17, - 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03 -}; - -/*** rotate-style cursor ****/ - -#define ROTATE_WIDTH 16 -#define ROTATE_HEIGHT 16 -#define ROTATE_BYTES ((ROTATE_WIDTH + 7) / 8) * ROTATE_HEIGHT -#define ROTATE_HOT_X 6 -#define ROTATE_HOT_Y 8 - -static unsigned char rotate_bitmap[ROTATE_BYTES] = { - 0xf0, 0xef, 0x18, 0xb8, 0x0c, 0x90, 0xe4, 0x83, - 0x34, 0x86, 0x1c, 0x83, 0x00, 0x81, 0x00, 0xff, - 0xff, 0x00, 0x81, 0x00, 0xc1, 0x38, 0x61, 0x2c, - 0xc1, 0x27, 0x09, 0x30, 0x1d, 0x18, 0xf7, 0x0f -}; - -static unsigned char rotate_mask_bitmap[ROTATE_BYTES] = { - 0xf0, 0xef, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, - 0x3c, 0xfe, 0x1c, 0xff, 0x00, 0xff, 0x00, 0xff, - 0xff, 0x00, 0xff, 0x00, 0xff, 0x38, 0x7f, 0x3c, - 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x1f, 0xf7, 0x0f -}; -// clang-format on -// NOLINTEND - - /*! As ProgressBar has no chance to control the incoming Qt events of Quarter so we need to stop the event handling to prevent the scenegraph from being selected or deselected @@ -715,40 +642,27 @@ View3DInventorViewer::~View3DInventorViewer() delete glAction; } -static QCursor createCursor(QBitmap &bitmap, QBitmap &mask, int hotX, int hotY, double dpr) +static QCursor createSvgCursor(const QString& resourcePath, const QSize& logicalSize, const QPoint& hotSpot, qreal dpr) { -#if defined(Q_OS_WIN32) - bitmap.setDevicePixelRatio(dpr); - mask.setDevicePixelRatio(dpr); -#else - Q_UNUSED(dpr) -#endif -#ifdef HAS_QTBUG_95434 - if (qGuiApp->platformName() == QLatin1String("wayland")) { - QImage img = bitmap.toImage(); - img.convertTo(QImage::Format_ARGB32); - QPixmap pixmap = QPixmap::fromImage(img); - pixmap.setMask(mask); - return QCursor(pixmap, hotX, hotY); - } -#endif + QSize physicalSize = logicalSize * dpr; - return QCursor(bitmap, mask, hotX, hotY); + QPixmap pixmap(physicalSize); + pixmap.fill(Qt::transparent); + + QSvgRenderer renderer(resourcePath); + QPainter painter(&pixmap); + renderer.render(&painter); + painter.end(); + + pixmap.setDevicePixelRatio(dpr); + return QCursor(pixmap, hotSpot.x(), hotSpot.y()); } void View3DInventorViewer::createStandardCursors(double dpr) { - QBitmap cursor = QBitmap::fromData(QSize(ROTATE_WIDTH, ROTATE_HEIGHT), rotate_bitmap); - QBitmap mask = QBitmap::fromData(QSize(ROTATE_WIDTH, ROTATE_HEIGHT), rotate_mask_bitmap); - spinCursor = createCursor(cursor, mask, ROTATE_HOT_X, ROTATE_HOT_Y, dpr); - - cursor = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_bitmap); - mask = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_mask_bitmap); - zoomCursor = createCursor(cursor, mask, ZOOM_HOT_X, ZOOM_HOT_Y, dpr); - - cursor = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_bitmap); - mask = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_mask_bitmap); - panCursor = createCursor(cursor, mask, PAN_HOT_X, PAN_HOT_Y, dpr); + this->panCursor = createSvgCursor(QStringLiteral(":/icons/cursor-pan.svg"), QSize(16, 16), QPoint(8, 8), dpr); + this->spinCursor = createSvgCursor(QStringLiteral(":/icons/cursor-rotate.svg"), QSize(16, 16), QPoint(8, 8), dpr); + this->zoomCursor = createSvgCursor(QStringLiteral(":/icons/cursor-zoom.svg"), QSize(16, 16), QPoint(8, 8), dpr); } void View3DInventorViewer::aboutToDestroyGLContext() From f10631fc11d02c3b3d9bf7602190c924885ac1cc Mon Sep 17 00:00:00 2001 From: Max Wilfinger Date: Sat, 5 Jul 2025 11:15:31 +0200 Subject: [PATCH 2/3] Gui: Use BitmapFactory for generating cursors --- src/Gui/View3DInventorViewer.cpp | 31 +++++++++---------------------- src/Gui/View3DInventorViewer.h | 2 +- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 94f0cc7fa3..e8ae9449fc 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -101,8 +101,7 @@ #include #include #include -#include -#include +#include #include "View3DInventorViewer.h" #include "Application.h" @@ -557,7 +556,7 @@ void View3DInventorViewer::init() } //create the cursors - createStandardCursors(devicePixelRatio()); + createStandardCursors(); connect(this, &View3DInventorViewer::devicePixelRatioChanged, this, &View3DInventorViewer::createStandardCursors); @@ -642,27 +641,15 @@ View3DInventorViewer::~View3DInventorViewer() delete glAction; } -static QCursor createSvgCursor(const QString& resourcePath, const QSize& logicalSize, const QPoint& hotSpot, qreal dpr) +void View3DInventorViewer::createStandardCursors() { - QSize physicalSize = logicalSize * dpr; + QPixmap panPixmap = BitmapFactory().pixmapFromSvg("cursor-pan", QSize(16,16)); + QPixmap spinPixmap = BitmapFactory().pixmapFromSvg("cursor-rotate", QSize(16,16)); + QPixmap zoomPixmap = BitmapFactory().pixmapFromSvg("cursor-zoom", QSize(16,16)); - QPixmap pixmap(physicalSize); - pixmap.fill(Qt::transparent); - - QSvgRenderer renderer(resourcePath); - QPainter painter(&pixmap); - renderer.render(&painter); - painter.end(); - - pixmap.setDevicePixelRatio(dpr); - return QCursor(pixmap, hotSpot.x(), hotSpot.y()); -} - -void View3DInventorViewer::createStandardCursors(double dpr) -{ - this->panCursor = createSvgCursor(QStringLiteral(":/icons/cursor-pan.svg"), QSize(16, 16), QPoint(8, 8), dpr); - this->spinCursor = createSvgCursor(QStringLiteral(":/icons/cursor-rotate.svg"), QSize(16, 16), QPoint(8, 8), dpr); - this->zoomCursor = createSvgCursor(QStringLiteral(":/icons/cursor-zoom.svg"), QSize(16, 16), QPoint(8, 8), dpr); + this->panCursor = QCursor(panPixmap, 8, 8); + this->spinCursor = QCursor(spinPixmap, 8, 8); + this->zoomCursor = QCursor(zoomPixmap, 8, 8); } void View3DInventorViewer::aboutToDestroyGLContext() diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 242d80bef3..7d510620d4 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -510,7 +510,7 @@ private: static void drawSingleBackground(const QColor&); void setCursorRepresentation(int mode); void aboutToDestroyGLContext(); - void createStandardCursors(double); + void createStandardCursors(); private: NaviCube* naviCube; From d01ac5f8256dbbeec976328060fd7cc3656e12b6 Mon Sep 17 00:00:00 2001 From: Max Wilfinger Date: Sat, 5 Jul 2025 11:36:45 +0200 Subject: [PATCH 3/3] TechDraw: Change navigation cursors to SVG --- src/Mod/TechDraw/Gui/QGVPage.cpp | 65 +++----------------------------- src/Mod/TechDraw/Gui/QGVPage.h | 2 +- 2 files changed, 7 insertions(+), 60 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 8bd105dfd3..da2c817edc 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -76,36 +76,6 @@ #define INKSCAPE_NS_URI "http://www.inkscape.org/namespaces/inkscape" #define SODIPODI_NS_URI "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" -/*** pan-style cursor *******/ - -#define PAN_WIDTH 16 -#define PAN_HEIGHT 16 -#define PAN_BYTES ((PAN_WIDTH + 7) / 8) * PAN_HEIGHT -#define PAN_HOT_X 7 -#define PAN_HOT_Y 7 - -static unsigned char pan_bitmap[PAN_BYTES] = { - 0xc0, 0x03, 0x60, 0x02, 0x20, 0x04, 0x10, 0x08, 0x68, 0x16, 0x54, 0x2a, 0x73, 0xce, 0x01, 0x80, - 0x01, 0x80, 0x73, 0xce, 0x54, 0x2a, 0x68, 0x16, 0x10, 0x08, 0x20, 0x04, 0x40, 0x02, 0xc0, 0x03}; - -static unsigned char pan_mask_bitmap[PAN_BYTES] = { - 0xc0, 0x03, 0xe0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xe8, 0x17, 0xdc, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdc, 0x3b, 0xe8, 0x17, 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03}; -/*** zoom-style cursor ******/ - -#define ZOOM_WIDTH 16 -#define ZOOM_HEIGHT 16 -#define ZOOM_BYTES ((ZOOM_WIDTH + 7) / 8) * ZOOM_HEIGHT -#define ZOOM_HOT_X 5 -#define ZOOM_HOT_Y 7 - -static unsigned char zoom_bitmap[ZOOM_BYTES] = { - 0x00, 0x0f, 0x80, 0x1c, 0x40, 0x38, 0x20, 0x70, 0x90, 0xe4, 0xc0, 0xcc, 0xf0, 0xfc, 0x00, 0x0c, - 0x00, 0x0c, 0xf0, 0xfc, 0xc0, 0xcc, 0x90, 0xe4, 0x20, 0x70, 0x40, 0x38, 0x80, 0x1c, 0x00, 0x0f}; - -static unsigned char zoom_mask_bitmap[ZOOM_BYTES] = { - 0x00, 0x0f, 0x80, 0x1f, 0xc0, 0x3f, 0xe0, 0x7f, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x00, 0x0f, - 0x00, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe0, 0x7f, 0xc0, 0x3f, 0x80, 0x1f, 0x00, 0x0f}; using namespace Gui; using namespace TechDraw; using namespace TechDrawGui; @@ -213,7 +183,7 @@ QGVPage::QGVPage(ViewProviderPage* vpPage, QGSPage* scenePage, QWidget* parent) initNavigationStyle(); - createStandardCursors(devicePixelRatio()); + createStandardCursors(); } QGVPage::~QGVPage() @@ -667,36 +637,13 @@ Base::Type QGVPage::getStyleType(std::string model) return type; } -static QCursor createCursor(QBitmap &bitmap, QBitmap &mask, int hotX, int hotY, double dpr) +void QGVPage::createStandardCursors() { -#if defined(Q_OS_WIN32) - bitmap.setDevicePixelRatio(dpr); - mask.setDevicePixelRatio(dpr); -#else - Q_UNUSED(dpr) -#endif -#if defined(Q_OS_LINUX) && QT_VERSION < QT_VERSION_CHECK(6,6,0) - if (qGuiApp->platformName() == QLatin1String("wayland")) { - QImage img = bitmap.toImage(); - img.convertTo(QImage::Format_ARGB32); - QPixmap pixmap = QPixmap::fromImage(img); - pixmap.setMask(mask); - return QCursor(pixmap, hotX, hotY); - } -#endif + QPixmap panPixmap = BitmapFactory().pixmapFromSvg("cursor-pan", QSize(16,16)); + QPixmap zoomPixmap = BitmapFactory().pixmapFromSvg("cursor-zoom", QSize(16,16)); - return QCursor(bitmap, mask, hotX, hotY); -} - -void QGVPage::createStandardCursors(double dpr) -{ - QBitmap cursor = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_bitmap); - QBitmap mask = QBitmap::fromData(QSize(PAN_WIDTH, PAN_HEIGHT), pan_mask_bitmap); - panCursor = createCursor(cursor, mask, PAN_HOT_X, PAN_HOT_Y, dpr); - - cursor = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_bitmap); - mask = QBitmap::fromData(QSize(ZOOM_WIDTH, ZOOM_HEIGHT), zoom_mask_bitmap); - zoomCursor = createCursor(cursor, mask, ZOOM_HOT_X, ZOOM_HOT_Y, dpr); + this->panCursor = QCursor(panPixmap, 8, 8); + this->zoomCursor = QCursor(zoomPixmap, 8, 8); } #include diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index 332576871a..aaa9d14984 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -162,7 +162,7 @@ protected: void initNavigationStyle(); void setNavigationStyle(std::string navParm); - void createStandardCursors(double dpr); + void createStandardCursors(); private: RendererType m_renderer;