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