From c210ce77688677a933e9b2906452766f0c344f33 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Fri, 27 Jul 2018 15:46:00 +0100 Subject: gui: unselect on click and zoom fixes --- gui/fpgaviewwidget.cc | 30 ++++++++++++++++++++++++------ gui/fpgaviewwidget.h | 3 ++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/gui/fpgaviewwidget.cc b/gui/fpgaviewwidget.cc index 8a27c7c6..ed25a187 100644 --- a/gui/fpgaviewwidget.cc +++ b/gui/fpgaviewwidget.cc @@ -593,8 +593,17 @@ void FPGAViewWidget::mousePressEvent(QMouseEvent *event) auto world = mouseToWorldCoordinates(event->x(), event->y()); auto closestOr = pickElement(world.x(), world.y()); - if (!closestOr) + if (!closestOr) { + // If we clicked on empty space and aren't holding down ctrl, + // clear the selection. + if (!ctrl) { + QMutexLocker locked(&rendererArgsLock_); + rendererArgs_->selectedDecals.clear(); + rendererArgs_->changed = true; + pokeRenderer(); + } return; + } auto closest = closestOr.value(); if (closest.type == ElementType::BEL) { @@ -709,11 +718,19 @@ void FPGAViewWidget::zoom(int level) update(); } +void FPGAViewWidget::clampZoom() +{ + if (zoom_ < zoomNear_) + zoom_ = zoomNear_; + else if (zoom_ > zoomFar_) + zoom_ = zoomFar_; +} + void FPGAViewWidget::zoomIn() { zoom(10); } void FPGAViewWidget::zoomOut() { zoom(-10); } -void FPGAViewWidget::zoomToBB(const PickQuadTree::BoundingBox &bb) +void FPGAViewWidget::zoomToBB(const PickQuadTree::BoundingBox &bb, float margin) { if (bb.w() < 0.00005 && bb.h() < 0.00005) return; @@ -723,16 +740,17 @@ void FPGAViewWidget::zoomToBB(const PickQuadTree::BoundingBox &bb) // Our FOV is π/2, so distance for camera to see a plane of width H is H/2. // We add 1 unit to cover half a unit of extra space around. - float distance_w = bb.w() / 2 + 1; - float distance_h = bb.h() / 2 + 1; + float distance_w = bb.w() / 2 + margin; + float distance_h = bb.h() / 2 + margin; zoom_ = std::max(distance_w, distance_h); + clampZoom(); } void FPGAViewWidget::zoomSelected() { { QMutexLocker lock(&rendererDataLock_); - zoomToBB(rendererData_->bbSelected); + zoomToBB(rendererData_->bbSelected, 0.5f); } update(); } @@ -741,7 +759,7 @@ void FPGAViewWidget::zoomOutbound() { { QMutexLocker lock(&rendererDataLock_); - zoomToBB(rendererData_->bbGlobal); + zoomToBB(rendererData_->bbGlobal, 1.0f); } } diff --git a/gui/fpgaviewwidget.h b/gui/fpgaviewwidget.h index 6b94a126..c35821d9 100644 --- a/gui/fpgaviewwidget.h +++ b/gui/fpgaviewwidget.h @@ -290,7 +290,8 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions std::unique_ptr rendererData_; QMutex rendererDataLock_; - void zoomToBB(const PickQuadTree::BoundingBox &bb); + void clampZoom(); + void zoomToBB(const PickQuadTree::BoundingBox &bb, float margin); void zoom(int level); void renderLines(void); void renderGraphicElement(LineShaderData &out, PickQuadTree::BoundingBox &bb, const GraphicElement &el, float x, -- cgit v1.2.3