add enable_flash_anchor config

It controls whether we need to flash the heading when we scroll to it in
read mode.
This commit is contained in:
Le Tan 2018-03-02 22:36:51 +08:00
parent ba13ac7dc3
commit 2bb2910fec
7 changed files with 72 additions and 3 deletions

View File

@ -464,6 +464,10 @@ VReadEditTab::VReadEditTab(QWidget *p_parent)
zoomFactorLayout->addWidget(m_customWebZoom); zoomFactorLayout->addWidget(m_customWebZoom);
zoomFactorLayout->addWidget(m_webZoomFactorSpin); 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. // Swap file.
m_swapFile = new QCheckBox(tr("Swap file")); m_swapFile = new QCheckBox(tr("Swap file"));
m_swapFile->setToolTip(tr("Automatically save changes to a swap file for backup")); 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(); QVBoxLayout *readLayout = new QVBoxLayout();
readLayout->addLayout(zoomFactorLayout); readLayout->addLayout(zoomFactorLayout);
readLayout->addWidget(m_flashAnchor);
m_readBox->setLayout(readLayout); m_readBox->setLayout(readLayout);
QFormLayout *editLayout = new QFormLayout(); QFormLayout *editLayout = new QFormLayout();
@ -509,6 +514,10 @@ bool VReadEditTab::loadConfiguration()
return false; return false;
} }
if (!loadFlashAnchor()) {
return false;
}
if (!loadSwapFile()) { if (!loadSwapFile()) {
return false; return false;
} }
@ -526,6 +535,10 @@ bool VReadEditTab::saveConfiguration()
return false; return false;
} }
if (!saveFlashAnchor()) {
return false;
}
if (!saveSwapFile()) { if (!saveSwapFile()) {
return false; return false;
} }
@ -567,6 +580,18 @@ bool VReadEditTab::saveWebZoomFactor()
return true; 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() bool VReadEditTab::loadSwapFile()
{ {
m_swapFile->setChecked(g_config->getEnableBackupFile()); m_swapFile->setChecked(g_config->getEnableBackupFile());

View File

@ -74,10 +74,16 @@ private:
void showTipsAboutAutoSave(); void showTipsAboutAutoSave();
bool loadFlashAnchor();
bool saveFlashAnchor();
// Web zoom factor. // Web zoom factor.
QCheckBox *m_customWebZoom; QCheckBox *m_customWebZoom;
QDoubleSpinBox *m_webZoomFactorSpin; QDoubleSpinBox *m_webZoomFactorSpin;
// Web flash anchor.
QCheckBox *m_flashAnchor;
// Swap file. // Swap file.
QCheckBox *m_swapFile; QCheckBox *m_swapFile;

View File

@ -40,6 +40,10 @@ if (typeof VEnableImageCaption == 'undefined') {
VEnableImageCaption = false; VEnableImageCaption = false;
} }
if (typeof VEnableFlashAnchor == 'undefined') {
VEnableFlashAnchor = false;
}
var getUrlScheme = function(url) { var getUrlScheme = function(url) {
var idx = url.indexOf(':'); var idx = url.indexOf(':');
if (idx > -1) { if (idx > -1) {
@ -132,7 +136,11 @@ var clearHighlightedAnchor = function() {
} }
}; };
var highlightAnchor = function(anchor) { var flashAnchor = function(anchor) {
if (!VEnableFlashAnchor) {
return;
}
clearHighlightedAnchor(); clearHighlightedAnchor();
anchor.classList.add(VHighlightedAnchorClass); anchor.classList.add(VHighlightedAnchorClass);
}; };
@ -151,7 +159,7 @@ var scrollToAnchor = function(anchor) {
var anc = document.getElementById(anchor); var anc = document.getElementById(anchor);
if (anc != null) { if (anc != null) {
anc.scrollIntoView(); anc.scrollIntoView();
highlightAnchor(anc); flashAnchor(anc);
var headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); var headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6");
for (var i = 0; i < headers.length; ++i) { for (var i = 0; i < headers.length; ++i) {
@ -935,7 +943,7 @@ var jumpTitle = function(forward, relativeLevel, repeat) {
// Disable scroll temporarily. // Disable scroll temporarily.
g_muteScroll = true; g_muteScroll = true;
headers[targetIdx].scrollIntoView(); headers[targetIdx].scrollIntoView();
highlightAnchor(headers[targetIdx]); flashAnchor(headers[targetIdx]);
currentHeaderIdx = targetIdx; currentHeaderIdx = targetIdx;
content.setHeader(headers[targetIdx].getAttribute("id")); content.setHeader(headers[targetIdx].getAttribute("id"));
setTimeout("g_muteScroll = false", 100); setTimeout("g_muteScroll = false", 100);

View File

@ -246,6 +246,8 @@ styles_to_inline_when_copied=all$border:color:display:font-family:font-size:font
; j - fix XHTML tag like <img> and <br> ; j - fix XHTML tag like <img> and <br>
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 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] [shortcuts]
; Define shortcuts here, with each item in the form "operation=keysequence". ; Define shortcuts here, with each item in the form "operation=keysequence".
; Leave keysequence empty to disable the shortcut of an operation. ; Leave keysequence empty to disable the shortcut of an operation.

View File

@ -695,6 +695,10 @@ QString VUtils::generateHtmlTemplate(const QString &p_template,
"<script>var VEnableHighlightLineNumber = true;</script>\n"; "<script>var VEnableHighlightLineNumber = true;</script>\n";
} }
if (g_config->getEnableFlashAnchor()) {
extraFile += "<script>var VEnableFlashAnchor = true;</script>\n";
}
extraFile += "<script>var VStylesToInline = '" + g_config->getStylesToInlineWhenCopied() + "';</script>\n"; extraFile += "<script>var VStylesToInline = '" + g_config->getStylesToInlineWhenCopied() + "';</script>\n";
QString htmlTemplate(p_template); QString htmlTemplate(p_template);

View File

@ -289,6 +289,9 @@ void VConfigManager::initialize()
m_singleClickClosePreviousTab = getConfigFromSettings("global", m_singleClickClosePreviousTab = getConfigFromSettings("global",
"single_click_close_previous_tab").toBool(); "single_click_close_previous_tab").toBool();
m_enableFlashAnchor = getConfigFromSettings("web",
"enable_flash_anchor").toBool();
} }
void VConfigManager::initSettings() void VConfigManager::initSettings()

View File

@ -460,6 +460,9 @@ public:
QString getWkhtmltopdfArgs() const; QString getWkhtmltopdfArgs() const;
void setWkhtmltopdfArgs(const QString &p_args); void setWkhtmltopdfArgs(const QString &p_args);
bool getEnableFlashAnchor() const;
void setEnableFlashAnchor(bool p_enabled);
private: private:
// Look up a config from user and default settings. // Look up a config from user and default settings.
QVariant getConfigFromSettings(const QString &section, const QString &key) const; QVariant getConfigFromSettings(const QString &section, const QString &key) const;
@ -857,6 +860,9 @@ private:
// Single click to open file and then close previous tab. // Single click to open file and then close previous tab.
bool m_singleClickClosePreviousTab; bool m_singleClickClosePreviousTab;
// Whether flash anchor in read mode.
bool m_enableFlashAnchor;
// The name of the config file in each directory, obsolete. // The name of the config file in each directory, obsolete.
// Use c_dirConfigFile instead. // Use c_dirConfigFile instead.
static const QString c_obsoleteDirConfigFile; static const QString c_obsoleteDirConfigFile;
@ -2111,4 +2117,19 @@ inline void VConfigManager::setWkhtmltopdfArgs(const QString &p_file)
{ {
setConfigToSettings("export", "wkhtmltopdfArgs", 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 #endif // VCONFIGMANAGER_H