mirror of
https://github.com/dream-pep/koring-launcher.git
synced 2026-09-12 05:45:18 +08:00
refactor: 迁移组件库至shadcn/ui并新增版本更新功能
迁移项目内所有HeroUI表单组件至shadcn/ui,统一组件风格并修复HeroUI Switch点击无响应的问题 新增全局版本更新弹窗功能,包含状态管理store、全局弹窗组件与调试页面调试工具 优化配置广播逻辑,添加250ms防抖避免频繁触发页面重渲染 新增开发环境下日志直接输出到终端的能力,完善日志输出规则 调整调试模式设置项位置,从高级设置页移动至关于设置页 为背景层添加pointer-events: none,避免遮挡页面点击事件 新增点击拦截诊断工具至资源调试页面,用于排查控件无法点击的问题 更新Koring.yml配置模板,新增advanced.preLaunchCmd字段
This commit is contained in:
+14
-4
@@ -5,6 +5,7 @@
|
||||
* - 默认(非 debug):warn/error/info 输出到控制台,debug 不输出;
|
||||
* - 用户开启「调试模式」(config.advanced.debugMode,设置→游戏→高级):
|
||||
* debug 也输出控制台,并把全部级别写入 userData/koring.log(超过 5MB 自动轮转为 .old);
|
||||
* - 开发(未打包)运行且开启调试模式时:日志额外/直接输出到启动该进程的终端(stdout/stderr);
|
||||
* - 渲染进程经 `log:write`(ipcRenderer.send)汇入同一套格式/文件。
|
||||
*/
|
||||
|
||||
@@ -25,6 +26,9 @@ export interface Logger {
|
||||
|
||||
const MAX_LOG_BYTES = 5 * 1024 * 1024;
|
||||
|
||||
/** 开发(未打包)运行:直接跑在终端里,日志写 stdout/stderr 用户即可实时看到 */
|
||||
const isDevRun = !app.isPackaged;
|
||||
|
||||
let debugModeProvider: () => boolean = () => false;
|
||||
export function setDebugModeProvider(fn: () => boolean): void {
|
||||
debugModeProvider = fn;
|
||||
@@ -109,10 +113,16 @@ function write(scope: string, level: LogLevel, args: unknown[]): void {
|
||||
const line = `[${timestamp()}][${scope}][${level.toUpperCase()}] ${msg}`;
|
||||
|
||||
const enabled = isDebugMode();
|
||||
// debug 仅在调试模式可见;info/warn/error 始终走控制台
|
||||
const showConsole = level !== 'debug' || enabled;
|
||||
if (showConsole) {
|
||||
if (level === 'error') console.error(line);
|
||||
// debug 仅在调试模式可见;info/warn/error 始终输出
|
||||
const show = level !== 'debug' || enabled;
|
||||
if (show) {
|
||||
if (isDevRun) {
|
||||
// dev(未打包,pnpm dev / electron .):直接写进程 stdout/stderr,
|
||||
// 让详细日志实时出现在启动它的终端里(不依赖外部控制台捕获)。
|
||||
const text = `${line}\n`;
|
||||
if (level === 'error' || level === 'warn') process.stderr.write(text);
|
||||
else process.stdout.write(text);
|
||||
} else if (level === 'error') console.error(line);
|
||||
else if (level === 'warn') console.warn(line);
|
||||
else if (level === 'info') console.info(line);
|
||||
else console.debug(line);
|
||||
|
||||
@@ -26,13 +26,26 @@ export function registerConfigHandlers(win: WinRef) {
|
||||
}
|
||||
});
|
||||
|
||||
// 广播防抖:输入框/滑块每键触发 update 时,不立刻全树广播(避免整页重渲染打断交互),
|
||||
// 合并到 250ms 后只广播一次最新配置;渲染端乐观更新保证即时反馈。
|
||||
let broadcastTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
const scheduleBroadcast = () => {
|
||||
if (broadcastTimer) clearTimeout(broadcastTimer);
|
||||
broadcastTimer = setTimeout(() => {
|
||||
broadcastTimer = null;
|
||||
if (win.mainWindow && !win.mainWindow.isDestroyed()) {
|
||||
win.mainWindow.webContents.send('config:changed', getConfig());
|
||||
}
|
||||
}, 250);
|
||||
};
|
||||
|
||||
// 主进程权威更新:渲染进程提交 { section, patch } 补丁,
|
||||
// 主进程深度合并到内存配置 → debounce 稀疏写盘 → 广播完整配置给所有渲染进程
|
||||
// 主进程深度合并到内存配置 → debounce 稀疏写盘 → 防抖广播完整配置给所有渲染进程
|
||||
ipcMain.handle('config:update', (_event, payload: { section: string; patch: unknown }) => {
|
||||
try {
|
||||
const { section, patch } = payload;
|
||||
const config = updateConfig({ [section]: patch } as Record<string, unknown>);
|
||||
win.mainWindow?.webContents.send('config:changed', config);
|
||||
scheduleBroadcast();
|
||||
return { success: true, data: config, error: null };
|
||||
} catch (e: unknown) {
|
||||
return { success: false, data: null, error: String(e) };
|
||||
|
||||
+2
-1
@@ -25,7 +25,8 @@ const { app } = electron;
|
||||
|
||||
const isDev = !app.isPackaged;
|
||||
|
||||
// 统一日志:debug 模式(config.advanced.debugMode)→ 控制台 + userData/koring.log;否则仅控制台
|
||||
// 统一日志:debug 模式(config.advanced.debugMode)→ 控制台 + userData/koring.log;
|
||||
// dev(未打包)运行下直接写进程 stdout/stderr,日志实时输出到启动它的终端;否则仅控制台
|
||||
const log = createLogger('main');
|
||||
setDebugModeProvider(() => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user