support global shortcuts with global: prefix

This commit is contained in:
zadam 2019-11-21 21:12:07 +01:00
parent 00c295e4bf
commit 0e5028acd3
11 changed files with 401 additions and 403 deletions

View File

@ -8,6 +8,7 @@ const cls = require('./src/services/cls');
const url = require("url"); const url = require("url");
const port = require('./src/services/port'); const port = require('./src/services/port');
const env = require('./src/services/env'); const env = require('./src/services/env');
const keyboardActionsService = require('./src/services/keyboard_actions');
const appIconService = require('./src/services/app_icon'); const appIconService = require('./src/services/app_icon');
const windowStateKeeper = require('electron-window-state'); const windowStateKeeper = require('electron-window-state');
@ -95,21 +96,42 @@ app.on('activate', () => {
} }
}); });
async function registerGlobalShortcuts() {
const allActions = await keyboardActionsService.getKeyboardActions();
for (const action of allActions) {
if (!action.effectiveShortcuts) {
continue;
}
for (const shortcut of action.effectiveShortcuts) {
if (shortcut.startsWith('global:')) {
const translatedShortcut = shortcut.substr(7);
const result = globalShortcut.register(translatedShortcut, cls.wrap(async () => {
// window may be hidden / not in focus
mainWindow.focus();
mainWindow.webContents.send('globalShortcut', action.actionName);
}));
if (result) {
log.info(`Registered global shortcut ${translatedShortcut} for action ${action.actionName}`);
}
else {
log.info(`Could not register global shortcut ${translatedShortcut}`);
}
}
}
}
}
app.on('ready', async () => { app.on('ready', async () => {
app.setAppUserModelId('com.github.zadam.trilium'); app.setAppUserModelId('com.github.zadam.trilium');
mainWindow = await createMainWindow(); mainWindow = await createMainWindow();
const result = globalShortcut.register('CommandOrControl+Alt+P', cls.wrap(async () => { registerGlobalShortcuts();
// window may be hidden / not in focus
mainWindow.focus();
mainWindow.webContents.send('create-day-sub-note');
}));
if (!result) {
log.error("Could not register global shortcut CTRL+ALT+P");
}
}); });
app.on('will-quit', () => { app.on('will-quit', () => {

213
package-lock.json generated
View File

@ -2680,14 +2680,22 @@
"integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA=="
}, },
"electron": { "electron": {
"version": "8.0.0-beta.3", "version": "6.0.12",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.0.0-beta.3.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-6.0.12.tgz",
"integrity": "sha512-MvzV3ApP5b+xGJXMPLaQkNSkggd0OixqRJvR1NvR/j4ZvvsEvL4K+ytT0PugvvOC7odgmsh2bmj0JCJZEg64eA==", "integrity": "sha512-70ODZa1RP6K0gE9IV9YLCXPSyhLjXksCuYSSPb3MljbfwfHo5uE6X0CGxzm+54YuPdE2e7EPnWZxOOsJYrS5iQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@electron/get": "^1.0.1", "@types/node": "^10.12.18",
"@types/node": "^12.0.12", "electron-download": "^4.1.0",
"extract-zip": "^1.0.3" "extract-zip": "^1.0.3"
},
"dependencies": {
"@types/node": {
"version": "10.17.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz",
"integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==",
"dev": true
}
} }
}, },
"electron-builder": { "electron-builder": {
@ -2837,6 +2845,57 @@
"unused-filename": "^1.0.0" "unused-filename": "^1.0.0"
} }
}, },
"electron-download": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz",
"integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==",
"dev": true,
"requires": {
"debug": "^3.0.0",
"env-paths": "^1.0.0",
"fs-extra": "^4.0.1",
"minimist": "^1.2.0",
"nugget": "^2.0.1",
"path-exists": "^3.0.0",
"rc": "^1.2.1",
"semver": "^5.4.1",
"sumchecker": "^2.0.2"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"fs-extra": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}
}
},
"electron-find": { "electron-find": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/electron-find/-/electron-find-1.0.6.tgz", "resolved": "https://registry.npmjs.org/electron-find/-/electron-find-1.0.6.tgz",
@ -3266,6 +3325,12 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
}, },
"env-paths": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
"integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
"dev": true
},
"error-ex": { "error-ex": {
"version": "1.3.2", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@ -7071,6 +7136,32 @@
"boolbase": "~1.0.0" "boolbase": "~1.0.0"
} }
}, },
"nugget": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
"integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
"dev": true,
"requires": {
"debug": "^2.1.3",
"minimist": "^1.1.0",
"pretty-bytes": "^1.0.2",
"progress-stream": "^1.1.0",
"request": "^2.45.0",
"single-line-log": "^1.1.2",
"throttleit": "0.0.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
}
}
},
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
@ -8281,6 +8372,16 @@
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
}, },
"pretty-bytes": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
"integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
"dev": true,
"requires": {
"get-stdin": "^4.0.1",
"meow": "^3.1.0"
}
},
"process": { "process": {
"version": "0.5.2", "version": "0.5.2",
"resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
@ -8291,6 +8392,67 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"progress-stream": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
"integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
"dev": true,
"requires": {
"speedometer": "~0.1.2",
"through2": "~0.2.3"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
"object-keys": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
"integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
"dev": true
},
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
},
"through2": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
"integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
"dev": true,
"requires": {
"readable-stream": "~1.1.9",
"xtend": "~2.1.1"
}
},
"xtend": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
"integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
"dev": true,
"requires": {
"object-keys": "~0.4.0"
}
}
}
},
"proto-list": { "proto-list": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@ -9010,6 +9172,15 @@
"moment": "^2.20.1" "moment": "^2.20.1"
} }
}, },
"single-line-log": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
"integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
"dev": true,
"requires": {
"string-width": "^1.0.1"
}
},
"slash": { "slash": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@ -9104,6 +9275,12 @@
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
}, },
"speedometer": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
"integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
"dev": true
},
"sprintf-js": { "sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -9333,6 +9510,26 @@
"chalk": "^1.0.0" "chalk": "^1.0.0"
} }
}, },
"sumchecker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
"integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
"dev": true,
"requires": {
"debug": "^2.2.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
}
}
},
"supports-color": { "supports-color": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@ -9433,6 +9630,12 @@
"execa": "^0.7.0" "execa": "^0.7.0"
} }
}, },
"throttleit": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
"integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
"dev": true
},
"through": { "through": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",

View File

@ -16,7 +16,7 @@
"start-server": "TRILIUM_ENV=dev node ./src/www", "start-server": "TRILIUM_ENV=dev node ./src/www",
"start-electron": "TRILIUM_ENV=dev electron . --disable-gpu", "start-electron": "TRILIUM_ENV=dev electron . --disable-gpu",
"build-backend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/entities/*.js src/services/backend_script_api.js", "build-backend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/backend_api src/entities/*.js src/services/backend_script_api.js",
"build-frontend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/javascripts/entities/*.js src/public/javascripts/services/keyboard_action.js src/public/javascripts/services/frontend_script_api.js", "build-frontend-docs": "./node_modules/.bin/jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/javascripts/entities/*.js src/public/javascripts/services/frontend_script_api.js",
"build-docs": "npm run build-backend-docs && npm run build-frontend-docs" "build-docs": "npm run build-backend-docs && npm run build-frontend-docs"
}, },
"dependencies": { "dependencies": {
@ -77,7 +77,7 @@
"ws": "7.2.0" "ws": "7.2.0"
}, },
"devDependencies": { "devDependencies": {
"electron": "8.0.0-beta.3", "electron": "6.0.12",
"electron-builder": "22.1.0", "electron-builder": "22.1.0",
"electron-installer-debian": "2.0.1", "electron-installer-debian": "2.0.1",
"electron-packager": "14.1.0", "electron-packager": "14.1.0",

View File

@ -30,6 +30,7 @@ import cssLoader from './services/css_loader.js';
import dateNoteService from './services/date_notes.js'; import dateNoteService from './services/date_notes.js';
import sidebarService from './services/sidebar.js'; import sidebarService from './services/sidebar.js';
import importService from './services/import.js'; import importService from './services/import.js';
import keyboardActionService from "./services/keyboard_actions.js";
window.glob.isDesktop = utils.isDesktop; window.glob.isDesktop = utils.isDesktop;
window.glob.isMobile = utils.isMobile; window.glob.isMobile = utils.isMobile;
@ -108,18 +109,8 @@ $("body").on("click", "a.external", function () {
}); });
if (utils.isElectron()) { if (utils.isElectron()) {
require('electron').ipcRenderer.on('create-day-sub-note', async function(event) { require('electron').ipcRenderer.on('globalShortcut', async function(event, actionName) {
const todayNote = await dateNoteService.getTodayNote(); keyboardActionService.triggerAction(actionName);
const notePath = await treeService.getSomeNotePath(todayNote);
const node = await treeService.expandToNote(notePath);
await noteDetailService.openEmptyTab(false);
await treeService.createNote(node, todayNote.noteId, 'into', {
type: "text",
isProtected: node.data.isProtected
});
}); });
} }

