diff --git a/src/dialog/vsettingsdialog.cpp b/src/dialog/vsettingsdialog.cpp index 897e23c7..b30ee0dc 100644 --- a/src/dialog/vsettingsdialog.cpp +++ b/src/dialog/vsettingsdialog.cpp @@ -464,6 +464,10 @@ VReadEditTab::VReadEditTab(QWidget *p_parent) zoomFactorLayout->addWidget(m_customWebZoom); zoomFactorLayout->addWidget(m_webZoomFactorSpin); + // Web flash anchor. + m_flashAnchor = new QCheckBox(tr("Flash current heading")); + m_flashAnchor->setToolTip(tr("Flash current heading on change")); + // Swap file. m_swapFile = new QCheckBox(tr("Swap file")); m_swapFile->setToolTip(tr("Automatically save changes to a swap file for backup")); @@ -478,6 +482,7 @@ VReadEditTab::VReadEditTab(QWidget *p_parent) QVBoxLayout *readLayout = new QVBoxLayout(); readLayout->addLayout(zoomFactorLayout); + readLayout->addWidget(m_flashAnchor); m_readBox->setLayout(readLayout); QFormLayout *editLayout = new QFormLayout(); @@ -509,6 +514,10 @@ bool VReadEditTab::loadConfiguration() return false; } + if (!loadFlashAnchor()) { + return false; + } + if (!loadSwapFile()) { return false; } @@ -526,6 +535,10 @@ bool VReadEditTab::saveConfiguration() return false; } + if (!saveFlashAnchor()) { + return false; + } + if (!saveSwapFile()) { return false; } @@ -567,6 +580,18 @@ bool VReadEditTab::saveWebZoomFactor() return true; } +bool VReadEditTab::loadFlashAnchor() +{ + m_flashAnchor->setChecked(g_config->getEnableFlashAnchor()); + return true; +} + +bool VReadEditTab::saveFlashAnchor() +{ + g_config->setEnableFlashAnchor(m_flashAnchor->isChecked()); + return true; +} + bool VReadEditTab::loadSwapFile() { m_swapFile->setChecked(g_config->getEnableBackupFile()); diff --git a/src/dialog/vsettingsdialog.h b/src/dialog/vsettingsdialog.h index 1be0bd13..4d2bf86a 100644 --- a/src/dialog/vsettingsdialog.h +++ b/src/dialog/vsettingsdialog.h @@ -74,10 +74,16 @@ private: void showTipsAboutAutoSave(); + bool loadFlashAnchor(); + bool saveFlashAnchor(); + // Web zoom factor. QCheckBox *m_customWebZoom; QDoubleSpinBox *m_webZoomFactorSpin; + // Web flash anchor. + QCheckBox *m_flashAnchor; + // Swap file. QCheckBox *m_swapFile; diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js index 7cff65ab..93f6a0ad 100644 --- a/src/resources/markdown_template.js +++ b/src/resources/markdown_template.js @@ -40,6 +40,10 @@ if (typeof VEnableImageCaption == 'undefined') { VEnableImageCaption = false; } +if (typeof VEnableFlashAnchor == 'undefined') { + VEnableFlashAnchor = false; +} + var getUrlScheme = function(url) { var idx = url.indexOf(':'); if (idx > -1) { @@ -132,7 +136,11 @@ var clearHighlightedAnchor = function() { } }; -var highlightAnchor = function(anchor) { +var flashAnchor = function(anchor) { + if (!VEnableFlashAnchor) { + return; + } + clearHighlightedAnchor(); anchor.classList.add(VHighlightedAnchorClass); }; @@ -151,7 +159,7 @@ var scrollToAnchor = function(anchor) { var anc = document.getElementById(anchor); if (anc != null) { anc.scrollIntoView(); - highlightAnchor(anc); + flashAnchor(anc); var headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); for (var i = 0; i < headers.length; ++i) { @@ -935,7 +943,7 @@ var jumpTitle = function(forward, relativeLevel, repeat) { // Disable scroll temporarily. g_muteScroll = true; headers[targetIdx].scrollIntoView(); - highlightAnchor(headers[targetIdx]); + flashAnchor(headers[targetIdx]); currentHeaderIdx = targetIdx; content.setHeader(headers[targetIdx].getAttribute("id")); setTimeout("g_muteScroll = false", 100); diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index 8c014fcb..bae91dcb 100644 --- a/src/resources/vnote.ini +++ b/src/resources/vnote.ini @@ -246,6 +246,8 @@ styles_to_inline_when_copied=all$border:color:display:font-family:font-size:font ; j - fix XHTML tag like and
copy_targets="Without Background"$s:b(mark):c:i:x,Evernote$e:p:b(mark|pre):c(pre):g:m:a:x:n:j,OneNote$e:b(mark):c:i:m:a:x,"Microsoft Word"$s:p:b(mark|pre):c(pre):i:m:a:x,"WeChat Public Account"$s:p:b(mark|pre):c(pre):g:m:x:n:f,"Web Editor"$s:p:b(mark|pre):c(pre):m:x:n,"Raw HTML"$r:x +enable_flash_anchor=true + [shortcuts] ; Define shortcuts here, with each item in the form "operation=keysequence". ; Leave keysequence empty to disable the shortcut of an operation. diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index 7451b3d8..bcc60ff4 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -695,6 +695,10 @@ QString VUtils::generateHtmlTemplate(const QString &p_template, "\n"; } + if (g_config->getEnableFlashAnchor()) { + extraFile += "\n"; + } + extraFile += "\n"; QString htmlTemplate(p_template); diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp index 680e5003..a5edcb1c 100644 --- a/src/vconfigmanager.cpp +++ b/src/vconfigmanager.cpp @@ -289,6 +289,9 @@ void VConfigManager::initialize() m_singleClickClosePreviousTab = getConfigFromSettings("global", "single_click_close_previous_tab").toBool(); + + m_enableFlashAnchor = getConfigFromSettings("web", + "enable_flash_anchor").toBool(); } void VConfigManager::initSettings() diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h index 872f76f2..24aaa023 100644 --- a/src/vconfigmanager.h +++ b/src/vconfigmanager.h @@ -460,6 +460,9 @@ public: QString getWkhtmltopdfArgs() const; void setWkhtmltopdfArgs(const QString &p_args); + bool getEnableFlashAnchor() const; + void setEnableFlashAnchor(bool p_enabled); + private: // Look up a config from user and default settings. QVariant getConfigFromSettings(const QString §ion, const QString &key) const; @@ -857,6 +860,9 @@ private: // Single click to open file and then close previous tab. bool m_singleClickClosePreviousTab; + // Whether flash anchor in read mode. + bool m_enableFlashAnchor; + // The name of the config file in each directory, obsolete. // Use c_dirConfigFile instead. static const QString c_obsoleteDirConfigFile; @@ -2111,4 +2117,19 @@ inline void VConfigManager::setWkhtmltopdfArgs(const QString &p_file) { setConfigToSettings("export", "wkhtmltopdfArgs", p_file); } + +inline bool VConfigManager::getEnableFlashAnchor() const +{ + return m_enableFlashAnchor; +} + +inline void VConfigManager::setEnableFlashAnchor(bool p_enabled) +{ + if (p_enabled == m_enableFlashAnchor) { + return; + } + + m_enableFlashAnchor = p_enabled; + setConfigToSettings("web", "enable_flash_anchor", m_enableFlashAnchor); +} #endif // VCONFIGMANAGER_H