diff options
author | Sergiusz Bazanski <q3k@q3k.org> | 2018-07-27 15:46:00 +0100 |
---|---|---|
committer | Sergiusz Bazanski <q3k@q3k.org> | 2018-07-27 15:46:00 +0100 |
commit | c210ce77688677a933e9b2906452766f0c344f33 (patch) | |
tree | dcee8c5ccecb90ea166e1070e3f4e9e3bbbab305 /gui | |
parent | 816d33fa94bc14f05a90b259cfef9d693734e0df (diff) | |
download | nextpnr-c210ce77688677a933e9b2906452766f0c344f33.tar.gz nextpnr-c210ce77688677a933e9b2906452766f0c344f33.tar.bz2 nextpnr-c210ce77688677a933e9b2906452766f0c344f33.zip |
gui: unselect on click and zoom fixes
Diffstat (limited to 'gui')
-rw-r--r-- | gui/fpgaviewwidget.cc | 30 | ||||
-rw-r--r-- | 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> 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, |