2018-03-26 23:25:54 -04:00
|
|
|
import noteDetailService from "./note_detail.js";
|
2018-04-01 20:33:10 -04:00
|
|
|
import treeChangesService from "./branches.js";
|
2018-03-26 23:25:54 -04:00
|
|
|
import treeService from "./tree.js";
|
2018-12-12 20:54:58 +01:00
|
|
|
import hoistedNoteService from "./hoisted_note.js";
|
2019-05-03 20:27:38 +02:00
|
|
|
import clipboard from "./clipboard.js";
|
2019-11-24 22:01:10 +01:00
|
|
|
import utils from "./utils.js";
|
2019-11-21 22:24:07 +01:00
|
|
|
import keyboardActionService from "./keyboard_actions.js";
|
2018-03-26 23:25:54 -04:00
|
|
|
|
2019-11-21 22:24:07 +01:00
|
|
|
const fixedKeyBindings = {
|
|
|
|
// code below shouldn't be necessary normally, however there's some problem with interaction with context menu plugin
|
|
|
|
// after opening context menu, standard shortcuts don't work, but they are detected here
|
|
|
|
// so we essentially takeover the standard handling with our implementation.
|
|
|
|
"left": node => {
|
|
|
|
node.navigate($.ui.keyCode.LEFT, true).then(treeService.clearSelectedNodes);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
"right": node => {
|
|
|
|
node.navigate($.ui.keyCode.RIGHT, true).then(treeService.clearSelectedNodes);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
"up": node => {
|
|
|
|
node.navigate($.ui.keyCode.UP, true).then(treeService.clearSelectedNodes);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
"down": node => {
|
|
|
|
node.navigate($.ui.keyCode.DOWN, true).then(treeService.clearSelectedNodes);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const templates = {
|
2019-11-22 22:35:59 +01:00
|
|
|
"DeleteNotes": node => {
|
2019-06-16 18:07:22 +02:00
|
|
|
treeChangesService.deleteNodes(treeService.getSelectedOrActiveNodes(node));
|
2018-03-26 23:25:54 -04:00
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"MoveNoteUp": node => {
|
2018-03-26 23:25:54 -04:00
|
|
|
const beforeNode = node.getPrevSibling();
|
|
|
|
|
|
|
|
if (beforeNode !== null) {
|
|
|
|
treeChangesService.moveBeforeNode([node], beforeNode);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"MoveNoteDown": node => {
|
2019-03-18 21:59:53 +01:00
|
|
|
const afterNode = node.getNextSibling();
|
2018-03-26 23:25:54 -04:00
|
|
|
if (afterNode !== null) {
|
|
|
|
treeChangesService.moveAfterNode([node], afterNode);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"MoveNoteUpInHierarchy": node => {
|
2018-03-26 23:25:54 -04:00
|
|
|
treeChangesService.moveNodeUpInHierarchy(node);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"MoveNoteDownInHierarchy": node => {
|
2019-03-18 21:59:53 +01:00
|
|
|
const toNode = node.getPrevSibling();
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
if (toNode !== null) {
|
|
|
|
treeChangesService.moveToNode([node], toNode);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"AddNoteAboveToSelection": () => {
|
2018-10-31 23:55:14 +01:00
|
|
|
const node = treeService.getFocusedNode();
|
|
|
|
|
2019-06-10 21:47:08 +02:00
|
|
|
if (!node) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (node.isActive()) {
|
|
|
|
node.setSelected(true);
|
|
|
|
}
|
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
const prevSibling = node.getPrevSibling();
|
2018-03-26 23:25:54 -04:00
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
if (prevSibling) {
|
|
|
|
prevSibling.setActive(true, {noEvents: true});
|
|
|
|
|
|
|
|
if (prevSibling.isSelected()) {
|
2018-03-26 23:25:54 -04:00
|
|
|
node.setSelected(false);
|
|
|
|
}
|
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
prevSibling.setSelected(true);
|
|
|
|
}
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"AddNoteBelowToSelection": () => {
|
2018-10-31 23:55:14 +01:00
|
|
|
const node = treeService.getFocusedNode();
|
|
|
|
|
2019-06-10 21:47:08 +02:00
|
|
|
if (!node) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (node.isActive()) {
|
|
|
|
node.setSelected(true);
|
|
|
|
}
|
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
const nextSibling = node.getNextSibling();
|
|
|
|
|
|
|
|
if (nextSibling) {
|
|
|
|
nextSibling.setActive(true, {noEvents: true});
|
2018-03-26 23:25:54 -04:00
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
if (nextSibling.isSelected()) {
|
2018-03-26 23:25:54 -04:00
|
|
|
node.setSelected(false);
|
|
|
|
}
|
|
|
|
|
2019-11-24 22:01:10 +01:00
|
|
|
nextSibling.setSelected(true);
|
|
|
|
}
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"CollapseSubtree": node => {
|
2018-03-26 23:25:54 -04:00
|
|
|
treeService.collapseTree(node);
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"SortChildNotes": node => {
|
2018-03-26 23:25:54 -04:00
|
|
|
treeService.sortAlphabetically(node.data.noteId);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"SelectAllNotesInParent": node => {
|
2018-03-26 23:25:54 -04:00
|
|
|
for (const child of node.getParent().getChildren()) {
|
|
|
|
child.setSelected(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"CopyNotesToClipboard": node => {
|
2019-06-16 18:07:22 +02:00
|
|
|
clipboard.copy(treeService.getSelectedOrActiveNodes(node));
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"CutNotesToClipboard": node => {
|
2019-06-16 18:07:22 +02:00
|
|
|
clipboard.cut(treeService.getSelectedOrActiveNodes(node));
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"PasteNotesFromClipboard": node => {
|
2019-05-03 20:27:38 +02:00
|
|
|
clipboard.pasteInto(node);
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"EditNoteTitle": node => {
|
2018-09-07 10:50:05 +02:00
|
|
|
noteDetailService.focusOnTitle();
|
2018-03-26 23:25:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
},
|
2019-11-21 22:24:07 +01:00
|
|
|
"ActivateParentNote": async node => {
|
2019-04-16 21:40:04 +02:00
|
|
|
if (!await hoistedNoteService.isRootNode(node)) {
|
2018-03-26 23:25:54 -04:00
|
|
|
node.getParent().setActive().then(treeService.clearSelectedNodes);
|
|
|
|
}
|
2019-11-21 22:24:07 +01:00
|
|
|
}
|
|
|
|
};
|
2018-03-26 23:25:54 -04:00
|
|
|
|
2019-11-21 22:24:07 +01:00
|
|
|
async function getKeyboardBindings() {
|
|
|
|
const bindings = Object.assign({}, fixedKeyBindings);
|
2018-03-26 23:25:54 -04:00
|
|
|
|
2019-11-21 22:24:07 +01:00
|
|
|
for (const actionName in templates) {
|
|
|
|
const action = await keyboardActionService.getAction(actionName);
|
2019-11-19 21:11:20 +01:00
|
|
|
|
2019-11-21 22:24:07 +01:00
|
|
|
for (const shortcut of action.effectiveShortcuts || []) {
|
2019-11-24 22:01:10 +01:00
|
|
|
const normalizedShortcut = utils.normalizeShortcut(shortcut);
|
|
|
|
|
|
|
|
bindings[normalizedShortcut] = templates[actionName];
|
2019-11-21 22:24:07 +01:00
|
|
|
}
|
2018-03-26 23:25:54 -04:00
|
|
|
}
|
|
|
|
|
2019-11-21 22:24:07 +01:00
|
|
|
return bindings;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default {
|
|
|
|
getKeyboardBindings
|
|
|
|
};
|