Hide the menubar when menus lose focus (if toggled off)

* Fixes #10768
* Also fix menubar toggling not working if Qt version is less than 5.15
This commit is contained in:
Jonathan White 2024-10-12 16:17:12 -04:00
parent 34fe413dad
commit 5d24495704
2 changed files with 40 additions and 20 deletions

View File

@ -553,14 +553,12 @@ MainWindow::MainWindow()
connect(osUtils, &OSUtilsBase::statusbarThemeChanged, this, &MainWindow::updateTrayIcon); connect(osUtils, &OSUtilsBase::statusbarThemeChanged, this, &MainWindow::updateTrayIcon);
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) // Install event filter for empty-area drag and menubar toggle
// Install event filter for empty-area drag
auto* eventFilter = new MainWindowEventFilter(this); auto* eventFilter = new MainWindowEventFilter(this);
m_ui->menubar->installEventFilter(eventFilter); m_ui->menubar->installEventFilter(eventFilter);
m_ui->toolBar->installEventFilter(eventFilter); m_ui->toolBar->installEventFilter(eventFilter);
m_ui->tabWidget->tabBar()->installEventFilter(eventFilter); m_ui->tabWidget->tabBar()->installEventFilter(eventFilter);
installEventFilter(eventFilter); installEventFilter(eventFilter);
#endif
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
setUnifiedTitleAndToolBarOnMac(true); setUnifiedTitleAndToolBarOnMac(true);
@ -2119,11 +2117,29 @@ void MainWindow::initActionCollection()
QTimer::singleShot(1, ac, &ActionCollection::restoreShortcuts); QTimer::singleShot(1, ac, &ActionCollection::restoreShortcuts);
} }
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
MainWindowEventFilter::MainWindowEventFilter(QObject* parent) MainWindowEventFilter::MainWindowEventFilter(QObject* parent)
: QObject(parent) : QObject(parent)
{ {
m_altCoolDown.setInterval(250);
m_altCoolDown.setSingleShot(true);
m_menubarTimer.setInterval(250);
m_menubarTimer.setSingleShot(false);
connect(&m_menubarTimer, &QTimer::timeout, this, [this] {
auto mainwindow = getMainWindow();
if (mainwindow && mainwindow->m_ui->menubar->isVisible() && config()->get(Config::GUI_HideMenubar).toBool()) {
// If the menu bar is visible with no active menu, hide it
if (!mainwindow->m_ui->menubar->activeAction()) {
mainwindow->m_ui->menubar->setVisible(false);
m_altCoolDown.start();
m_menubarTimer.stop();
}
// Conditions to hide the menubar or stop the timer have not been met
return;
}
// We no longer need the timer
m_menubarTimer.stop();
});
} }
/** /**
@ -2139,6 +2155,8 @@ bool MainWindowEventFilter::eventFilter(QObject* watched, QEvent* event)
auto eventType = event->type(); auto eventType = event->type();
if (eventType == QEvent::MouseButtonPress) { if (eventType == QEvent::MouseButtonPress) {
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
// startSystemMove was introduced in Qt 5.15
auto mouseEvent = dynamic_cast<QMouseEvent*>(event); auto mouseEvent = dynamic_cast<QMouseEvent*>(event);
if (watched == mainWindow->m_ui->menubar) { if (watched == mainWindow->m_ui->menubar) {
if (!mainWindow->m_ui->menubar->actionAt(mouseEvent->pos())) { if (!mainWindow->m_ui->menubar->actionAt(mouseEvent->pos())) {
@ -2156,22 +2174,22 @@ bool MainWindowEventFilter::eventFilter(QObject* watched, QEvent* event)
return true; return true;
} }
} }
} else if (eventType == QEvent::KeyRelease) { #endif
if (watched == mainWindow) { } else if (eventType == QEvent::KeyRelease && watched == mainWindow) {
auto keyEvent = dynamic_cast<QKeyEvent*>(event); auto keyEvent = dynamic_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Alt && !keyEvent->modifiers() if (keyEvent->key() == Qt::Key_Alt && !keyEvent->modifiers() && config()->get(Config::GUI_HideMenubar).toBool()
&& config()->get(Config::GUI_HideMenubar).toBool()) { && !m_altCoolDown.isActive()) {
auto menubar = mainWindow->m_ui->menubar; auto menubar = mainWindow->m_ui->menubar;
menubar->setVisible(!menubar->isVisible()); menubar->setVisible(!menubar->isVisible());
if (menubar->isVisible()) { if (menubar->isVisible()) {
menubar->setActiveAction(mainWindow->m_ui->menuFile->menuAction()); menubar->setActiveAction(mainWindow->m_ui->menuFile->menuAction());
m_menubarTimer.start();
} else {
m_menubarTimer.stop();
} }
return false; return true;
}
} }
} }
return QObject::eventFilter(watched, event); return QObject::eventFilter(watched, event);
} }
#endif

View File

@ -206,7 +206,6 @@ private:
friend class MainWindowEventFilter; friend class MainWindowEventFilter;
}; };
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
class MainWindowEventFilter : public QObject class MainWindowEventFilter : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -214,8 +213,11 @@ class MainWindowEventFilter : public QObject
public: public:
explicit MainWindowEventFilter(QObject* parent); explicit MainWindowEventFilter(QObject* parent);
bool eventFilter(QObject* watched, QEvent* event) override; bool eventFilter(QObject* watched, QEvent* event) override;
private:
QTimer m_menubarTimer;
QTimer m_altCoolDown;
}; };
#endif
/** /**
* Return instance of MainWindow created on app load * Return instance of MainWindow created on app load