From 3648b7d08477b66cde9fa23e59752f2d4f0bb7c7 Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Fri, 4 Jun 2021 22:36:06 +0200 Subject: [PATCH] board: fix: place tile no longer drawn when mouse is outside board --- client/src/board/boardareawidget.cpp | 11 ++++++++++- client/src/board/boardareawidget.hpp | 1 + client/src/board/boardwidget.cpp | 5 ++++- shared/src/traintastic/board/tilelocation.hpp | 10 ++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/client/src/board/boardareawidget.cpp b/client/src/board/boardareawidget.cpp index f1430c04..351551cc 100644 --- a/client/src/board/boardareawidget.cpp +++ b/client/src/board/boardareawidget.cpp @@ -139,6 +139,15 @@ TileLocation BoardAreaWidget::pointToTileLocation(const QPoint& p) return TileLocation{static_cast(p.x() / pxPerTile), static_cast(p.y() / pxPerTile)}; } +void BoardAreaWidget::leaveEvent(QEvent* event) +{ + m_mouseMoveTileLocation = TileLocation::invalid; + emit mouseTileLocationChanged(m_mouseMoveTileLocation.x, m_mouseMoveTileLocation.y); + if(m_mouseMoveTileId != TileId::None) + update(); + QWidget::leaveEvent(event); +} + void BoardAreaWidget::keyPressEvent(QKeyEvent* event) { if(event->key() == Qt::Key_G && event->modifiers() == Qt::ControlModifier) @@ -313,7 +322,7 @@ void BoardAreaWidget::paintEvent(QPaintEvent* event) painter.restore(); - if(m_mouseMoveTileId != TileId::None) + if(m_mouseMoveTileId != TileId::None && m_mouseMoveTileLocation.isValid()) { const QRectF r = tileRect(m_mouseMoveTileLocation, 1, 1, tileSize); painter.fillRect(r, backgroundColor50); diff --git a/client/src/board/boardareawidget.hpp b/client/src/board/boardareawidget.hpp index 00a0c089..07876c44 100644 --- a/client/src/board/boardareawidget.hpp +++ b/client/src/board/boardareawidget.hpp @@ -63,6 +63,7 @@ class BoardAreaWidget : public QWidget SignalAspect getSignalAspect(const TileLocation& l) const; TileLocation pointToTileLocation(const QPoint& p); + void leaveEvent(QEvent *event) final; void keyPressEvent(QKeyEvent* event) final; void mousePressEvent(QMouseEvent* event) final; void mouseReleaseEvent(QMouseEvent* event) final; diff --git a/client/src/board/boardwidget.cpp b/client/src/board/boardwidget.cpp index 8a7e35c1..c1cb21d1 100644 --- a/client/src/board/boardwidget.cpp +++ b/client/src/board/boardwidget.cpp @@ -262,7 +262,10 @@ BoardWidget::BoardWidget(std::shared_ptr object, QWidget* parent) : connect(m_boardArea, &BoardAreaWidget::mouseTileLocationChanged, this, [this](int16_t x, int16_t y) { - m_statusBarCoords->setText(QString::number(x) + ", " + QString::number(y)); + if(TileLocation{x, y}.isValid()) + m_statusBarCoords->setText(QString::number(x) + ", " + QString::number(y)); + else + m_statusBarCoords->setText(""); }); gridChanged(m_boardArea->grid()); diff --git a/shared/src/traintastic/board/tilelocation.hpp b/shared/src/traintastic/board/tilelocation.hpp index 86645eb4..0877aa76 100644 --- a/shared/src/traintastic/board/tilelocation.hpp +++ b/shared/src/traintastic/board/tilelocation.hpp @@ -24,12 +24,20 @@ #define TRAINTASTIC_SHARED_TRAINTASTIC_BOARD_TILELOCATION_HPP #include +#include struct TileLocation { + static const TileLocation invalid; + int16_t x; int16_t y; + bool isValid() const + { + return *this != invalid; + } + bool operator ==(const TileLocation& other) const { return x == other.x && y == other.y; @@ -41,6 +49,8 @@ struct TileLocation } }; +inline const TileLocation TileLocation::invalid{std::numeric_limits::min(), std::numeric_limits::min()}; + struct TileLocationHash { std::size_t operator()(const TileLocation& key) const