// ========================================= // =============== 全局配置项 =============== // ========================================= import QtQuick 2.15 import GlobalConfigsConnector 1.0 import PluginsConnector 1.0 import "../Configs" import "../ApiManager" Configs { id: gRoot category_: "Global" autoLoad: false // ========================= 【全局配置项】 ========================= configDict: { // 快捷方式 "shortcut": { "title": qsTr("快捷方式"), "type": "group", "desktop": { "title": qsTr("桌面"), "default": false, "onChanged": (newFlag, oldFlag)=>{ if(oldFlag !== undefined) return changeShortcut(newFlag, "desktop") }, }, "startMenu": { "title": qsTr("开始菜单"), "default": false, "onChanged": (newFlag, oldFlag)=>{ if(oldFlag !== undefined) return changeShortcut(newFlag, "startMenu") }, }, "startup": { "title": qsTr("开机自启"), "default": false, "onChanged": (newFlag, oldFlag)=>{ if(oldFlag !== undefined) return changeShortcut(newFlag, "startup") }, }, }, // 界面和外观 "ui": { "title": qsTr("界面和外观"), "type": "group", "i18n": getI18n, "theme": { "title": qsTr("主题"), "optionsList": theme.manager.getOptionsList(), // 从全局主题管理器中取列表 "onChanged": (val, old)=>{ theme.manager.switchTheme(val) if(old) qmlapp.popup.simple(qsTr("切换主题"), val) }, }, "fontBtn": { "title": qsTr("字体"), "btnsList": [ { "text":qsTr("修改字体"), "onClicked": openFontPanel, "textColorKey":"specialTextColor", }, ], }, "fontFamily": { "default": "Microsoft YaHei", "onChanged": (val)=>{ theme.fontFamily = val }, }, "dataFontFamily": { "default": "Microsoft YaHei", "onChanged": (val)=>{ theme.dataFontFamily = val }, }, "scale": { "title": qsTr("界面与文字大小"), "default": 1, "optionsList": [ [0.5, "50%"], [0.75, "75%"], [0.9, "90%"], [1, "100%"], [1.1, "110%"], [1.25, "125%"], [1.5, "150%"], ], "onChanged": (val)=>{ size_.scale = val }, }, "opengl": { "title": qsTr("渲染器"), "save": false, "default": getOpengl(), "optionsList": [ ["AA_UseSoftwareOpenGL", qsTr("关闭硬件加速")], ["AA_UseDesktopOpenGL", "Desktop OpenGL"], ["AA_UseOpenGLES", "OpenGL ES"], ], "toolTip": qsTr("若出现界面闪烁、元素错位等界面异常,尝试切换渲染器或者关闭硬件加速"), "onChanged": (opt, old)=>{ old!==undefined && setOpengl(opt) }, }, "disableEffect": { "title": qsTr("禁用美化效果"), "default": false, "toolTip": qsTr("在低配置机器上,禁用动画、阴影等效果可减少部分资源占用"), "onChanged": (flag)=>{ qmlapp.enabledEffect = !flag }, }, "imgShowOverlay": { "title": qsTr("图片预览默认显示叠加层"), "default": true, "toolTip": qsTr("默认开启/关闭叠加层显示\n对所有图片预览组件生效"), } }, // 窗口 "window": { "title": qsTr("窗口"), "type": "group", "startupInvisible": { "title": qsTr("启动时缩小到任务栏"), "default": false, "toolTip": qsTr("软件启动时,不弹出主窗口"), }, "isMainWindowTop": { "title": qsTr("窗口置顶"), "default": false, "toolTip": qsTr("捷径:窗口左上角图钉"), "onChanged": (val)=>{ mainWindowRoot.isMainWindowTop = val }, }, "barIsLock": { "title": qsTr("锁定标签栏"), "default": false, "toolTip": qsTr("捷径:窗口右上角小锁"), "onChanged": (val)=>{ qmlapp.tab.barIsLock = val }, }, "closeWin2Hide": { "title": qsTr("关闭主窗口时"), "optionsList": [ [true, qsTr("最小化到系统托盘")], [false, qsTr("退出应用")], ], }, "hideTrayIcon": { "title": qsTr("隐藏托盘图标"), "toolTip": qsTr("若要弹出位于后台的软件窗口,请在文件管理器中重复启动软件。\n若要彻底退出软件,请从任务管理器中结束进程。"), "default": false, "onChanged": changeHideTrayIcon, }, "simpleNotificationType": utilsDicts.getSimpleNotificationType(true), "geometry": { // 存放主窗位置大小,字符串格式 "x,y,w,h" "type": "var", "default": "", // 如: 300,20,500,300 }, "messageMemory": { // 存放“不再弹出”的消息弹窗的mid "type": "var", "default": [], // 如: ["aaa", "bbb"] }, "doubleLayout": { // 存放 Double__Layout 的 hide 信息 "type": "var", "default": {}, // 如: {"ScreenshotOCR1": 0, } }, }, // 截图 "screenshot": { "title": qsTr("截图"), "type": "group", "hideWindow": { "title": qsTr("截图前隐藏主窗口"), "toolTip": qsTr("截图前,如果主窗口处于前台,则隐藏主窗口\n将会延时等待主窗口关闭"), "default": true, }, "hideWindowTime": { "title": qsTr("隐藏等待时间"), "default": 0.2, "min": 0, "unit": qsTr("秒"), "isInt": false, "advanced": true, }, }, // 服务 "server": { "title": qsTr("服务"), "type": "group", "enable": { "title": qsTr("允许HTTP服务"), "toolTip": qsTr("Umi-OCR依赖HTTP接口进行本机跨进程通信。如果禁用,将无法使用命令行模式、多开检测等功能。"), "default": true, "onChanged": (val, old)=>{ old!==undefined && qmlapp.popup.simple(qsTr("重启软件后生效"), "") }, }, "host": { "title": qsTr("主机"), "optionsList": [ ["127.0.0.1", qsTr("仅本地")+" (127.0.0.1)"], ["0.0.0.0", qsTr("任何可用地址")], ], "onChanged": (val, old)=>{ if(old!==undefined) { let msg = val==="0.0.0.0"?qsTr("将允许局域网访问。请开启对应防火墙权限!"):qsTr("将禁止局域网访问。") qmlapp.popup.simple(qsTr("重启软件后生效"), msg) } }, }, "port": { "title": qsTr("端口"), "isInt": true, "default": 1224, "max": 65535, "min": 1, // 保存数值,只是用于前端展示。实际端口号由pre_config保存。 "onChanged": (port, old)=>{ old!==undefined && setServerPort(port) }, }, }, // 日志 "logs": { "title": qsTr("日志"), "type": "group", "btns": { "title": qsTr("操作"), "btnsList": [ { "text":qsTr("打开日志保存目录"), "onClicked": globalConfigConn.open_logs_dir, "textColorKey":"specialTextColor", }, ], }, "saveLogLevel": { "title": qsTr("保存的日志级别"), "default": "ERROR", "optionsList": [ ["NONE", "Close"], ["DEBUG", "DEBUG"], ["INFO", "INFO"], ["WARNING", "WARNING"], ["ERROR", "ERROR"], ["CRITICAL", "CRITICAL"], ], "onChanged": (val, old)=>{ // 调整级别,如果修改失败则不动UI if(!globalConfigConn.change_save_log_level(val)) return true if(val === "NONE") qmlapp.popup.simple(qsTr("已禁用日志文件保存"), "") }, }, }, // OCR接口全局设定 "ocr": undefined, // 开发者工具 "developer": { "title": "developer tools", "type": "group", "advanced": true, "textScale": { "title": "languageScale (textScale)", "isInt": false, "default": 1, "max": 10, "min": 0.1, "save": false, "onChanged": (val, old)=>{ if(old!==undefined) size_.textScale = val }, }, }, } // ========================= 【全局单例,通过 qmlapp.globalConfigs.xxx 访问】 ========================= OcrManager { id: ocrManager } // OCR管理器 qmlapp.globalConfigs.ocrManager UtilsConfigDicts { id: utilsDicts } // 通用配置项 qmlapp.globalConfigs.utilsDicts GlobalConfigsConnector { id: globalConfigConn } // 全局设置连接器 PluginsConnector { id: pluginsConnector } // 插件全局设置连接器 property alias ocrManager: ocrManager property alias utilsDicts: utilsDicts property bool isPortInit: false // 标记端口号是否初始化完毕 property var fontPanel: undefined // 缓存字体控制面板组件引用 Component.onCompleted: { // 初始化主题 theme.manager.init() // 加载插件 initPlugins() // 初始化配置项 reload() // 检查权限和异常情况 checkAccess() // 应用OCR信息 if(configDict.ocr) ocrManager.init2() console.log("GlobalConfig 初始化全局配置完毕!") // 延迟执行 Qt.callLater(()=>{ setQmlToCmd() // 将qml模块字典传入cmd执行模块 // 启动web服务 const enab = getValue("server.enable") if(enab) { const host = getValue("server.host") globalConfigConn.runUmiWeb(gRoot, "setRealPort", host) } }) } // 检查权限和异常情况 function checkAccess() { let msg = globalConfigConn.checkAccess() if(msg.length > 0) { msg += "\n" + qsTr("请尝试更换软件路径!") qmlapp.popup.message(qsTr("配置文件读写异常"), msg, "error") } } // 初始化插件 function initPlugins() { // 初始化插件 let pluginInfos = pluginsConnector.init() if(!pluginInfos) return false // 没有加载插件 // 记录失败信息 if(pluginInfos.errors && Object.keys(pluginInfos.errors).length > 0) { const errs = pluginInfos.errors let msg = "" for (let key in errs) { msg += `${key}: ${errs[key]}\n` } qmlapp.popup.message(qsTr("插件加载失败"), msg, "error") } // 成功的插件 if(pluginInfos.options) { // 初始化OCR管理器 if(pluginInfos.options.ocr) ocrManager.init1(pluginInfos.options.ocr) } } // 添加/删除快捷方式 function changeShortcut(flag, position) { if(flag) { const res = globalConfigConn.createShortcut(position) if(res === "[Success]") { qmlapp.popup.simple(qsTr("成功添加快捷方式"), "") } else { qmlapp.popup.message(qsTr("添加快捷方式失败"), res, "error") return true // 阻止变化 } } else { let res = globalConfigConn.deleteShortcut(position) if(res > 0) { qmlapp.popup.simple(qsTr("成功移除 %1 个快捷方式").arg(res), "") } else { qmlapp.popup.message(qsTr("提示"), qsTr("没有找到可移除的快捷方式。"), "warning") } } } // 询问重启软件 function askRebootApp(msg) { const callback = (flag)=>{ flag&&Qt.quit() } const argd = {yesText: "Quit Umi-OCR", noText: "Later"} qmlapp.popup.dialog("", msg, callback, "", argd) } // 初始化i18n参数 property var getI18n: _getI18n() // 转为静态 function _getI18n() { const info = globalConfigConn.i18nGetInfos() const lang = info[0] const langDict = info[1] let optionsList = [] for(let code in langDict) { const text = langDict[code][0] optionsList.push([code, text]) } return { "title": "语言 / Language", "save": false, "default": lang, "optionsList": optionsList, "onChanged": changeI18n, } } // 改变i18n function changeI18n(lang, old) { if(old===undefined) return const flag = globalConfigConn.i18nSetLanguage(lang) if(flag) { const msg = "UI language has been modified. Please reload Umi-OCR to take effect.\n\n已修改界面语言,请重启软件生效。" askRebootApp(msg) } } // 获取渲染器 function getOpengl() { return globalConfigConn.getOpengl() } // 设置渲染器 function setOpengl(opt) { globalConfigConn.setOpengl(opt) const msg = qsTr("渲染器变更 将在重启软件后生效") askRebootApp(msg) } // 设置服务端口号 function setServerPort(port) { if(port===null || port===undefined) { qmlapp.popup.simple(qsTr("端口号不合法"), "") return } if(isPortInit) { // 用户修改,忽略系统修改 globalConfigConn.setServerPort(port) qmlapp.popup.simple(qsTr("重启软件后生效"), qsTr("端口号改为%1").arg(port)) } } // py回调,设置当前实际的端口号 function setRealPort(port1) { const port2 = getValue("server.port") if(port1 !== port2) { setValue("server.port", port1, true) if(advanced) { const msg = qsTr("原端口号%1被占用,\n切换为新端口号%2。\n\n若不想看到此通知,请在全局设置关闭高级模式。").arg(port2).arg(port1) qmlapp.popup.message("", msg, "") } else { console.log(`原端口号${port1}被占用,\n切换为新端口号${port2}。`) } } isPortInit = true } // 将qml模块字典传入cmd执行模块 function setQmlToCmd() { const moduleDict = { "GlobalConfigs": this, "MainWindow": qmlapp.mainWin, "TabViewManager": qmlapp.tab, } globalConfigConn.setQmlToCmd(moduleDict) } // 打开字体控制板 function openFontPanel() { if(fontPanel) { fontPanel.visible = true } } // 改变托盘图标显示 function changeHideTrayIcon(flag, old) { if(flag && old===false) { qmlapp.popup.messageMemory("changeHideTrayIcon", "", configDict.window.hideTrayIcon.toolTip) } qmlapp.systemTray.visible = !flag } }