fix a bug where view continues to pan when window lost focus while panning

This commit is contained in:
2026-08-05 19:54:43 +02:00
parent e1445fe508
commit bb1ffab8fc
2 changed files with 17 additions and 0 deletions

View File

@@ -18,6 +18,7 @@
#include <QCursor> #include <QCursor>
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QFocusEvent>
#include <QFont> #include <QFont>
#include <QKeyEvent> #include <QKeyEvent>
#include <QLinearGradient> #include <QLinearGradient>
@@ -2361,10 +2362,22 @@ void GameWorldView::keyReleaseEvent(QKeyEvent* event)
} }
if (m_inputMapper.handleKeyRelease(event)) { return; } if (m_inputMapper.handleKeyRelease(event)) { return; }
// Releasing Shift discards the copied building settings (REQ-BLD-COPY-CONFIG). // Releasing Shift discards the copied building settings (REQ-BLD-COPY-CONFIG).
// Stays here rather than moving to the input mapper: Shift is the modifier of a
// mouse gesture, not a keyboard action of its own.
if (event->key() == Qt::Key_Shift) { m_copiedConfig.reset(); } if (event->key() == Qt::Key_Shift) { m_copiedConfig.reset(); }
QOpenGLWidget::keyReleaseEvent(event); QOpenGLWidget::keyReleaseEvent(event);
} }
void GameWorldView::focusOutEvent(QFocusEvent* event)
{
// Without this, holding A while a modal opens (the escape menu, a schematic
// choice, game over) leaves the pan key held: the key-up goes to the dialog,
// never here, and the view pans on its own once the dialog closes. Panning runs
// on wall-clock time, so pausing does not mask it either.
m_inputMapper.releaseAll();
QOpenGLWidget::focusOutEvent(event);
}
void GameWorldView::mousePressEvent(QMouseEvent* event) void GameWorldView::mousePressEvent(QMouseEvent* event)
{ {
const WorldCoordinates coordinates = getCoordinates(); const WorldCoordinates coordinates = getCoordinates();

View File

@@ -107,6 +107,10 @@ protected:
void paintGL() override; void paintGL() override;
void keyPressEvent(QKeyEvent* event) override; void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override;
// Key-up never arrives for a key that was still held when focus moved away —
// to a modal dialog, another widget, or another window. Any held action would
// otherwise stay held forever, so focus loss drops all of them.
void focusOutEvent(QFocusEvent* event) override;
void mousePressEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override;