diff --git a/src/dialog/vsettingsdialog.cpp b/src/dialog/vsettingsdialog.cpp index dae79c72..4827cb7d 100644 --- a/src/dialog/vsettingsdialog.cpp +++ b/src/dialog/vsettingsdialog.cpp @@ -1,6 +1,8 @@ #include "vsettingsdialog.h" #include #include +#include + #include "vconfigmanager.h" #include "utils/vutils.h" #include "vconstants.h" @@ -419,29 +421,66 @@ VReadEditTab::VReadEditTab(QWidget *p_parent) m_webZoomFactorSpin->setMinimum(c_webZoomFactorMin); m_webZoomFactorSpin->setSingleStep(0.25); connect(m_customWebZoom, &QCheckBox::stateChanged, - this, [this](int p_state){ + this, [this](int p_state) { this->m_webZoomFactorSpin->setEnabled(p_state == Qt::Checked); }); QHBoxLayout *zoomFactorLayout = new QHBoxLayout(); zoomFactorLayout->addWidget(m_customWebZoom); zoomFactorLayout->addWidget(m_webZoomFactorSpin); + // Swap file. + m_swapFile = new QCheckBox(tr("Swap file")); + m_swapFile->setToolTip(tr("Automatically save changes to a swap file for backup")); + connect(m_swapFile, &QCheckBox::stateChanged, + this, &VReadEditTab::showTipsAboutAutoSave); + + // Auto save. + m_autoSave = new QCheckBox(tr("Auto save")); + m_autoSave->setToolTip(tr("Automatically save the note when editing")); + connect(m_autoSave, &QCheckBox::stateChanged, + this, &VReadEditTab::showTipsAboutAutoSave); + QVBoxLayout *readLayout = new QVBoxLayout(); readLayout->addLayout(zoomFactorLayout); m_readBox->setLayout(readLayout); + QFormLayout *editLayout = new QFormLayout(); + editLayout->addRow(m_swapFile); + editLayout->addRow(m_autoSave); + m_editBox->setLayout(editLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addWidget(m_readBox); mainLayout->addWidget(m_editBox); setLayout(mainLayout); } +void VReadEditTab::showTipsAboutAutoSave() +{ + if (m_autoSave->isChecked() && m_swapFile->isChecked()) { + // Show a tooltip. + QPoint pos = m_editBox->mapToGlobal(QPoint(0, 0)); + QToolTip::showText(pos, + tr("It's recommended to enable \"Swap file\" " + "or \"Auto save\", not both"), + m_editBox); + } +} + bool VReadEditTab::loadConfiguration() { if (!loadWebZoomFactor()) { return false; } + if (!loadSwapFile()) { + return false; + } + + if (!loadAutoSave()) { + return false; + } + return true; } @@ -451,6 +490,14 @@ bool VReadEditTab::saveConfiguration() return false; } + if (!saveSwapFile()) { + return false; + } + + if (!saveAutoSave()) { + return false; + } + return true; } @@ -484,6 +531,30 @@ bool VReadEditTab::saveWebZoomFactor() return true; } +bool VReadEditTab::loadSwapFile() +{ + m_swapFile->setChecked(g_config->getEnableBackupFile()); + return true; +} + +bool VReadEditTab::saveSwapFile() +{ + g_config->setEnableBackupFile(m_swapFile->isChecked()); + return true; +} + +bool VReadEditTab::loadAutoSave() +{ + m_autoSave->setChecked(g_config->getEnableAutoSave()); + return true; +} + +bool VReadEditTab::saveAutoSave() +{ + g_config->setEnableAutoSave(m_autoSave->isChecked()); + return true; +} + VNoteManagementTab::VNoteManagementTab(QWidget *p_parent) : QWidget(p_parent) { diff --git a/src/dialog/vsettingsdialog.h b/src/dialog/vsettingsdialog.h index bdafef04..8f93d0c4 100644 --- a/src/dialog/vsettingsdialog.h +++ b/src/dialog/vsettingsdialog.h @@ -66,10 +66,24 @@ private: bool loadWebZoomFactor(); bool saveWebZoomFactor(); + bool loadSwapFile(); + bool saveSwapFile(); + + bool loadAutoSave(); + bool saveAutoSave(); + + void showTipsAboutAutoSave(); + // Web zoom factor. QCheckBox *m_customWebZoom; QDoubleSpinBox *m_webZoomFactorSpin; + // Swap file. + QCheckBox *m_swapFile; + + // Auto save. + QCheckBox *m_autoSave; + QGroupBox *m_readBox; QGroupBox *m_editBox; }; diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index c654d8cb..d4efceac 100644 --- a/src/resources/vnote.ini +++ b/src/resources/vnote.ini @@ -165,6 +165,9 @@ startup_pages= ; Timer interval to check file modification or save file to tmp file in milliseconds file_timer_interval=2000 +; Whether enable auto save file +enable_auto_save=false + ; Directory for the backup file ; A directory "." means to put the backup file in the same directory as the edited file backup_directory=. diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp index 234ba4a9..2b027213 100644 --- a/src/vconfigmanager.cpp +++ b/src/vconfigmanager.cpp @@ -276,9 +276,6 @@ void VConfigManager::initialize() m_backupExtension = "."; } - m_enableBackupFile = getConfigFromSettings("global", - "enable_backup_file").toBool(); - m_vimExemptionKeys = getConfigFromSettings("global", "vim_exemption_keys").toString(); diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h index 48185af4..f959a79c 100644 --- a/src/vconfigmanager.h +++ b/src/vconfigmanager.h @@ -406,6 +406,7 @@ public: // Whether backup file is enabled. bool getEnableBackupFile() const; + void setEnableBackupFile(bool p_enabled); // Get defined external editors. QVector getExternalEditors() const; @@ -442,6 +443,9 @@ public: bool getEnableWildCardInSimpleSearch() const; + bool getEnableAutoSave() const; + void setEnableAutoSave(bool p_enabled); + private: // Look up a config from user and default settings. QVariant getConfigFromSettings(const QString §ion, const QString &key) const; @@ -791,9 +795,6 @@ private: // Extension of the backup file. QString m_backupExtension; - // Whether enable backup file. - bool m_enableBackupFile; - // Skipped keys in Vim mode. // c: Ctrl+C // v: Ctrl+V @@ -1912,7 +1913,13 @@ inline const QString &VConfigManager::getBackupExtension() const inline bool VConfigManager::getEnableBackupFile() const { - return m_enableBackupFile; + return getConfigFromSettings("global", + "enable_backup_file").toBool(); +} + +inline void VConfigManager::setEnableBackupFile(bool p_enabled) +{ + setConfigToSettings("global", "enable_backup_file", p_enabled); } inline const QString &VConfigManager::getVimExemptionKeys() const @@ -2054,4 +2061,15 @@ inline bool VConfigManager::getEnableWildCardInSimpleSearch() const return getConfigFromSettings("global", "enable_wildcard_in_simple_search").toBool(); } + +inline bool VConfigManager::getEnableAutoSave() const +{ + return getConfigFromSettings("global", + "enable_auto_save").toBool(); +} + +inline void VConfigManager::setEnableAutoSave(bool p_enabled) +{ + setConfigToSettings("global", "enable_auto_save", p_enabled); +} #endif // VCONFIGMANAGER_H diff --git a/src/veditarea.cpp b/src/veditarea.cpp index 4fa50062..d445401e 100644 --- a/src/veditarea.cpp +++ b/src/veditarea.cpp @@ -62,6 +62,8 @@ VEditArea::VEditArea(QWidget *parent) this, &VEditArea::handleFileTimerTimeout); timer->start(); + + m_autoSave = g_config->getEnableAutoSave(); } void VEditArea::setupUI() @@ -184,6 +186,9 @@ VEditTab *VEditArea::openFile(VFile *p_file, OpenFileMode p_mode, bool p_forceMo return NULL; } + // Update auto save settings. + m_autoSave = g_config->getEnableAutoSave(); + // If it is DocType::Unknown, open it using system default method. if (p_file->getDocType() == DocType::Unknown) { QUrl url = QUrl::fromLocalFile(p_file->fetchPath()); @@ -1074,14 +1079,15 @@ void VEditArea::recordClosedFile(const VFileSessionInfo &p_file) } void VEditArea::handleFileTimerTimeout() -{ - checkFileChangeOutside(); -} - -void VEditArea::checkFileChangeOutside() { int nrWin = splitter->count(); for (int i = 0; i < nrWin; ++i) { - getWindow(i)->checkFileChangeOutside(); + // Check whether opened files have been changed outside. + VEditWindow *win = getWindow(i); + win->checkFileChangeOutside(); + + if (m_autoSave) { + win->saveAll(); + } } } diff --git a/src/veditarea.h b/src/veditarea.h index c41501c6..9900f0d8 100644 --- a/src/veditarea.h +++ b/src/veditarea.h @@ -172,11 +172,7 @@ private: // Init targets for Captain mode. void registerCaptainTargets(); - // Check whether opened files have been changed outside. - void checkFileChangeOutside(); - // Captain mode functions. - // Activate tab @p_idx. static bool activateTabByCaptain(void *p_target, void *p_data, int p_idx); @@ -216,6 +212,9 @@ private: // Last closed files stack. QStack m_lastClosedFiles; + + // Whether auto save files. + bool m_autoSave; }; inline VEditWindow* VEditArea::getWindow(int windowIndex) const diff --git a/src/veditwindow.cpp b/src/veditwindow.cpp index 66f19b77..e9ed0b32 100644 --- a/src/veditwindow.cpp +++ b/src/veditwindow.cpp @@ -1157,6 +1157,14 @@ void VEditWindow::checkFileChangeOutside() } } +void VEditWindow::saveAll() +{ + int nrTab = count(); + for (int i = 0; i < nrTab; ++i) { + getTab(i)->saveFile(); + } +} + void VEditWindow::tabRequestToClose(VEditTab *p_tab) { bool ok = p_tab->closeFile(false); diff --git a/src/veditwindow.h b/src/veditwindow.h index 3fe352ff..0226b100 100644 --- a/src/veditwindow.h +++ b/src/veditwindow.h @@ -80,6 +80,9 @@ public: // Check whether opened files have been changed outside. void checkFileChangeOutside(); + // Auto save file. + void saveAll(); + protected: void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;