From 2b0a5f82b56db4c9a745f85dc2f4952552a7d7eb Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 7 Feb 2023 10:11:00 +0300 Subject: [PATCH] fix selection for highdpi --- src/core/mouse_controller.cpp | 39 +++++++++++------------------ src/qglview_test/qglview_window.cpp | 2 +- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/core/mouse_controller.cpp b/src/core/mouse_controller.cpp index c6c636f..9a47b08 100644 --- a/src/core/mouse_controller.cpp +++ b/src/core/mouse_controller.cpp @@ -93,7 +93,8 @@ void MouseController::mouseReleaseEvent(QMouseEvent * e) { void MouseController::mousePressEvent(QMouseEvent * e) { - downPos = e->pos(); + QPoint cpos = e->pos() * view->devicePixelRatio(); + downPos = cpos; if (cur_action != RendererService::haNoAction && e->buttons() == Qt::LeftButton) { return; } @@ -102,15 +103,15 @@ void MouseController::mousePressEvent(QMouseEvent * e) { view->renderer_.mouse_rect = QRect(); return; } - if (!QRect(QPoint(), view->size()).contains(e->pos())) return; - lastPos = e->pos(); - downPos = e->pos(); + if (!QRect(QPoint(), view->size()).contains(cpos)) return; + lastPos = cpos; + downPos = cpos; emit view->glMousePressEvent(e); } void MouseController::mouseMoveEvent(QMouseEvent * e) { - QPoint cpos = e->pos(); + QPoint cpos = e->pos() * view->devicePixelRatio(); if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) { RendererService & rs(view->renderer_.rend_service); ObjectBaseList objects = view->scene()->selectedObjects(true); @@ -144,7 +145,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { mouse_vector[1] *= -1.; if (cur_action == RendererService::haMove) { double len_scl = 1. / QVector3D(axe_screen.x(), axe_screen.y(), 1.E-6).length(); - mouse_vector /= QVector3D(view->pixelWidth(), view->pixelHeight(), 1); + mouse_vector /= QVector3D(view->pixelWidth(), view->pixelHeight(), 1); mouse_vector *= -center_screen.z() * len_scl; axe_vector *= QVector3D::dotProduct(axe_screen, mouse_vector); QMatrix4x4 pmat; @@ -189,7 +190,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { o->scale(QVector3D(1, 1, 1) + (axe_vector * sc)); QCursor::setPos(view->mapToGlobal(downPos)); } else - lastPos = e->pos(); + lastPos = cpos; emit view->objectsPositionChanged(); return; } @@ -206,19 +207,14 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { } QRect g_rect(QPoint(), view->size()); if (mouseRotate_) { -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - float dx = e->x() - lastPos.x(); - float dy = e->y() - lastPos.y(); -#else - float dx = e->position().toPoint().x() - lastPos.x(); - float dy = e->position().toPoint().y() - lastPos.y(); -#endif + float dx = cpos.x() - lastPos.x(); + float dy = cpos.y() - lastPos.y(); if (e->buttons().testFlag(QT_MID_BUTTON)) { if (cameraOrbit_) { view->camera()->orbitZ(dx / 4.f); view->camera()->orbitXY(dy / 4.f); } else { - view->camera()->rotateZ(-dx / 4.f); + view->camera()->rotateZ(-dx / 4.f); view->camera()->rotateX(-dy / 4.f); } emit view->cameraPosChanged(view->camera()->pos()); @@ -229,8 +225,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { emit view->cameraPosChanged(view->camera()->pos()); } } - if (customMouseMove_) emit view->customMouseMoveEvent(e->pos(), lastPos, e->buttons()); - lastPos = e->pos(); + if (customMouseMove_) emit view->customMouseMoveEvent(cpos, lastPos, e->buttons()); + lastPos = cpos; if (e->buttons() == 0) { cur_handle = QFlags(); cur_action = RendererService::haNoAction; @@ -267,13 +263,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { return; } lastPos = g_rect.center(); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - int dx = e->x() - lastPos.x(); - int dy = e->y() - lastPos.y(); -#else - int dx = e->position().toPoint().x() - lastPos.x(); - int dy = e->position().toPoint().y() - lastPos.y(); -#endif + int dx = cpos.x() - lastPos.x(); + int dy = cpos.y() - lastPos.y(); emit view->glMouseMoveEvent(new QMouseEvent(QEvent::MouseMove, QPoint(dx, dy), e->button(), e->buttons(), e->modifiers())); return; } diff --git a/src/qglview_test/qglview_window.cpp b/src/qglview_test/qglview_window.cpp index d519913..3c38fd8 100644 --- a/src/qglview_test/qglview_window.cpp +++ b/src/qglview_test/qglview_window.cpp @@ -69,7 +69,7 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView view->view()->setHoverHaloEnabled(true); view->view()->setDepthStart(0.1); view->view()->setSelectionMode(Scene::smMultiSelection); - view->view()->renderer_.addFramebufferEffect(new Effect1()); +// view->view()->renderer_.addFramebufferEffect(new Effect1()); groupShadows->setChecked(view->view()->isFeatureEnabled(QGLView::qglShadowsEnabled));