@@ -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