trilium/src/public/javascripts/services/tree_keybindings.js

169 lines
4.3 KiB
JavaScript
Raw Normal View History

import noteDetailService from "./note_detail.js";
2018-04-02 08:33:10 +08:00
import treeChangesService from "./branches.js";
import treeService from "./tree.js";
2018-04-02 08:50:58 +08:00
import editBranchPrefixDialog from "../dialogs/branch_prefix.js";
import hoistedNoteService from "./hoisted_note.js";
2019-05-04 02:27:38 +08:00
import clipboard from "./clipboard.js";
const keyBindings = {
"del": node => {
2018-04-01 11:08:22 +08:00
treeChangesService.deleteNodes(treeService.getSelectedNodes(true));
},
"ctrl+up": node => {
const beforeNode = node.getPrevSibling();
if (beforeNode !== null) {
treeChangesService.moveBeforeNode([node], beforeNode);
}
return false;
},
"ctrl+down": node => {
const afterNode = node.getNextSibling();
if (afterNode !== null) {
treeChangesService.moveAfterNode([node], afterNode);
}
return false;
},
"ctrl+left": node => {
treeChangesService.moveNodeUpInHierarchy(node);
return false;
},
"ctrl+right": node => {
const toNode = node.getPrevSibling();
if (toNode !== null) {
treeChangesService.moveToNode([node], toNode);
}
return false;
},
"shift+up": () => {
const node = treeService.getFocusedNode();
if (!node) {
return;
}
if (node.isActive()) {
node.setSelected(true);
}
node.navigate($.ui.keyCode.UP, false).then(() => {
const currentNode = treeService.getFocusedNode();
if (currentNode.isSelected()) {
node.setSelected(false);
}
currentNode.setSelected(true);
});
return false;
},
"shift+down": () => {
const node = treeService.getFocusedNode();
if (!node) {
return;
}
if (node.isActive()) {
node.setSelected(true);
}
node.navigate($.ui.keyCode.DOWN, false).then(() => {
const currentNode = treeService.getFocusedNode();
if (currentNode.isSelected()) {
node.setSelected(false);
}
currentNode.setSelected(true);
});
return false;
},
"f2": node => {
2018-04-02 08:50:58 +08:00
editBranchPrefixDialog.showDialog(node);
},
"alt+-": node => {
treeService.collapseTree(node);
},
"alt+s": node => {
treeService.sortAlphabetically(node.data.noteId);
return false;
},
"ctrl+a": node => {
for (const child of node.getParent().getChildren()) {
child.setSelected(true);
}
return false;
},
"ctrl+c": () => {
2019-05-04 02:27:38 +08:00
clipboard.copy(treeService.getSelectedNodes());
return false;
},
"ctrl+x": () => {
2019-05-04 02:27:38 +08:00
clipboard.cut(treeService.getSelectedNodes());
return false;
},
"ctrl+v": node => {
2019-05-04 02:27:38 +08:00
clipboard.pasteInto(node);
return false;
},
"return": node => {
noteDetailService.focusOnTitle();
return false;
},
"backspace": async node => {
if (!await hoistedNoteService.isRootNode(node)) {
node.getParent().setActive().then(treeService.clearSelectedNodes);
}
},
"ctrl+h": node => {
hoistedNoteService.getHoistedNoteId().then(hoistedNoteId => {
if (node.data.noteId === hoistedNoteId) {
2018-12-16 03:29:08 +08:00
hoistedNoteService.unhoist();
}
else {
hoistedNoteService.setHoistedNoteId(node.data.noteId);
}
});
return false;
},
// 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;
}
};
export default keyBindings;