gui: unselect on click and zoom fixes

This commit is contained in:
Sergiusz Bazanski 2018-07-27 15:46:00 +01:00
parent 816d33fa94
commit c210ce7768
2 changed files with 26 additions and 7 deletions

View File

@ -593,8 +593,17 @@ void FPGAViewWidget::mousePressEvent(QMouseEvent *event)
auto world = mouseToWorldCoordinates(event->x(), event->y()); auto world = mouseToWorldCoordinates(event->x(), event->y());
auto closestOr = pickElement(world.x(), world.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; return;
}
auto closest = closestOr.value(); auto closest = closestOr.value();
if (closest.type == ElementType::BEL) { if (closest.type == ElementType::BEL) {
@ -709,11 +718,19 @@ void FPGAViewWidget::zoom(int level)
update(); update();
} }
void FPGAViewWidget::clampZoom()
{
if (zoom_ < zoomNear_)
zoom_ = zoomNear_;
else if (zoom_ > zoomFar_)
zoom_ = zoomFar_;
}
void FPGAViewWidget::zoomIn() { zoom(10); } void FPGAViewWidget::zoomIn() { zoom(10); }
void FPGAViewWidget::zoomOut() { 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) if (bb.w() < 0.00005 && bb.h() < 0.00005)
return; 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. // 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. // We add 1 unit to cover half a unit of extra space around.
float distance_w = bb.w() / 2 + 1; float distance_w = bb.w() / 2 + margin;
float distance_h = bb.h() / 2 + 1; float distance_h = bb.h() / 2 + margin;
zoom_ = std::max(distance_w, distance_h); zoom_ = std::max(distance_w, distance_h);
clampZoom();
} }
void FPGAViewWidget::zoomSelected() void FPGAViewWidget::zoomSelected()
{ {
{ {
QMutexLocker lock(&rendererDataLock_); QMutexLocker lock(&rendererDataLock_);
zoomToBB(rendererData_->bbSelected); zoomToBB(rendererData_->bbSelected, 0.5f);
} }
update(); update();
} }
@ -741,7 +759,7 @@ void FPGAViewWidget::zoomOutbound()
{ {
{ {
QMutexLocker lock(&rendererDataLock_); QMutexLocker lock(&rendererDataLock_);
zoomToBB(rendererData_->bbGlobal); zoomToBB(rendererData_->bbGlobal, 1.0f);
} }
} }

View File

@ -290,7 +290,8 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
std::unique_ptr<RendererData> rendererData_; std::unique_ptr<RendererData> rendererData_;
QMutex rendererDataLock_; QMutex rendererDataLock_;
void zoomToBB(const PickQuadTree::BoundingBox &bb); void clampZoom();
void zoomToBB(const PickQuadTree::BoundingBox &bb, float margin);
void zoom(int level); void zoom(int level);
void renderLines(void); void renderLines(void);
void renderGraphicElement(LineShaderData &out, PickQuadTree::BoundingBox &bb, const GraphicElement &el, float x, void renderGraphicElement(LineShaderData &out, PickQuadTree::BoundingBox &bb, const GraphicElement &el, float x,