Prevent reloading database while editing an entry or group
* Fix #3933 and fix #3857. Interaction with entries and groups is disabled while the database is being reloaded or saved to prevent changes from occurring. Prevent the database from being reloading if an entry or group is currently being edited. * Fix #3941 - Only notify components when the database file actually changes (determined by checksum). This prevents spurious merge requests when the file is merely touched by another service (e.g., DropBox). * Fix code format of ElidedLabel.cpp
This commit is contained in:
@@ -275,6 +275,11 @@ bool DatabaseWidget::isEntryEditActive() const
|
||||
return currentWidget() == m_editEntryWidget;
|
||||
}
|
||||
|
||||
bool DatabaseWidget::isGroupEditActive() const
|
||||
{
|
||||
return currentWidget() == m_editGroupWidget;
|
||||
}
|
||||
|
||||
bool DatabaseWidget::isEditWidgetModified() const
|
||||
{
|
||||
if (currentWidget() == m_editEntryWidget) {
|
||||
@@ -387,6 +392,8 @@ void DatabaseWidget::createEntry()
|
||||
|
||||
void DatabaseWidget::replaceDatabase(QSharedPointer<Database> db)
|
||||
{
|
||||
Q_ASSERT(!isEntryEditActive() && !isGroupEditActive());
|
||||
|
||||
// Save off new parent UUID which will be valid when creating a new entry
|
||||
QUuid newParentUuid;
|
||||
if (m_newParent) {
|
||||
@@ -1421,7 +1428,8 @@ bool DatabaseWidget::lock()
|
||||
|
||||
void DatabaseWidget::reloadDatabaseFile()
|
||||
{
|
||||
if (!m_db || isLocked()) {
|
||||
// Ignore reload if we are locked or currently editing an entry or group
|
||||
if (!m_db || isLocked() || isEntryEditActive() || isGroupEditActive()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1441,6 +1449,11 @@ void DatabaseWidget::reloadDatabaseFile()
|
||||
}
|
||||
}
|
||||
|
||||
// Lock out interactions
|
||||
m_entryView->setDisabled(true);
|
||||
m_groupView->setDisabled(true);
|
||||
QApplication::processEvents();
|
||||
|
||||
QString error;
|
||||
auto db = QSharedPointer<Database>::create(m_db->filePath());
|
||||
if (db->open(database()->key(), &error)) {
|
||||
@@ -1480,6 +1493,10 @@ void DatabaseWidget::reloadDatabaseFile()
|
||||
// Mark db as modified since existing data may differ from file or file was deleted
|
||||
m_db->markAsModified();
|
||||
}
|
||||
|
||||
// Return control
|
||||
m_entryView->setDisabled(false);
|
||||
m_groupView->setDisabled(false);
|
||||
}
|
||||
|
||||
int DatabaseWidget::numberOfSelectedEntries() const
|
||||
@@ -1620,11 +1637,20 @@ bool DatabaseWidget::save()
|
||||
m_blockAutoSave = true;
|
||||
++m_saveAttempts;
|
||||
|
||||
// TODO: Make this async, but lock out the database widget to prevent re-entrance
|
||||
// TODO: Make this async
|
||||
// Lock out interactions
|
||||
m_entryView->setDisabled(true);
|
||||
m_groupView->setDisabled(true);
|
||||
QApplication::processEvents();
|
||||
|
||||
bool useAtomicSaves = config()->get("UseAtomicSaves", true).toBool();
|
||||
QString errorMessage;
|
||||
bool ok = m_db->save(&errorMessage, useAtomicSaves, config()->get("BackupBeforeSave").toBool());
|
||||
|
||||
// Return control
|
||||
m_entryView->setDisabled(false);
|
||||
m_groupView->setDisabled(false);
|
||||
|
||||
if (ok) {
|
||||
m_saveAttempts = 0;
|
||||
m_blockAutoSave = false;
|
||||
|
||||
Reference in New Issue
Block a user