Cycle through tabs (#1283)

* Cycle through tabs

* Add cycle backwards alias
This commit is contained in:
Felix Häusler 2019-08-19 13:06:27 +02:00 committed by Ran Luo
parent 225d30bd90
commit 1ab8388c1d
5 changed files with 180 additions and 91 deletions

View File

@ -32,103 +32,114 @@ Here is an example:
**Mark Text menu (macOS only):**
| Id | Description |
| ----------------- | --------------------------------------- |
| `mtHide` | Hide Mark Text |
| `mtHideOthers` | Hide all other windows except Mark Text |
| `filePreferences` | Open settings window |
| `fileQuit` | Quit Mark Text |
| Id | Default | Description |
| ----------------- | ---------------------------------------------- | --------------------------------------- |
| `mtHide` | <kbd>Command</kbd>+<kbd>H</kbd> | Hide Mark Text |
| `mtHideOthers` | <kbd>Command</kbd>+<kbd>Alt</kbd>+<kbd>H</kbd> | Hide all other windows except Mark Text |
| `filePreferences` | <kbd>Command</kbd>+<kbd>,</kbd> | Open settings window |
| `fileQuit` | <kbd>Command</kbd>+<kbd>Q</kbd> | Quit Mark Text |
**File menu:**
| Id | Description |
|:----------------- | ----------------------------------------- |
| `fileNewFile` | New file |
| `fileNewTab` | New tab |
| `fileOpenFile` | Open markdown file |
| `fileOpenFolder` | Open folder |
| `fileSave` | Save |
| `fileSaveAs` | Save as... |
| `filePreferences` | Open settings window (Linux/Windows only) |
| `fileCloseTab` | Close tab |
| `fileCloseWindow` | Close window |
| `fileQuit` | Quit Mark Text (Linux/Windows only) |
| Id | Default | Description |
|:----------------- | -------------------------------------------------- | ----------------------------------------- |
| `fileNewFile` | <kbd>CmdOrCtrl</kbd>+<kbd>N</kbd> | New file |
| `fileNewTab` | <kbd>CmdOrCtrl</kbd>+<kbd>T</kbd> | New tab |
| `fileOpenFile` | <kbd>CmdOrCtrl</kbd>+<kbd>O</kbd> | Open markdown file |
| `fileOpenFolder` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd> | Open folder |
| `fileSave` | <kbd>CmdOrCtrl</kbd>+<kbd>S</kbd> | Save |
| `fileSaveAs` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>S</kbd> | Save as... |
| `filePrint` | <kbd>Ctrl</kbd>+<kbd>P</kbd> | Print current tab |
| `filePreferences` | <kbd>Ctrl</kbd>+<kbd>,</kbd> | Open settings window (Linux/Windows only) |
| `fileCloseTab` | <kbd>CmdOrCtrl</kbd>+<kbd>W</kbd> | Close tab |
| `fileCloseWindow` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>W</kbd> | Close window |
| `fileQuit` | <kbd>CmdOrCtrl</kbd>+<kbd>Q</kbd> | Quit Mark Text (Linux/Windows only) |
**Edit menu:**
| Id | Description |
|:--------------------- | ----------------------------------------------- |
| `editUndo` | Undo last operation |
| `editRedo` | Redo last operation |
| `editCut` | Cut selected text |
| `editCopy` | Copy selected text |
| `editPaste` | Paste text |
| `editCopyAsMarkdown` | Copy selected text as markdown |
| `editCopyAsPlaintext` | Copy selected text as plaintext |
| `editSelectAll` | Select all text of the document |
| `editDuplicate` | Duplicate the current paragraph |
| `editCreateParagraph` | Create a new paragraph after the current one |
| `editDeleteParagraph` | Delete current paragraph |
| `editFind` | Find information in the document |
| `editFindNext` | Continue the search and find the next match |
| `editFindPrevious` | Continue the search and find the previous match |
| `editReplace` | Replace the information with a replacement |
| `editAidou` | Show Aidou dialog |
| `editScreenshot` | Get the screenshot |
| Id | Default | Description |
|:--------------------- | -------------------------------------------------- | ----------------------------------------------- |
| `editUndo` | <kbd>CmdOrCtrl</kbd>+<kbd>Z</kbd> | Undo last operation |
| `editRedo` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>Z</kbd> | Redo last operation |
| `editCut` | <kbd>CmdOrCtrl</kbd>+<kbd>X</kbd> | Cut selected text |
| `editCopy` | <kbd>CmdOrCtrl</kbd>+<kbd>C</kbd> | Copy selected text |
| `editPaste` | <kbd>CmdOrCtrl</kbd>+<kbd>V</kbd> | Paste text |
| `editCopyAsMarkdown` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>C</kbd> | Copy selected text as markdown |
| `editCopyAsPlaintext` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>V</kbd> | Copy selected text as plaintext |
| `editSelectAll` | <kbd>CmdOrCtrl</kbd>+<kbd>A</kbd> | Select all text of the document |
| `editDuplicate` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> | Duplicate the current paragraph |
| `editCreateParagraph` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>N</kbd> | Create a new paragraph after the current one |
| `editDeleteParagraph` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>D</kbd> | Delete current paragraph |
| `editFind` | <kbd>CmdOrCtrl</kbd>+<kbd>F</kbd> | Find information in the document |
| `editFindNext` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>U</kbd> | Continue the search and find the next match |
| `editFindPrevious` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>U</kbd> | Continue the search and find the previous match |
| `editReplace` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>F</kbd> | Replace the information with a replacement |
| `editAidou` | <kbd>CmdOrCtrl</kbd>+<kbd>/</kbd> | Show Aidou dialog |
| `editScreenshot` | <kbd>Command</kbd>+<kbd>Alt</kbd>+<kbd>A</kbd> | Get the screenshot (macOS only) |
**Paragraph menu:**
| Id | Description |
| -------------------------- | ---------------------------------------- |
| `paragraphHeading1` | Set line as heading 1 |
| `paragraphHeading2` | Set line as heading 2 |
| `paragraphHeading3` | Set line as heading 3 |
| `paragraphHeading4` | Set line as heading 4 |
| `paragraphHeading5` | Set line as heading 5 |
| `paragraphHeading6` | Set line as heading 6 |
| `paragraphUpgradeHeading` | Upgrade a heading |
| `paragraphDegradeHeading` | Degrade a heading |
| `paragraphTable` | Insert a table |
| `paragraphCodeFence` | Insert a code block |
| `paragraphQuoteBlock` | Insert a quote block |
| `paragraphMathBlock` | Insert a math block |
| `paragraphHtmlBlock` | Insert a HTML block |
| `paragraphOrderList` | Insert a ordered list |
| `paragraphBulletList` | Insert a unordered list |
| `paragraphTaskList` | Insert a task list |
| `paragraphLooseListItem` | Convert a list item to a loose list item |
| `paragraphParagraph` | Convert a heading to a paragraph |
| `paragraphHorizontalLine` | Add a horizontal line |
| `paragraphYAMLFrontMatter` | Insert a YAML frontmatter block |
| Id | Default | Description |
| -------------------------- | -------------------------------------------------- | ------------------------------------------------- |
| `paragraphHeading1` | <kbd>CmdOrCtrl</kbd>+<kbd>1</kbd> | Set line as heading 1 |
| `paragraphHeading2` | <kbd>CmdOrCtrl</kbd>+<kbd>2</kbd> | Set line as heading 2 |
| `paragraphHeading3` | <kbd>CmdOrCtrl</kbd>+<kbd>3</kbd> | Set line as heading 3 |
| `paragraphHeading4` | <kbd>CmdOrCtrl</kbd>+<kbd>4</kbd> | Set line as heading 4 |
| `paragraphHeading5` | <kbd>CmdOrCtrl</kbd>+<kbd>5</kbd> | Set line as heading 5 |
| `paragraphHeading6` | <kbd>CmdOrCtrl</kbd>+<kbd>6</kbd> | Set line as heading 6 |
| `paragraphUpgradeHeading` | <kbd>CmdOrCtrl</kbd>+<kbd>=</kbd> | Upgrade a heading |
| `paragraphDegradeHeading` | <kbd>CmdOrCtrl</kbd>+<kbd>-</kbd> | Degrade a heading |
| `paragraphTable` | <kbd>CmdOrCtrl</kbd>+<kbd>T</kbd> | Insert a table |
| `paragraphCodeFence` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>C</kbd> | Insert a code block |
| `paragraphQuoteBlock` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>Q</kbd> | Insert a quote block |
| `paragraphMathBlock` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>M</kbd> | Insert a math block |
| `paragraphHtmlBlock` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>J/H</kbd> | Insert a HTML block (`J` on macOS, `H` otherwise) |
| `paragraphOrderList` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>O</kbd> | Insert a ordered list |
| `paragraphBulletList` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>U</kbd> | Insert a unordered list |
| `paragraphTaskList` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>X</kbd> | Insert a task list |
| `paragraphLooseListItem` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>L</kbd> | Convert a list item to a loose list item |
| `paragraphParagraph` | <kbd>CmdOrCtrl</kbd>+<kbd>0</kbd> | Convert a heading to a paragraph |
| `paragraphHorizontalLine` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>-</kbd> | Add a horizontal line |
| `paragraphYAMLFrontMatter` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>Y</kbd> | Insert a YAML frontmatter block |
**Format menu:**
| Id | Description |
| ------------------- | ------------------------------------------- |
| `formatStrong` | Set the font of the selected text to bold |
| `formatEmphasis` | Set the font of the selected text to italic |
| `formatUnderline` | Change the selected text to underline |
| `formatInlineCode` | Change the selected text to inline code |
| `formatStrike` | Strike through the selected text |
| `formatHyperlink` | Insert a hyperlink |
| `formatImage` | Insert a image |
| `formatClearFormat` | Clear the formatting of the selected text |
| Id | Default | Description |
| ------------------- | -------------------------------------------------- | ------------------------------------------- |
| `formatStrong` | <kbd>CmdOrCtrl</kbd>+<kbd>B</kbd> | Set the font of the selected text to bold |
| `formatEmphasis` | <kbd>CmdOrCtrl</kbd>+<kbd>I</kbd> | Set the font of the selected text to italic |
| `formatUnderline` | <kbd>CmdOrCtrl</kbd>+<kbd>U</kbd> | Change the selected text to underline |
| `formatInlineCode` | <kbd>CmdOrCtrl</kbd>+<kbd>`</kbd> | Change the selected text to inline code |
| `formatInlineMath` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>M</kbd> | Change the selected text to inline math |
| `formatStrike` | <kbd>CmdOrCtrl</kbd>+<kbd>D</kbd> | Strike through the selected text |
| `formatHyperlink` | <kbd>CmdOrCtrl</kbd>+<kbd>L</kbd> | Insert a hyperlink |
| `formatImage` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> | Insert a image |
| `formatClearFormat` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd> | Clear the formatting of the selected text |
**Window menu:**
| Id | Description |
| ------------------------ | ---------------------- |
| `windowMinimize` | Minimize the window |
| `windowToggleFullScreen` | Toggle fullscreen mode |
| Id | Default | Description |
| ---------------- | --------------------------------- | ------------------- |
| `windowMinimize` | <kbd>CmdOrCtrl</kbd>+<kbd>M</kbd> | Minimize the window |
**View menu:**
| Id | Description |
| ----------------------------- | ---------------------------------------- |
| `viewSourceCodeMode` | Switch to source code mode |
| `viewTypewriterMode` | Enable typewriter mode |
| `viewFocusMode` | Enable focus mode |
| `viewToggleSideBar` | Toggle sidebar |
| `viewToggleTabBar` | Toggle tabbar |
| `viewDevToggleDeveloperTools` | Toggle developer tools (debug mode only) |
| `viewDevReload` | Reload window (debug mode only) |
| Id | Default | Description |
| ----------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------ |
| `viewToggleFullScreen` | <kbd>F11</kbd> | Toggle fullscreen mode (or <kbd>Ctrl</kbd>+<kbd>Command</kbd>+<kbd>F</kbd> on macOS) |
| `viewSourceCodeMode` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd> | Switch to source code mode |
| `viewTypewriterMode` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>T</kbd> | Enable typewriter mode |
| `viewFocusMode` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd> | Enable focus mode |
| `viewToggleSideBar` | <kbd>CmdOrCtrl</kbd>+<kbd>J</kbd> | Toggle sidebar |
| `viewToggleTabBar` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>B</kbd> | Toggle tabbar |
| `viewDevToggleDeveloperTools` | <kbd>CmdOrCtrl</kbd>+<kbd>Alt</kbd>+<kbd>I</kbd> | Toggle developer tools (debug mode only) |
| `viewDevReload` | <kbd>CmdOrCtrl</kbd>+<kbd>R</kbd> | Reload window (debug mode only) |
**Misc**
| Id | Default | Description |
| ------------------- | ---------------------------------------------------- | ---------------------------- |
| `tabsCycleForward` | <kbd>CmdOrCtrl</kbd>+<kbd>Tab</kbd> | Cycle through tabs |
| `tabsCycleBackward` | <kbd>CmdOrCtrl</kbd>+<kbd>Shift</kbd>+<kbd>Tab</kbd> | Cycle backwards through tabs |
| `tabsSwitchToLeft` | <kbd>CmdOrCtrl</kbd>+<kbd>PageUp</kbd> | Switch tab to the left |
| `tabsSwitchToRight` | <kbd>CmdOrCtrl</kbd>+<kbd>PageDown</kbd> | Switch tab to the right |

View File

@ -21,11 +21,11 @@ class Keybindings {
this.configPath = path.join(userDataPath, 'keybindings.json')
this.keys = new Map([
// marktext - macOS only
// Mark Text - macOS only
['mtHide', 'Command+H'],
['mtHideOthers', 'Command+Alt+H'],
// file menu
// File menu
['fileNewFile', 'CmdOrCtrl+N'],
['fileNewTab', 'CmdOrCtrl+Shift+T'],
['fileOpenFile', 'CmdOrCtrl+O'],
@ -38,7 +38,7 @@ class Keybindings {
['fileCloseWindow', 'CmdOrCtrl+Shift+W'],
['fileQuit', 'CmdOrCtrl+Q'],
// edit menu
// Edit menu
['editUndo', 'CmdOrCtrl+Z'],
['editRedo', 'CmdOrCtrl+Shift+Z'],
['editCut', 'CmdOrCtrl+X'],
@ -57,7 +57,7 @@ class Keybindings {
['editAidou', 'CmdOrCtrl+/'],
['editScreenshot', 'CmdOrCtrl+Alt+A'],
// paragraph menu
// Paragraph menu
['paragraphHeading1', 'CmdOrCtrl+1'],
['paragraphHeading2', 'CmdOrCtrl+2'],
['paragraphHeading3', 'CmdOrCtrl+3'],
@ -79,7 +79,7 @@ class Keybindings {
['paragraphHorizontalLine', 'CmdOrCtrl+Alt+-'],
['paragraphYAMLFrontMatter', 'CmdOrCtrl+Alt+Y'],
// format menu
// Format menu
['formatStrong', 'CmdOrCtrl+B'],
['formatEmphasis', 'CmdOrCtrl+I'],
['formatUnderline', 'CmdOrCtrl+U'],
@ -90,10 +90,10 @@ class Keybindings {
['formatImage', 'CmdOrCtrl+Shift+I'],
['formatClearFormat', 'Shift+CmdOrCtrl+R'],
// window menu
// Window menu
['windowMinimize', 'CmdOrCtrl+M'],
// view menu
// View menu
['viewToggleFullScreen', isOsx ? 'Ctrl+Command+F' : 'F11'],
['viewSourceCodeMode', 'CmdOrCtrl+Alt+S'],
['viewTypewriterMode', 'CmdOrCtrl+Alt+T'],
@ -101,7 +101,13 @@ class Keybindings {
['viewToggleSideBar', 'CmdOrCtrl+J'],
['viewToggleTabBar', 'CmdOrCtrl+Alt+B'],
['viewDevToggleDeveloperTools', 'CmdOrCtrl+Alt+I'],
['viewDevReload', 'CmdOrCtrl+R']
['viewDevReload', 'CmdOrCtrl+R'],
// Misc
['tabsCycleForward', 'CmdOrCtrl+Tab'],
['tabsCycleBackward', 'CmdOrCtrl+Shift+Tab'],
['tabsSwitchToLeft', 'CmdOrCtrl+PageUp'],
['tabsSwitchToRight', 'CmdOrCtrl+PageDown']
])
// fix non-US keyboards

View File

@ -164,7 +164,7 @@ class AppMenu {
}
}
buildEditorMenu (createShortcutMap, recentUsedDocuments) {
buildEditorMenu (createShortcutMap, recentUsedDocuments = null) {
if (!recentUsedDocuments) {
recentUsedDocuments = this.getRecentlyUsedDocuments()
}
@ -175,6 +175,7 @@ class AppMenu {
let shortcutMap = null
if (createShortcutMap) {
shortcutMap = parseMenu(menuTemplate)
this._appendMiscShortcuts(shortcutMap)
}
return {
@ -282,6 +283,37 @@ class AppMenu {
})
}
_appendMiscShortcuts = shortcutMap => {
shortcutMap.push({
accelerator: this._keybindings.getAccelerator('tabsCycleForward'),
click: (menuItem, win) => {
win.webContents.send('mt::tabs-cycle-right')
},
id: null
})
shortcutMap.push({
accelerator: this._keybindings.getAccelerator('tabsCycleBackward'),
click: (menuItem, win) => {
win.webContents.send('mt::tabs-cycle-left')
},
id: null
})
shortcutMap.push({
accelerator: this._keybindings.getAccelerator('tabsSwitchToLeft'),
click: (menuItem, win) => {
win.webContents.send('mt::tabs-cycle-left')
},
id: null
})
shortcutMap.push({
accelerator: this._keybindings.getAccelerator('tabsSwitchToRight'),
click: (menuItem, win) => {
win.webContents.send('mt::tabs-cycle-right')
},
id: null
})
}
_setApplicationMenu (menu) {
if (isLinux && !menu) {
// WORKAROUND for Electron#16521: We cannot hide the (application) menu on Linux.

View File

@ -140,6 +140,7 @@ export default {
dispatch('LINTEN_FOR_SET_LINE_ENDING')
dispatch('LISTEN_FOR_NEW_TAB')
dispatch('LISTEN_FOR_CLOSE_TAB')
dispatch('LISTEN_FOR_TAB_CYCLE')
dispatch('LINTEN_FOR_PRINT_SERVICE_CLEARUP')
dispatch('LINTEN_FOR_EXPORT_SUCCESS')
dispatch('LISTEN_FOR_FILE_CHANGE')

View File

@ -544,6 +544,15 @@ const actions = {
})
},
LISTEN_FOR_TAB_CYCLE ({ commit, state, dispatch }) {
ipcRenderer.on('mt::tabs-cycle-left', e => {
dispatch('CYCLE_TABS', false)
})
ipcRenderer.on('mt::tabs-cycle-right', e => {
dispatch('CYCLE_TABS', true)
})
},
CLOSE_TAB ({ dispatch }, file) {
const { isSaved } = file
if (isSaved) {
@ -553,6 +562,36 @@ const actions = {
}
},
// Direction is a boolean where false is left and true right.
CYCLE_TABS ({ commit, state }, direction) {
const { tabs, currentFile } = state
if (tabs.length <= 1) {
return
}
const currentIndex = tabs.findIndex(t => t.id === currentFile.id)
if (currentIndex === -1) {
console.error('CYCLE_TABS: Cannot find current tab index.')
return
}
let nextTabIndex = 0
if (!direction) {
// Switch tab to the left.
nextTabIndex = currentIndex === 0 ? tabs.length - 1 : currentIndex - 1
} else {
// Switch tab to the right.
nextTabIndex = (currentIndex + 1) % tabs.length
}
const nextTab = tabs[nextTabIndex]
if (!nextTab || !nextTab.id) {
console.error(`CYCLE_TABS: Cannot find next tab (index="${nextTabIndex}").`)
return
}
commit('SET_CURRENT_FILE', nextTab)
},
/**
* Create a new untitled tab optional from a markdown string.
*