From b2d5cd19d4b873c07c56f680c7e7e311298e2745 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Mon, 16 Feb 2026 18:51:57 -0700 Subject: [PATCH] feat: Prevent Tab key from moving focus outside active viewport tools --- src/MainWindow.cpp | 19 +++++++++++++++++++ src/MainWindow.h | 4 ++++ src/ViewportWidget.cpp | 8 ++++++++ src/ViewportWidget.h | 1 + 4 files changed, 32 insertions(+) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 0ba1f27..e83b5ad 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -17,11 +17,14 @@ #include #include #include +#include +#include MainWindow::MainWindow(ApplicationController* appController, QWidget *parent) : QMainWindow(parent) , m_appController(appController) { + qApp->installEventFilter(this); setWindowTitle("OpenCAD"); resize(1920, 1080); @@ -204,3 +207,19 @@ void MainWindow::updateWindowTitle(const QString& filePath) shownName = "Untitled"; setWindowTitle(tr("%1[*] - %2").arg(QFileInfo(shownName).fileName(), tr("OpenCAD"))); } + +bool MainWindow::eventFilter(QObject *watched, QEvent *event) +{ + if (m_appController->activeTool() != ApplicationController::ToolType::None && event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) { + if (watched == m_viewport) { + return false; // Let the viewport handle its own event + } + // Forward event to viewport and consume it + QApplication::sendEvent(m_viewport, keyEvent); + return true; + } + } + return QMainWindow::eventFilter(watched, event); +} diff --git a/src/MainWindow.h b/src/MainWindow.h index 34a207d..a4830ed 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -3,6 +3,7 @@ #include +class QEvent; class ViewportWidget; class Document; class Feature; @@ -29,6 +30,9 @@ private slots: void exitSketchMode(); void updateWindowTitle(const QString& filePath); +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + private: ApplicationController* m_appController; ViewportWidget *m_viewport; diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 33ca2c7..bb97bf4 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -1054,6 +1054,14 @@ void ViewportWidget::keyPressEvent(QKeyEvent *event) QOpenGLWidget::keyPressEvent(event); } +bool ViewportWidget::focusNextPrevChild(bool next) +{ + if (m_activeTool != static_cast(ApplicationController::ToolType::None)) { + return false; + } + return QOpenGLWidget::focusNextPrevChild(next); +} + void ViewportWidget::onSketchModeStarted(SketchPlane plane) { m_currentPlane = plane; diff --git a/src/ViewportWidget.h b/src/ViewportWidget.h index c592b12..d4fe63b 100644 --- a/src/ViewportWidget.h +++ b/src/ViewportWidget.h @@ -58,6 +58,7 @@ protected: void mouseMoveEvent(QMouseEvent *event) override; void wheelEvent(QWheelEvent *event) override; void keyPressEvent(QKeyEvent *event) override; + bool focusNextPrevChild(bool next) override; private: void initShaders();