View File

@ -4,7 +4,9 @@ import zoomService from "./zoom.js";
import protectedSessionService from "./protected_session.js"; import protectedSessionService from "./protected_session.js";
import searchNotesService from "./search_notes.js"; import searchNotesService from "./search_notes.js";
import treeService from "./tree.js"; import treeService from "./tree.js";
import server from "./server.js"; import dateNoteService from "./date_notes.js";
import noteDetailService from "./note_detail.js";
import keyboardActionService from "./keyboard_actions.js";
const NOTE_REVISIONS = "../dialogs/note_revisions.js"; const NOTE_REVISIONS = "../dialogs/note_revisions.js";
const OPTIONS = "../dialogs/options.js"; const OPTIONS = "../dialogs/options.js";
@ -27,31 +29,31 @@ function registerEntrypoints() {
jQuery.hotkeys.options.filterContentEditable = false; jQuery.hotkeys.options.filterContentEditable = false;
jQuery.hotkeys.options.filterTextInputs = false; jQuery.hotkeys.options.filterTextInputs = false;
setActionHandler("AddLinkToText", () => import(ADD_LINK).then(d => d.showDialog())); keyboardActionService.setActionHandler("AddLinkToText", () => import(ADD_LINK).then(d => d.showDialog()));
const showJumpToNoteDialog = () => import(JUMP_TO_NOTE).then(d => d.showDialog()); const showJumpToNoteDialog = () => import(JUMP_TO_NOTE).then(d => d.showDialog());
$("#jump-to-note-dialog-button").on('click', showJumpToNoteDialog); $("#jump-to-note-dialog-button").on('click', showJumpToNoteDialog);
setActionHandler("JumpToNote", showJumpToNoteDialog); keyboardActionService.setActionHandler("JumpToNote", showJumpToNoteDialog);
const showRecentChanges = () => import(RECENT_CHANGES).then(d => d.showDialog()); const showRecentChanges = () => import(RECENT_CHANGES).then(d => d.showDialog());
$("#recent-changes-button").on('click', showRecentChanges); $("#recent-changes-button").on('click', showRecentChanges);
setActionHandler("ShowRecentChanges", showRecentChanges); keyboardActionService.setActionHandler("ShowRecentChanges", showRecentChanges);
$("#enter-protected-session-button").on('click', protectedSessionService.enterProtectedSession); $("#enter-protected-session-button").on('click', protectedSessionService.enterProtectedSession);
$("#leave-protected-session-button").on('click', protectedSessionService.leaveProtectedSession); $("#leave-protected-session-button").on('click', protectedSessionService.leaveProtectedSession);
$("#toggle-search-button").on('click', searchNotesService.toggleSearch); $("#toggle-search-button").on('click', searchNotesService.toggleSearch);
setActionHandler('SearchNotes', searchNotesService.toggleSearch); keyboardActionService.setActionHandler('SearchNotes', searchNotesService.toggleSearch);
const $noteTabContainer = $("#note-tab-container"); const $noteTabContainer = $("#note-tab-container");
const showAttributesDialog = () => import(ATTRIBUTES).then(d => d.showDialog()); const showAttributesDialog = () => import(ATTRIBUTES).then(d => d.showDialog());
$noteTabContainer.on("click", ".show-attributes-button", showAttributesDialog); $noteTabContainer.on("click", ".show-attributes-button", showAttributesDialog);
setActionHandler("ShowAttributes", showAttributesDialog); keyboardActionService.setActionHandler("ShowAttributes", showAttributesDialog);
const showNoteInfoDialog = () => import(NOTE_INFO).then(d => d.showDialog()); const showNoteInfoDialog = () => import(NOTE_INFO).then(d => d.showDialog());
$noteTabContainer.on("click", ".show-note-info-button", showNoteInfoDialog); $noteTabContainer.on("click", ".show-note-info-button", showNoteInfoDialog);
setActionHandler("ShowNoteInfo", showNoteInfoDialog); keyboardActionService.setActionHandler("ShowNoteInfo", showNoteInfoDialog);
const showNoteRevisionsDialog = function() { const showNoteRevisionsDialog = function() {
if ($(this).hasClass("disabled")) { if ($(this).hasClass("disabled")) {
@ -62,7 +64,7 @@ function registerEntrypoints() {
}; };
$noteTabContainer.on("click", ".show-note-revisions-button", showNoteRevisionsDialog); $noteTabContainer.on("click", ".show-note-revisions-button", showNoteRevisionsDialog);
setActionHandler("ShowNoteRevisions", showNoteRevisionsDialog); keyboardActionService.setActionHandler("ShowNoteRevisions", showNoteRevisionsDialog);
const showNoteSourceDialog = function() { const showNoteSourceDialog = function() {
if ($(this).hasClass("disabled")) { if ($(this).hasClass("disabled")) {
@ -73,33 +75,33 @@ function registerEntrypoints() {
}; };
$noteTabContainer.on("click", ".show-source-button", showNoteSourceDialog); $noteTabContainer.on("click", ".show-source-button", showNoteSourceDialog);
setActionHandler("ShowNoteSource", showNoteSourceDialog); keyboardActionService.setActionHandler("ShowNoteSource", showNoteSourceDialog);
const showLinkMapDialog = () => import(LINK_MAP).then(d => d.showDialog()); const showLinkMapDialog = () => import(LINK_MAP).then(d => d.showDialog());
$noteTabContainer.on("click", ".show-link-map-button", showLinkMapDialog); $noteTabContainer.on("click", ".show-link-map-button", showLinkMapDialog);
setActionHandler("ShowLinkMap", showLinkMapDialog); keyboardActionService.setActionHandler("ShowLinkMap", showLinkMapDialog);
const showOptionsDialog = () => import(OPTIONS).then(d => d.showDialog()); const showOptionsDialog = () => import(OPTIONS).then(d => d.showDialog());
$("#options-button").on('click', showOptionsDialog); $("#options-button").on('click', showOptionsDialog);
setActionHandler("ShowOptions", showOptionsDialog); keyboardActionService.setActionHandler("ShowOptions", showOptionsDialog);
const showHelpDialog = () => import(HELP).then(d => d.showDialog()); const showHelpDialog = () => import(HELP).then(d => d.showDialog());
$("#show-help-button").on('click', showHelpDialog); $("#show-help-button").on('click', showHelpDialog);
setActionHandler("ShowHelp", showHelpDialog); keyboardActionService.setActionHandler("ShowHelp", showHelpDialog);
const showSqlConsoleDialog = () => import(SQL_CONSOLE).then(d => d.showDialog()); const showSqlConsoleDialog = () => import(SQL_CONSOLE).then(d => d.showDialog());
$("#open-sql-console-button").on('click', showSqlConsoleDialog); $("#open-sql-console-button").on('click', showSqlConsoleDialog);
setActionHandler("ShowSQLConsole", showSqlConsoleDialog); keyboardActionService.setActionHandler("ShowSQLConsole", showSqlConsoleDialog);
$("#show-about-dialog-button").on('click', () => import(ABOUT).then(d => d.showDialog())); $("#show-about-dialog-button").on('click', () => import(ABOUT).then(d => d.showDialog()));
if (utils.isElectron()) { if (utils.isElectron()) {
$("#history-navigation").show(); $("#history-navigation").show();
$("#history-back-button").on('click', window.history.back); $("#history-back-button").on('click', window.history.back);
setActionHandler("BackInNoteHistory", window.history.back); keyboardActionService.setActionHandler("BackInNoteHistory", window.history.back);
$("#history-forward-button").on('click', window.history.forward); $("#history-forward-button").on('click', window.history.forward);
setActionHandler("ForwardInNoteHistory", window.history.forward); keyboardActionService.setActionHandler("ForwardInNoteHistory", window.history.forward);
} }
// hide (toggle) everything except for the note content for zen mode // hide (toggle) everything except for the note content for zen mode
@ -109,9 +111,9 @@ function registerEntrypoints() {
}; };
$("#toggle-zen-mode-button").on('click', toggleZenMode); $("#toggle-zen-mode-button").on('click', toggleZenMode);
setActionHandler("ToggleZenMode", toggleZenMode); keyboardActionService.setActionHandler("ToggleZenMode", toggleZenMode);
setActionHandler("InsertDateTime", () => { keyboardActionService.setActionHandler("InsertDateTime", () => {
const date = new Date(); const date = new Date();
const dateString = utils.formatDateTime(date); const dateString = utils.formatDateTime(date);
@ -119,7 +121,7 @@ function registerEntrypoints() {
}); });
$("#reload-frontend-button").on('click', utils.reloadApp); $("#reload-frontend-button").on('click', utils.reloadApp);
setActionHandler("ReloadApp", utils.reloadApp); keyboardActionService.setActionHandler("ReloadApp", utils.reloadApp);
$("#open-dev-tools-button").toggle(utils.isElectron()); $("#open-dev-tools-button").toggle(utils.isElectron());
@ -131,7 +133,7 @@ function registerEntrypoints() {
}; };
$("#open-dev-tools-button").on('click', openDevTools); $("#open-dev-tools-button").on('click', openDevTools);
setActionHandler("OpenDevTools", openDevTools); keyboardActionService.setActionHandler("OpenDevTools", openDevTools);
} }
let findInPage; let findInPage;
@ -153,7 +155,7 @@ function registerEntrypoints() {
caseSelectedColor: 'var(--main-border-color)' caseSelectedColor: 'var(--main-border-color)'
}); });
setActionHandler("FindInText", () => { keyboardActionService.setActionHandler("FindInText", () => {
if (!glob.activeDialog || !glob.activeDialog.is(":visible")) { if (!glob.activeDialog || !glob.activeDialog.is(":visible")) {
findInPage.openFindWindow(); findInPage.openFindWindow();
} }
@ -173,7 +175,7 @@ function registerEntrypoints() {
$("#toggle-fullscreen-button").on('click', toggleFullscreen); $("#toggle-fullscreen-button").on('click', toggleFullscreen);
setActionHandler("ToggleFullscreen", toggleFullscreen); keyboardActionService.setActionHandler("ToggleFullscreen", toggleFullscreen);
} }
else { else {
// outside of electron this is handled by the browser // outside of electron this is handled by the browser
@ -181,8 +183,8 @@ function registerEntrypoints() {
} }
if (utils.isElectron()) { if (utils.isElectron()) {
setActionHandler("ZoomOut", zoomService.decreaseZoomFactor); keyboardActionService.setActionHandler("ZoomOut", zoomService.decreaseZoomFactor);
setActionHandler("ZoomIn", zoomService.increaseZoomFactor); keyboardActionService.setActionHandler("ZoomIn", zoomService.increaseZoomFactor);
} }
$(document).on('click', "a[data-action='note-revision']", async event => { $(document).on('click', "a[data-action='note-revision']", async event => {
@ -197,7 +199,7 @@ function registerEntrypoints() {
return false; return false;
}); });
setActionHandler("CloneNotesTo", () => import(CLONE_TO).then(d => { keyboardActionService.setActionHandler("CloneNotesTo", () => import(CLONE_TO).then(d => {
const activeNode = treeService.getActiveNode(); const activeNode = treeService.getActiveNode();
const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode); const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode);
@ -207,62 +209,26 @@ function registerEntrypoints() {
d.showDialog(noteIds); d.showDialog(noteIds);
})); }));
setActionHandler("MoveNotesTo", () => import(MOVE_TO).then(d => { keyboardActionService.setActionHandler("MoveNotesTo", () => import(MOVE_TO).then(d => {
const activeNode = treeService.getActiveNode(); const activeNode = treeService.getActiveNode();
const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode); const selectedOrActiveNodes = treeService.getSelectedOrActiveNodes(activeNode);
d.showDialog(selectedOrActiveNodes); d.showDialog(selectedOrActiveNodes);
})); }));
}
class KeyboardAction { keyboardActionService.setActionHandler("CreateNoteIntoDayNote", async () => {
constructor(params) { const todayNote = await dateNoteService.getTodayNote();console.log(todayNote);
/** @property {string} */ const notePath = await treeService.getSomeNotePath(todayNote);
this.actionName = params.actionName;
/** @property {string[]} */
this.defaultShortcuts = params.defaultShortcuts;
/** @property {string[]} */
this.effectiveShortcuts = params.effectiveShortcuts;
/** @property {string} */
this.description = params.description;
}
addShortcut(shortcut) { const node = await treeService.expandToNote(notePath);
this.effectiveShortcuts.push(shortcut);
}
/** await noteDetailService.openEmptyTab(false);
* @param {string|string[]} shortcuts
*/
replaceShortcuts(shortcuts) {
this.effectiveShortcuts = Array.isArray(shortcuts) ? shortcuts : [shortcuts];
}
}
const keyboardActionRepo = {}; await treeService.createNote(node, todayNote.noteId, 'into', {
type: "text",
const keyboardActionsLoaded = server.get('keyboard-actions').then(actions => { isProtected: node.data.isProtected
for (const action of actions) { });
keyboardActionRepo[action.actionName] = new KeyboardAction(action);
}
});
function setActionHandler(actionName, handler) {
keyboardActionsLoaded.then(() => {
const action = keyboardActionRepo[actionName];
if (!action) {
throw new Error(`Cannot find keyboard action '${actionName}'`);
}
action.handler = handler;
for (const shortcut of action.effectiveShortcuts) {
if (shortcut) {
utils.bindGlobalShortcut(shortcut, handler);
}
}
}); });
} }

View File

@ -11,7 +11,6 @@ import dateNotesService from './date_notes.js';
import StandardWidget from '../widgets/standard_widget.js'; import StandardWidget from '../widgets/standard_widget.js';
import ws from "./ws.js"; import ws from "./ws.js";
import hoistedNoteService from "./hoisted_note.js"; import hoistedNoteService from "./hoisted_note.js";
import KeyboardAction from "./keyboard_action.js";
/** /**
* This is the main frontend API interface for scripts. It's published in the local "api" object. * This is the main frontend API interface for scripts. It's published in the local "api" object.
@ -41,9 +40,6 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte
/** @property {StandardWidget} */ /** @property {StandardWidget} */
this.StandardWidget = StandardWidget; this.StandardWidget = StandardWidget;
/** @property {KeyboardAction} */
this.KeyboardAction = KeyboardAction;
/** /**
* Activates note in the tree and in the note detail. * Activates note in the tree and in the note detail.
* *

View File

@ -1,261 +0,0 @@
/**
* blaa vlaa
*/
class KeyboardAction {
constructor(params) {
/** @property {string} */
this.optionName = params.optionName;
/** @property {string[]} */
this.defaultShortcuts = Array.isArray(params.defaultShortcuts) ? params.defaultShortcuts : [params.defaultShortcuts];
/** @property {string[]} */
this.activeShortcuts = this.defaultShortcuts.slice();
/** @property {string} */
this.description = params.description;
}
addShortcut(shortcut) {
this.activeShortcuts.push(shortcut);
}
/**
* @param {string|string[]} shortcuts
*/
replaceShortcuts(shortcuts) {
this.activeShortcuts = Array.isArray(shortcuts) ? shortcuts : [shortcuts];
}
/** @return {KeyboardAction[]} */
static get allActions() {
return Object.keys(KeyboardAction)
.map(key => KeyboardAction[key])
.filter(obj => obj instanceof KeyboardAction);
}
}
const ELECTRON = 1;
/**
* Open "Jump to note" dialog
* @static
*/
KeyboardAction.JumpToNote = new KeyboardAction({
optionName: "JumpToNote",
defaultShortcuts: "mod+j",
description: 'Open "Jump to note" dialog'
});
/** @static */
KeyboardAction.MarkdownToHTML = new KeyboardAction({
optionName: "MarkdownToHTML",
defaultShortcuts: "mod+return"
});
/** @static */
KeyboardAction.NewTab = new KeyboardAction({
optionName: "NewTab",
defaultShortcuts: "mod+t",
only: ELECTRON
});
/** @static */
KeyboardAction.CloseTab = new KeyboardAction({
optionName: "CloseTab",
defaultShortcuts: "mod+w",
only: ELECTRON
});
/** @static */
KeyboardAction.NextTab = new KeyboardAction({
optionName: "NextTab",
defaultShortcuts: "mod+tab",
only: ELECTRON
});
/** @static */
KeyboardAction.PreviousTab = new KeyboardAction({
optionName: "PreviousTab",
defaultShortcuts: "mod+shift+tab",
only: ELECTRON
});
/** @static */
KeyboardAction.CreateNoteAfter = new KeyboardAction({
optionName: "CreateNoteAfter",
defaultShortcuts: "mod+o"
});
/** @static */
KeyboardAction.CreateNoteInto = new KeyboardAction({
optionName: "CreateNoteInto",
defaultShortcuts: "mod+p"
});
/** @static */
KeyboardAction.ScrollToActiveNote = new KeyboardAction({
optionName: "ScrollToActiveNote",
defaultShortcuts: "mod+."
});
/** @static */
KeyboardAction.CollapseTree = new KeyboardAction({
optionName: "CollapseTree",
defaultShortcuts: "alt+c"
});
/** @static */
KeyboardAction.RunSQL = new KeyboardAction({
optionName: "RunSQL",
defaultShortcuts: "mod+return"
});
/** @static */
KeyboardAction.FocusNote = new KeyboardAction({
optionName: "FocusNote",
defaultShortcuts: "return"
});
/** @static */
KeyboardAction.RunCurrentNote = new KeyboardAction({
optionName: "RunCurrentNote",
defaultShortcuts: "mod+return"
});
/** @static */
KeyboardAction.ClipboardCopy = new KeyboardAction({
optionName: "ClipboardCopy",
defaultShortcuts: "mod+c"
});
/** @static */
KeyboardAction.ClipboardPaste = new KeyboardAction({
optionName: "ClipboardPaste",
defaultShortcuts: "mod+v"
});
/** @static */
KeyboardAction.ClipboardCut = new KeyboardAction({
optionName: "ClipboardCut",
defaultShortcuts: "mod+x"
});
/** @static */
KeyboardAction.SelectAllNotesInParent = new KeyboardAction({
optionName: "SelectAllNotesInParent",
defaultShortcuts: "mod+a"
});
/** @static */
KeyboardAction.Undo = new KeyboardAction({
optionName: "Undo",
defaultShortcuts: "mod+z"
});
/** @static */
KeyboardAction.Redo = new KeyboardAction({
optionName: "Redo",
defaultShortcuts: "mod+y"
});
/** @static */
KeyboardAction.AddLinkToText = new KeyboardAction({
optionName: "AddLinkToText",
defaultShortcuts: "mod+l"
});
/** @static */
KeyboardAction.CloneNotesTo = new KeyboardAction({
optionName: "CloneNotesTo",
defaultShortcuts: "mod+shift+c"
});
/** @static */
KeyboardAction.MoveNotesTo = new KeyboardAction({
optionName: "MoveNotesTo",
defaultShortcuts: "mod+shift+c"
});
/** @static */
KeyboardAction.SearchNotes = new KeyboardAction({
optionName: "SearchNotes",
defaultShortcuts: "mod+s"
});
/** @static */
KeyboardAction.ShowAttributes = new KeyboardAction({
optionName: "ShowAttributes",
defaultShortcuts: "alt+a"
});
/** @static */
KeyboardAction.ShowHelp = new KeyboardAction({
optionName: "ShowHelp",
defaultShortcuts: "f1"
});
/** @static */
KeyboardAction.OpenSQLConsole = new KeyboardAction({
optionName: "OpenSQLConsole",
defaultShortcuts: "alt+o"
});
/** @static */
KeyboardAction.BackInNoteHistory = new KeyboardAction({
optionName: "BackInNoteHistory",
defaultShortcuts: "alt+left"
});
/** @static */
KeyboardAction.ForwardInNoteHistory = new KeyboardAction({
optionName: "ForwardInNoteHistory",
defaultShortcuts: "alt+right"
});
/** @static */
KeyboardAction.ToggleZenMode = new KeyboardAction({
optionName: "ToggleZenMode",
defaultShortcuts: "alt+m"
});
/** @static */
KeyboardAction.InsertDateTime = new KeyboardAction({
optionName: "InsertDateTime",
defaultShortcuts: "alt+t"
});
/** @static */
KeyboardAction.ReloadApp = new KeyboardAction({
optionName: "ReloadApp",
defaultShortcuts: ["f5", "mod+r"]
});
/** @static */
KeyboardAction.OpenDevTools = new KeyboardAction({
optionName: "OpenDevTools",
defaultShortcuts: "mod+shift+i"
});
/** @static */
KeyboardAction.FindInText = new KeyboardAction({
optionName: "FindInText",
defaultShortcuts: "mod+f"
});
/** @static */
KeyboardAction.ToggleFullscreen = new KeyboardAction({
optionName: "ToggleFullscreen",
defaultShortcuts: "f11"
});
/** @static */
KeyboardAction.ZoomOut = new KeyboardAction({
optionName: "ZoomOut",
defaultShortcuts: "mod+-"
});
/** @static */
KeyboardAction.ZoomIn = new KeyboardAction({
optionName: "ZoomIn",
defaultShortcuts: "mod+="
});
export default KeyboardAction;

View File

@ -0,0 +1,73 @@
import server from "./server.js";
import utils from "./utils.js";
class KeyboardAction {
constructor(params) {
/** @property {string} */
this.actionName = params.actionName;
/** @property {string[]} */
this.defaultShortcuts = params.defaultShortcuts;
/** @property {string[]} */
this.effectiveShortcuts = params.effectiveShortcuts;
/** @property {string} */
this.description = params.description;
}
addShortcut(shortcut) {
this.effectiveShortcuts.push(shortcut);
}
/**
* @param {string|string[]} shortcuts
*/
replaceShortcuts(shortcuts) {
this.effectiveShortcuts = Array.isArray(shortcuts) ? shortcuts : [shortcuts];
}
}
const keyboardActionRepo = {};
const keyboardActionsLoaded = server.get('keyboard-actions').then(actions => {
for (const action of actions) {
keyboardActionRepo[action.actionName] = new KeyboardAction(action);
}
});
function setActionHandler(actionName, handler) {
keyboardActionsLoaded.then(() => {
const action = keyboardActionRepo[actionName];
if (!action) {
throw new Error(`Cannot find keyboard action '${actionName}'`);
}
action.handler = handler;
for (const shortcut of action.effectiveShortcuts) {
if (shortcut) {
utils.bindGlobalShortcut(shortcut, handler);
}
}
});
}
async function triggerAction(actionName) {
await keyboardActionsLoaded;
const action = keyboardActionRepo[actionName];
if (!action) {
throw new Error(`Cannot find action ${actionName}`);
}
if (!action.handler) {
throw new Error(`Action ${actionName} has no handler`);
}
await action.handler();
}
export default {
setActionHandler,
triggerAction
};

View File

@ -13,12 +13,13 @@ const DATE_LABEL = 'dateNote';
const DAYS = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']; const DAYS = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const MONTHS = ['January','February','March','April','May','June','July','August','September','October','November','December']; const MONTHS = ['January','February','March','April','May','June','July','August','September','October','November','December'];
async function createNote(parentNoteId, noteTitle, noteText) { async function createNote(parentNoteId, noteTitle) {
return (await noteService.createNewNote({ return (await noteService.createNewNote({
parentNoteId: parentNoteId, parentNoteId: parentNoteId,
title: noteTitle, title: noteTitle,
content: noteText, content: '',
isProtected: false isProtected: false,
type: 'text'
})).note; })).note;
} }

View File

@ -19,7 +19,7 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "JumpToNote", actionName: "JumpToNote",
defaultShortcuts: ["Mod+J"], defaultShortcuts: ["CommandOrControl+J"],
description: 'Open "Jump to note" dialog' description: 'Open "Jump to note" dialog'
}, },
@ -29,22 +29,22 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "NewTab", actionName: "NewTab",
defaultShortcuts: ["Mod+T"], defaultShortcuts: ["CommandOrControl+T"],
only: ELECTRON only: ELECTRON
}, },
{ {
actionName: "CloseTab", actionName: "CloseTab",
defaultShortcuts: ["Mod+W"], defaultShortcuts: ["CommandOrControl+W"],
only: ELECTRON only: ELECTRON
}, },
{ {
actionName: "NextTab", actionName: "NextTab",
defaultShortcuts: ["Mod+Tab"], defaultShortcuts: ["CommandOrControl+Tab"],
only: ELECTRON only: ELECTRON
}, },
{ {
actionName: "PreviousTab", actionName: "PreviousTab",
defaultShortcuts: ["Mod+Shift+Tab"], defaultShortcuts: ["CommandOrControl+Shift+Tab"],
only: ELECTRON only: ELECTRON
}, },
@ -86,15 +86,20 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "CreateNoteAfter", actionName: "CreateNoteAfter",
defaultShortcuts: ["Mod+O"] defaultShortcuts: ["CommandOrControl+O"]
}, },
{ {
actionName: "CreateNoteInto", actionName: "CreateNoteInto",
defaultShortcuts: ["Mod+P"] defaultShortcuts: ["CommandOrControl+P"]
},
{
actionName: "CreateNoteIntoDayNote",
defaultShortcuts: ["global:CommandOrControl+Alt+P"],
description: "Create and open subnote of a current day note"
}, },
{ {
actionName: "ScrollToActiveNote", actionName: "ScrollToActiveNote",
defaultShortcuts: ["Mod+."] defaultShortcuts: ["CommandOrControl+."]
}, },
{ {
actionName: "CollapseTree", actionName: "CollapseTree",
@ -106,26 +111,26 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "RunCurrentNote", actionName: "RunCurrentNote",
defaultShortcuts: ["Mod+return"] defaultShortcuts: ["CommandOrControl+return"]
}, },
{ {
actionName: "ClipboardCopy", actionName: "ClipboardCopy",
defaultShortcuts: ["Mod+C"], defaultShortcuts: ["CommandOrControl+C"],
description: "Copy selected notes to the clipboard" description: "Copy selected notes to the clipboard"
}, },
{ {
actionName: "ClipboardPaste", actionName: "ClipboardPaste",
defaultShortcuts: ["Mod+V"], defaultShortcuts: ["CommandOrControl+V"],
description: "Paste notes from the clipboard into active note" description: "Paste notes from the clipboard into active note"
}, },
{ {
actionName: "ClipboardCut", actionName: "ClipboardCut",
defaultShortcuts: ["Mod+X"], defaultShortcuts: ["CommandOrControl+X"],
description: "Copy selected notes to the clipboard" description: "Copy selected notes to the clipboard"
}, },
{ {
actionName: "SelectAllNotesInParent", actionName: "SelectAllNotesInParent",
defaultShortcuts: ["Mod+A"], defaultShortcuts: ["CommandOrControl+A"],
description: "Select all notes from the current note level" description: "Select all notes from the current note level"
}, },
{ {
@ -133,30 +138,30 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "Undo", actionName: "Undo",
defaultShortcuts: ["Mod+Z"], defaultShortcuts: ["CommandOrControl+Z"],
description: "Undo last text operation (applicable on MacOS only)" description: "Undo last text operation (applicable on MacOS only)"
}, },
{ {
actionName: "Redo", actionName: "Redo",
defaultShortcuts: ["Mod+Y"], defaultShortcuts: ["CommandOrControl+Y"],
description: "Undo last text operation (applicable on MacOS only)" description: "Undo last text operation (applicable on MacOS only)"
}, },
{ {
actionName: "AddLinkToText", actionName: "AddLinkToText",
defaultShortcuts: ["Mod+L"], defaultShortcuts: ["CommandOrControl+L"],
description: "Open dialog to add link to the text" description: "Open dialog to add link to the text"
}, },
{ {
actionName: "CloneNotesTo", actionName: "CloneNotesTo",
defaultShortcuts: ["Mod+Shift+C"] defaultShortcuts: ["CommandOrControl+Shift+C"]
}, },
{ {
actionName: "MoveNotesTo", actionName: "MoveNotesTo",
defaultShortcuts: ["Mod+Shift+C"] defaultShortcuts: ["CommandOrControl+Shift+C"]
}, },
{ {
actionName: "SearchNotes", actionName: "SearchNotes",
defaultShortcuts: ["Mod+S"] defaultShortcuts: ["CommandOrControl+S"]
}, },
{ {
actionName: "ShowSQLConsole", actionName: "ShowSQLConsole",
@ -164,7 +169,7 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "RunSQL", actionName: "RunSQL",
defaultShortcuts: ["Mod+return"] defaultShortcuts: ["CommandOrControl+return"]
}, },
{ {
actionName: "InsertDateTime", actionName: "InsertDateTime",
@ -172,15 +177,15 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "ReloadApp", actionName: "ReloadApp",
defaultShortcuts: ["F5", "Mod+R"] defaultShortcuts: ["F5", "CommandOrControl+R"]
}, },
{ {
actionName: "OpenDevTools", actionName: "OpenDevTools",
defaultShortcuts: ["Mod+Shift+I"] defaultShortcuts: ["CommandOrControl+Shift+I"]
}, },
{ {
actionName: "FindInText", actionName: "FindInText",
defaultShortcuts: ["Mod+F"] defaultShortcuts: ["CommandOrControl+F"]
}, },
{ {
actionName: "ToggleFullscreen", actionName: "ToggleFullscreen",
@ -192,22 +197,22 @@ const DEFAULT_KEYBOARD_ACTIONS = [
}, },
{ {
actionName: "ZoomOut", actionName: "ZoomOut",
defaultShortcuts: ["Mod+-"] defaultShortcuts: ["CommandOrControl+-"]
}, },
{ {
actionName: "ZoomIn", actionName: "ZoomIn",
defaultShortcuts: ["Mod+="] defaultShortcuts: ["CommandOrControl+="]
}, },
{ {
actionName: "MarkdownToHTML", actionName: "MarkdownToHTML",
defaultShortcuts: ["Mod+Return"] defaultShortcuts: ["CommandOrControl+Return"]
}, },
]; ];
if (process.platform === "darwin") { if (process.platform === "darwin") {
for (const action of DEFAULT_KEYBOARD_ACTIONS) { for (const action of DEFAULT_KEYBOARD_ACTIONS) {
if (action.defaultShortcuts) { if (action.defaultShortcuts) {
action.defaultShortcuts = action.defaultShortcuts.map(shortcut => shortcut.replace("Mod", "Meta")); action.defaultShortcuts = action.defaultShortcuts.map(shortcut => shortcut.replace("CommandOrControl", "Meta"));
} }
} }
@ -218,7 +223,7 @@ if (process.platform === "darwin") {
else { else {
for (const action of DEFAULT_KEYBOARD_ACTIONS) { for (const action of DEFAULT_KEYBOARD_ACTIONS) {
if (action.defaultShortcuts) { if (action.defaultShortcuts) {
action.defaultShortcuts = action.defaultShortcuts.map(shortcut => shortcut.replace("Mod", "Ctrl")); action.defaultShortcuts = action.defaultShortcuts.map(shortcut => shortcut.replace("CommandOrControl", "Ctrl"));
} }
} }
} }

View File

@ -100,7 +100,9 @@ async function initStartupOptions() {
} }
function getKeyboardDefaultOptions() { function getKeyboardDefaultOptions() {
return keyboardActions.DEFAULT_KEYBOARD_ACTIONS.map(ka => { return keyboardActions.DEFAULT_KEYBOARD_ACTIONS
.filter(ka => !!ka.actionName)
.map(ka => {
return { return {
name: "keyboardShortcuts" + ka.actionName, name: "keyboardShortcuts" + ka.actionName,
value: JSON.stringify(ka.defaultShortcuts), value: JSON.stringify(ka.defaultShortcuts),