diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index dcc04e8d17..440df2afc3 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1535,7 +1535,7 @@ void DatabaseWidget::onDatabaseModified() refreshSearch(); int autosaveDelayMs = m_db->metadata()->autosaveDelayMin() * 60 * 1000; // min to msec for QTimer bool autosaveAfterEveryChangeConfig = config()->get(Config::AutoSaveAfterEveryChange).toBool(); - if (m_autosaveTimer->isActive() || (autosaveDelayMs > 0 && autosaveAfterEveryChangeConfig)) { + if (autosaveDelayMs > 0 && autosaveAfterEveryChangeConfig) { // reset delay when modified m_autosaveTimer->start(autosaveDelayMs); return; @@ -1550,6 +1550,12 @@ void DatabaseWidget::onDatabaseModified() void DatabaseWidget::onAutosaveDelayTimeout() { + const bool isAutosaveDelayEnabled = m_db->metadata()->autosaveDelayMin() > 0; + const bool autosaveAfterEveryChangeConfig = config()->get(Config::AutoSaveAfterEveryChange).toBool(); + if (!(isAutosaveDelayEnabled && autosaveAfterEveryChangeConfig)) { + // User might disable the delay/autosave while the timer is running + return; + } if (!m_blockAutoSave) { save(); } else { diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 37ac9497c7..35caeb98de 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -1556,7 +1556,43 @@ void TestGui::testDatabaseSettings() m_dbWidget->triggerAutosaveTimer(); QTRY_COMPARE(writeDbSignalSpy.count(), 1); - // 4 cleanup + // 4 Test no delay when disabled autosave or autosaveDelay + // 4.a) create new entry + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode); + QTest::keyClicks(titleEdit, "Test autosaveDelay 3"); + + // 4.b) Save changes + editEntryWidget->setCurrentPage(0); + editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + + // 4.c) Start timer + Tools::wait(150); // due to modify timer + + // 4.d) Disable autosave + config()->set(Config::AutoSaveAfterEveryChange, false); + + // 4.e) Make sure changes are not saved + m_dbWidget->triggerAutosaveTimer(); + QTRY_COMPARE(writeDbSignalSpy.count(), 1); + + // 4.f) Repeat for autosaveDelay + config()->set(Config::AutoSaveAfterEveryChange, true); + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode); + QTest::keyClicks(titleEdit, "Test autosaveDelay 4"); + editEntryWidget->setCurrentPage(0); + editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + Tools::wait(150); // due to modify timer + m_db->metadat()->setAutosaveDelayMin(0); + + // 4.g) Make sure changes are not saved + m_dbWidget->triggerAutosaveTimer(); + QTRY_COMPARE(writeDbSignalSpy.count(), 1); + + // 5 Cleanup config()->set(Config::AutoSaveAfterEveryChange, false); }