Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/DatabaseWidget.cpp')
-rw-r--r--src/gui/DatabaseWidget.cpp39
1 files changed, 22 insertions, 17 deletions
diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp
index 8728c331f..8cfc40815 100644
--- a/src/gui/DatabaseWidget.cpp
+++ b/src/gui/DatabaseWidget.cpp
@@ -78,9 +78,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
, m_previewView(new EntryPreviewWidget(this))
, m_previewSplitter(new QSplitter(m_mainWidget))
, m_searchingLabel(new QLabel(this))
-#ifdef WITH_XC_KEESHARE
, m_shareLabel(new QLabel(this))
-#endif
, m_csvImportWizard(new CsvImportWizard(this))
, m_editEntryWidget(new EditEntryWidget(this))
, m_editGroupWidget(new EditGroupWidget(this))
@@ -89,6 +87,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
, m_databaseOpenWidget(new DatabaseOpenWidget(this))
, m_keepass1OpenWidget(new KeePass1OpenWidget(this))
, m_groupView(new GroupView(m_db.data(), m_mainSplitter))
+ , m_saveAttempts(0)
, m_fileWatcher(new DelayingFileWatcher(this))
{
m_messageWidget->setHidden(true);
@@ -260,12 +259,11 @@ bool DatabaseWidget::isSearchActive() const
bool DatabaseWidget::isEditWidgetModified() const
{
if (currentWidget() == m_editEntryWidget) {
- return m_editEntryWidget->hasBeenModified();
- } else {
- // other edit widget don't have a hasBeenModified() method yet
- // assume that they already have been modified
- return true;
+ return m_editEntryWidget->isModified();
+ } else if (currentWidget() == m_editGroupWidget) {
+ return m_editGroupWidget->isModified();
}
+ return false;
}
QList<int> DatabaseWidget::mainSplitterSizes() const
@@ -859,6 +857,7 @@ void DatabaseWidget::loadDatabase(bool accepted)
replaceDatabase(openWidget->database());
switchToMainView();
m_fileWatcher->restart();
+ m_saveAttempts = 0;
emit databaseUnlocked();
} else {
m_fileWatcher->stop();
@@ -1112,7 +1111,9 @@ void DatabaseWidget::search(const QString& searchtext)
}
m_searchingLabel->setVisible(true);
+#ifdef WITH_XC_KEESHARE
m_shareLabel->setVisible(false);
+#endif
emit searchModeActivated();
}
@@ -1245,7 +1246,7 @@ bool DatabaseWidget::lock()
clipboard()->clearCopiedText();
- if (currentMode() == DatabaseWidget::Mode::EditMode) {
+ if (isEditWidgetModified()) {
auto result = MessageBox::question(this,
tr("Lock Database?"),
tr("You are editing an entry. Discard changes and lock anyway?"),
@@ -1510,7 +1511,7 @@ EntryView* DatabaseWidget::entryView()
* @param attempt current save attempt or -1 to disable attempts
* @return true on success
*/
-bool DatabaseWidget::save(int attempt)
+bool DatabaseWidget::save()
{
// Never allow saving a locked database; it causes corruption
Q_ASSERT(!isLocked());
@@ -1525,6 +1526,8 @@ bool DatabaseWidget::save(int attempt)
}
blockAutoReload(true);
+ ++m_saveAttempts;
+
// TODO: Make this async, but lock out the database widget to prevent re-entrance
bool useAtomicSaves = config()->get("UseAtomicSaves", true).toBool();
QString errorMessage;
@@ -1532,14 +1535,11 @@ bool DatabaseWidget::save(int attempt)
blockAutoReload(false);
if (ok) {
+ m_saveAttempts = 0;
return true;
}
- if (attempt >= 0 && attempt <= 2) {
- return save(attempt + 1);
- }
-
- if (attempt > 2 && useAtomicSaves) {
+ if (m_saveAttempts > 2 && useAtomicSaves) {
// Saving failed 3 times, issue a warning and attempt to resolve
auto result = MessageBox::question(this,
tr("Disable safe saves?"),
@@ -1550,11 +1550,15 @@ bool DatabaseWidget::save(int attempt)
MessageBox::Disable);
if (result == MessageBox::Disable) {
config()->set("UseAtomicSaves", false);
- return save(attempt + 1);
+ return save();
}
}
- showMessage(tr("Writing the database failed.\n%1").arg(errorMessage), MessageWidget::Error);
+ showMessage(tr("Writing the database failed: %1").arg(errorMessage),
+ MessageWidget::Error,
+ true,
+ MessageWidget::LongAutoHideTimeout);
+
return false;
}
@@ -1583,8 +1587,9 @@ bool DatabaseWidget::saveAs()
// Ensure we don't recurse back into this function
m_db->setReadOnly(false);
m_db->setFilePath(newFilePath);
+ m_saveAttempts = 0;
- if (!save(-1)) {
+ if (!save()) {
// Failed to save, try again
continue;
}