Skip to content

Commit a1f6721

Browse files
committed
快捷键支持配置
1 parent ab2845e commit a1f6721

2 files changed

Lines changed: 111 additions & 19 deletions

File tree

3.98 KB
Binary file not shown.

iframe/script/User_config/Menu_Config.js

Lines changed: 111 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -281,27 +281,119 @@ function showSettingsModal(editor, light_theme, dark_theme) {
281281
contentPane.appendChild(row);
282282
} else if (activeMenu === 'shortcuts') {
283283
section('快捷键');
284-
const platform = typeof getPlatform === 'function' ? getPlatform() : 'windows';
285-
const shortcuts = typeof loadShortcuts === 'function' ? (async () => { try { return await loadShortcuts(); } catch(e) { return null; } })() : null;
286-
(async () => {
287-
const sc = await shortcuts;
288-
if (!sc) {
289-
const err = document.createElement('div');
290-
err.textContent = '无法加载快捷键配置。'; err.style.cssText = 'font-size:12px;color:var(--eext-text-secondary);';
291-
contentPane.appendChild(err); return;
284+
var platform = typeof getPlatform === 'function' ? getPlatform() : 'windows';
285+
var platformLabel = platform === 'mac' ? 'macOS' : 'Windows';
286+
287+
var infoDiv = document.createElement('div');
288+
infoDiv.style.cssText = 'font-size:11px;color:var(--eext-text-secondary);margin-bottom:10px;';
289+
infoDiv.textContent = '当前平台: ' + platformLabel + ',点击快捷键输入框后按下新组合键即可修改';
290+
contentPane.appendChild(infoDiv);
291+
292+
var list = document.createElement('div');
293+
list.style.cssText = 'display:flex;flex-direction:column;gap:6px;';
294+
contentPane.appendChild(list);
295+
296+
var shortcutsData = null;
297+
298+
async function renderShortcuts() {
299+
list.innerHTML = '<div style="font-size:12px;color:var(--eext-text-secondary);text-align:center;padding:12px;">加载中...</div>';
300+
try {
301+
shortcutsData = typeof loadShortcuts === 'function' ? await loadShortcuts() : null;
302+
if (!shortcutsData) {
303+
list.innerHTML = '<div style="font-size:12px;color:var(--eext-text-secondary);text-align:center;padding:12px;">无法加载快捷键配置</div>';
304+
return;
305+
}
306+
list.innerHTML = '';
307+
Object.entries(shortcutsData).forEach(function(entry) {
308+
var key = entry[0];
309+
var cfg = entry[1];
310+
var row = document.createElement('div');
311+
row.style.cssText = 'display:flex;justify-content:space-between;align-items:center;padding:6px 8px;background:var(--eext-bg-item);border:1px solid var(--eext-border);border-radius:2px;';
312+
313+
var desc = document.createElement('span');
314+
desc.textContent = cfg.description;
315+
desc.style.cssText = 'font-size:12px;color:var(--eext-text-primary);flex:1;';
316+
317+
var input = document.createElement('input');
318+
input.type = 'text';
319+
input.value = cfg[platform] || key;
320+
input.readOnly = true;
321+
input.style.cssText = 'width:155px;height:24px;padding:0 8px;background:var(--eext-bg-input);color:var(--eext-text-primary);border:1px solid var(--eext-border);border-radius:2px;font-size:11px;font-family:monospace;text-align:center;cursor:pointer;user-select:none;';
322+
323+
input.addEventListener('focus', function() { window.keyboardShortcutsModalOpen = true; });
324+
input.addEventListener('blur', function() { window.keyboardShortcutsModalOpen = false; });
325+
input.addEventListener('keydown', function(e) {
326+
e.preventDefault();
327+
e.stopPropagation();
328+
var keys = [];
329+
if (e.ctrlKey) keys.push('Ctrl');
330+
if (e.shiftKey) keys.push('Shift');
331+
if (e.altKey) keys.push('Alt');
332+
if (e.metaKey) keys.push(platform === 'mac' ? 'Command' : 'Meta');
333+
var keyName = e.key;
334+
if (keyName && !['Control','Shift','Alt','Meta'].includes(keyName)) {
335+
if (keyName === ' ') keyName = 'Space';
336+
else if (keyName.length === 1) keyName = keyName.toUpperCase();
337+
keys.push(keyName);
338+
}
339+
if (keys.length > 0 && keys[keys.length - 1] !== 'Control' && keys[keys.length - 1] !== 'Shift' && keys[keys.length - 1] !== 'Alt' && keys[keys.length - 1] !== 'Meta' && keys[keys.length - 1] !== 'Command') {
340+
input.value = keys.join('+');
341+
shortcutsData[key][platform] = input.value;
342+
}
343+
});
344+
345+
row.appendChild(desc);
346+
row.appendChild(input);
347+
list.appendChild(row);
348+
});
349+
} catch(e) {
350+
list.innerHTML = '<div style="font-size:12px;color:var(--eext-error);text-align:center;padding:12px;">加载失败: ' + e.message + '</div>';
292351
}
293-
Object.entries(sc).forEach(([key, cfg]) => {
294-
const row = document.createElement('div');
295-
row.style.cssText = 'display:flex;align-items:center;gap:8px;padding:4px 0;';
296-
const desc = document.createElement('span');
297-
desc.textContent = cfg.description; desc.style.cssText = 'font-size:12px;color:var(--eext-text-primary);flex:1;';
298-
const kb = document.createElement('span');
299-
kb.textContent = cfg[platform] || cfg.key || key;
300-
kb.style.cssText = 'font-size:11px;color:var(--eext-text-secondary);font-family:monospace;background:var(--eext-bg-item);padding:2px 6px;border-radius:2px;';
301-
row.appendChild(desc); row.appendChild(kb);
302-
contentPane.appendChild(row);
352+
}
353+
renderShortcuts();
354+
355+
var btnRow = document.createElement('div');
356+
btnRow.style.cssText = 'display:flex;gap:8px;margin-top:12px;';
357+
358+
var resetBtn = document.createElement('button');
359+
resetBtn.textContent = '恢复默认';
360+
resetBtn.style.cssText = 'height:28px;padding:0 10px;min-width:96px;background:var(--eext-btn-bg);color:var(--eext-text-primary);border:1px solid var(--eext-btn-border);border-radius:2px;cursor:pointer;font-size:12px;';
361+
resetBtn.onclick = async function() {
362+
var result = await Swal.fire({
363+
title: '确认恢复默认',
364+
html: '确定要恢复默认快捷键设置吗?当前的自定义设置将会丢失。',
365+
icon: 'warning',
366+
showCancelButton: true,
367+
confirmButtonText: '确认',
368+
cancelButtonText: '取消',
303369
});
304-
})();
370+
if (!result.isConfirmed) return;
371+
if (typeof resetShortcuts === 'function') {
372+
shortcutsData = await resetShortcuts();
373+
} else {
374+
shortcutsData = null;
375+
}
376+
await renderShortcuts();
377+
eda.sys_Message.showToastMessage('已恢复默认快捷键', 'success', 1);
378+
};
379+
btnRow.appendChild(resetBtn);
380+
381+
var saveBtn = document.createElement('button');
382+
saveBtn.textContent = '保存';
383+
saveBtn.style.cssText = 'height:28px;padding:0 10px;min-width:96px;background:var(--eext-brand);color:#fff;border:1px solid var(--eext-brand);border-radius:2px;cursor:pointer;font-size:12px;';
384+
saveBtn.onclick = async function() {
385+
if (typeof saveShortcuts === 'function') {
386+
var success = await saveShortcuts(shortcutsData);
387+
if (success) {
388+
eda.sys_Message.showToastMessage('快捷键设置已保存,请重新打开窗口以应用更改', 'success', 3);
389+
} else {
390+
eda.sys_Message.showToastMessage('保存失败', 'error', 2);
391+
}
392+
}
393+
};
394+
btnRow.appendChild(saveBtn);
395+
396+
contentPane.appendChild(btnRow);
305397
} else if (activeMenu === 'plugins') {
306398
section('插件管理');
307399
var list = document.createElement('div');

0 commit comments

Comments
 (0)