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