From bd449f3226382c9f0e9b54fd0f4aaa15ec09242c Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 5 May 2024 09:46:03 -0400 Subject: [PATCH] Fix issues with locking database * Fix #6593 - force close any modal dialogs associated with a database widget that is being locked. * Partial fix for #721 but doesn't address the problem of needing to save a modified entry or database while locking. * Also improves import dialog behavior if databases(s) lock while it is visible. --- src/gui/DatabaseWidget.cpp | 14 +++++++++++--- src/gui/MainWindow.cpp | 4 +++- src/gui/wizard/ImportWizardPageSelect.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index e38b943ac..250463d3f 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1755,9 +1755,17 @@ bool DatabaseWidget::lock() emit databaseLockRequested(); - // ignore event if we are active and a modal dialog is still open (such as a message box or file dialog) - if (isVisible() && QApplication::activeModalWidget()) { - return false; + // Force close any modal widgets associated with this widget + auto modalWidget = QApplication::activeModalWidget(); + if (modalWidget) { + auto parent = modalWidget->parentWidget(); + while (parent) { + if (parent == this) { + modalWidget->close(); + break; + } + parent = parent->parentWidget(); + } } clipboard()->clearCopiedText(); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 1f1e459e7..c89e08f0b 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -1821,7 +1821,9 @@ void MainWindow::closeModalWindow() void MainWindow::lockDatabasesAfterInactivity() { - m_ui->tabWidget->lockDatabases(); + if (!m_ui->tabWidget->lockDatabases()) { + m_inactivityTimer->activate(); + } } bool MainWindow::isTrayIconEnabled() const diff --git a/src/gui/wizard/ImportWizardPageSelect.cpp b/src/gui/wizard/ImportWizardPageSelect.cpp index 7bca1a39a..05b8f0990 100644 --- a/src/gui/wizard/ImportWizardPageSelect.cpp +++ b/src/gui/wizard/ImportWizardPageSelect.cpp @@ -126,11 +126,17 @@ void ImportWizardPageSelect::updateDatabaseChoices() const auto mainWindow = getMainWindow(); if (mainWindow) { for (auto dbWidget : mainWindow->getOpenDatabases()) { + // Remove all connections + disconnect(dbWidget, nullptr, nullptr, nullptr); + // Skip over locked databases if (dbWidget->isLocked()) { continue; } + connect(dbWidget, &DatabaseWidget::databaseLocked, this, &ImportWizardPageSelect::updateDatabaseChoices); + connect(dbWidget, &DatabaseWidget::databaseModified, this, &ImportWizardPageSelect::updateDatabaseChoices); + // Enable the selection of an existing database m_ui->existingDatabaseRadio->setEnabled(true); m_ui->existingDatabaseRadio->setToolTip(""); @@ -161,6 +167,11 @@ void ImportWizardPageSelect::updateDatabaseChoices() const } } } + + if (m_ui->existingDatabaseChoice->count() == 0) { + m_ui->existingDatabaseRadio->setEnabled(false); + m_ui->newDatabaseRadio->setChecked(true); + } } void ImportWizardPageSelect::chooseImportFile()