101 lines
4.2 KiB
JavaScript
101 lines
4.2 KiB
JavaScript
// MNote filetree keyboard 运行时外置模块。
|
|
// 承接 filetree keydown 处理和 clipboard 状态管理。
|
|
// inline script 保留完整 fallback。
|
|
|
|
// ─── Clipboard 状态 ─────────────────────────────────────
|
|
|
|
var sidebarFileTreeClipboard = null;
|
|
|
|
function getSidebarFileTreeClipboard() {
|
|
return sidebarFileTreeClipboard;
|
|
}
|
|
|
|
function setSidebarFileTreeClipboard(action, rowIds) {
|
|
sidebarFileTreeClipboard = { action: action, rowIds: rowIds };
|
|
document.documentElement.setAttribute('data-mnote-filetree-clipboard-action', action);
|
|
return sidebarFileTreeClipboard;
|
|
}
|
|
|
|
function clearSidebarFileTreeClipboard() {
|
|
sidebarFileTreeClipboard = null;
|
|
document.documentElement.removeAttribute('data-mnote-filetree-clipboard-action');
|
|
}
|
|
|
|
// ─── Keyboard handler ───────────────────────────────────
|
|
|
|
function handleFileTreeKeyDown(event, deps) {
|
|
deps = deps || {};
|
|
var closestAction = deps.closestAction || function() { return null; };
|
|
var beginFileTreeInlineRename = deps.beginFileTreeInlineRename || function() {};
|
|
var selectedSidebarFileTreeRows = deps.selectedSidebarFileTreeRows || function() { return []; };
|
|
var buildSidebarFileTreeContext = deps.buildSidebarFileTreeContext || function() { return {}; };
|
|
var evaluateSidebarFileTreeWhen = deps.evaluateSidebarFileTreeWhen || function() { return false; };
|
|
var deleteSelectedSidebarFileTreeRows = deps.deleteSelectedSidebarFileTreeRows || function() { return Promise.resolve(); };
|
|
|
|
var keyTarget = event.target;
|
|
var fileTreeRootForKey = document.getElementById('sidebar-file-tree-root');
|
|
var fileTreeRowForKey = closestAction(keyTarget, '.tree-row[data-shell-mode="filetree"]');
|
|
if (!fileTreeRowForKey && fileTreeRootForKey && fileTreeRootForKey.contains(document.activeElement)) {
|
|
fileTreeRowForKey = closestAction(document.activeElement, '.tree-row[data-shell-mode="filetree"]');
|
|
}
|
|
if (!fileTreeRowForKey) return false;
|
|
|
|
if (event.key === 'F2') {
|
|
event.preventDefault();
|
|
var renameCtx = buildSidebarFileTreeContext('filetree', { targetRow: fileTreeRowForKey });
|
|
if (!evaluateSidebarFileTreeWhen(renameCtx, '!workspace.readonly && !editor.dirty')) {
|
|
return true;
|
|
}
|
|
beginFileTreeInlineRename(fileTreeRowForKey);
|
|
return true;
|
|
}
|
|
|
|
if ((event.ctrlKey || event.metaKey) && !event.altKey && event.key) {
|
|
var shortcutKey = event.key.toLowerCase();
|
|
if (shortcutKey === 'c' || shortcutKey === 'x') {
|
|
var selectedRows = selectedSidebarFileTreeRows();
|
|
var selectedRowIds = selectedRows.map(function(row) {
|
|
return row.getAttribute('data-row-id') || '';
|
|
}).filter(Boolean);
|
|
if (selectedRowIds.length > 0) {
|
|
event.preventDefault();
|
|
setSidebarFileTreeClipboard(shortcutKey === 'x' ? 'cut' : 'copy', selectedRowIds);
|
|
}
|
|
return true;
|
|
}
|
|
if (shortcutKey === 'v') {
|
|
event.preventDefault();
|
|
var pasteCtx = buildSidebarFileTreeContext('filetree', { targetRow: fileTreeRowForKey });
|
|
if (!evaluateSidebarFileTreeWhen(pasteCtx, '!workspace.readonly')) {
|
|
return true;
|
|
}
|
|
if (typeof deps.pasteSidebarFileTreeClipboard === 'function') {
|
|
void deps.pasteSidebarFileTreeClipboard(fileTreeRowForKey);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (event.key === 'Delete' || event.key === 'Backspace') {
|
|
event.preventDefault();
|
|
var delCtx = buildSidebarFileTreeContext('filetree', { targetRow: fileTreeRowForKey });
|
|
if (!evaluateSidebarFileTreeWhen(delCtx, '!workspace.readonly && !editor.dirty')) {
|
|
return true;
|
|
}
|
|
void deleteSelectedSidebarFileTreeRows(fileTreeRowForKey);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ─── 导出 ───────────────────────────────────────────────
|
|
|
|
window.__mnoteFileTreeKeyboardRuntime = {
|
|
sidebarFileTreeClipboard: sidebarFileTreeClipboard,
|
|
getSidebarFileTreeClipboard: getSidebarFileTreeClipboard,
|
|
setSidebarFileTreeClipboard: setSidebarFileTreeClipboard,
|
|
clearSidebarFileTreeClipboard: clearSidebarFileTreeClipboard,
|
|
handleFileTreeKeyDown: handleFileTreeKeyDown,
|
|
};
|