diff --git a/src/renderer/components/SvgIcon.vue b/src/renderer/components/SvgIcon.vue
index 136e2e01..cb474fef 100644
--- a/src/renderer/components/SvgIcon.vue
+++ b/src/renderer/components/SvgIcon.vue
@@ -40,6 +40,7 @@ export default defineComponent({
'eye-regular': '',
'text-width-solid': '',
'keyboard-solid': '',
+ 'columns-solid': '',
}
const name = props.name!
diff --git a/src/renderer/plugins/status-bar-control-center.ts b/src/renderer/plugins/status-bar-control-center.ts
index 58cfb986..3e350494 100644
--- a/src/renderer/plugins/status-bar-control-center.ts
+++ b/src/renderer/plugins/status-bar-control-center.ts
@@ -46,6 +46,15 @@ export default {
ctx.layout.toggleView()
}
},
+ {
+ type: 'btn',
+ icon: 'columns-solid',
+ title: ctx.i18n.t('control-center.switch.sync-scroll'),
+ checked: ctx.store.state.syncScroll,
+ onClick: () => {
+ ctx.view.toggleSyncScroll()
+ }
+ },
{
type: 'btn',
icon: 'paint-roller',
diff --git a/src/renderer/services/view.ts b/src/renderer/services/view.ts
index 541482bd..058160df 100644
--- a/src/renderer/services/view.ts
+++ b/src/renderer/services/view.ts
@@ -12,7 +12,7 @@ import { switchDoc } from './document'
export type MenuItem = Components.ContextMenu.Item
export type BuildContextMenu = (items: MenuItem[], e: MouseEvent) => void
-let enableSyncScroll = true
+let tmpEnableSyncScroll = true
let syncScrollTimer: any
const contextMenuFunList: BuildContextMenu[] = []
@@ -172,8 +172,15 @@ export function exitPresent () {
* @param flag
*/
export function toggleAutoPreview (flag?: boolean) {
- const showXterm = store.state.autoPreview
- store.commit('setAutoPreview', typeof flag === 'boolean' ? flag : !showXterm)
+ store.commit('setAutoPreview', typeof flag === 'boolean' ? flag : !store.state.autoPreview)
+}
+
+/**
+ * Toggle sync scroll.
+ * @param flag
+ */
+export function toggleSyncScroll (flag?: boolean) {
+ store.commit('setSyncScroll', typeof flag === 'boolean' ? flag : !store.state.syncScroll)
}
/**
@@ -204,7 +211,7 @@ export function getContextMenuItems (e: MouseEvent) {
* @returns
*/
export function getEnableSyncScroll () {
- return enableSyncScroll
+ return tmpEnableSyncScroll && store.state.syncScroll
}
/**
@@ -214,10 +221,10 @@ export function getEnableSyncScroll () {
*/
export async function disableSyncScrollAwhile (fn: Function, timeout = 500) {
clearTimeout(syncScrollTimer)
- enableSyncScroll = false
+ tmpEnableSyncScroll = false
await fn()
syncScrollTimer = setTimeout(() => {
- enableSyncScroll = true
+ tmpEnableSyncScroll = true
}, timeout)
}
diff --git a/src/renderer/support/store.ts b/src/renderer/support/store.ts
index 0807242d..6bf8c1df 100644
--- a/src/renderer/support/store.ts
+++ b/src/renderer/support/store.ts
@@ -12,6 +12,7 @@ export const initState = {
showEditor: storage.get('showEditor', true),
showXterm: false,
autoPreview: true,
+ syncScroll: true,
showSetting: false,
showExport: false,
showControlCenter: false,
@@ -74,6 +75,9 @@ export default createStore({
setIsFullscreen (state, data) {
state.isFullscreen = data
},
+ setSyncScroll (state, data) {
+ state.syncScroll = data
+ },
setAutoPreview (state, data) {
state.autoPreview = data
},
diff --git a/src/share/i18n/languages/en.ts b/src/share/i18n/languages/en.ts
index 40e2634f..69e54a91 100644
--- a/src/share/i18n/languages/en.ts
+++ b/src/share/i18n/languages/en.ts
@@ -411,7 +411,8 @@ const data = {
'side-bar': 'Side Bar %s',
'editor': 'Editor %s',
'view': 'Editor %s',
- 'sync-rendering': 'Synchronous rendering',
+ 'sync-scroll': 'Synchronous Scrolling',
+ 'sync-rendering': 'Synchronous Rendering',
'word-wrap': 'Word Wrap %s',
'typewriter-mode': 'Typewriter Mode',
},
diff --git a/src/share/i18n/languages/zh-CN.ts b/src/share/i18n/languages/zh-CN.ts
index 46b77c70..aea8b089 100644
--- a/src/share/i18n/languages/zh-CN.ts
+++ b/src/share/i18n/languages/zh-CN.ts
@@ -412,6 +412,7 @@ const data: BaseLanguage = {
'side-bar': '侧栏 %s',
'editor': '编辑器 %s',
'view': '预览 %s',
+ 'sync-scroll': '同步滚动',
'sync-rendering': '同步渲染',
'word-wrap': '编辑器换行 %s',
'typewriter-mode': '打字机模式',