新功能
-
存档地图「种子预测」支持高度下拉的 Y 限制:填一个 Y(如 64)后,未探索区域的预测地形也会只显示该高度及以下的地表——高于截断面的山体削成石头平面、水面下沉到截断高度,与已探索区域的真实地表截断效果一致,不再出现「真地图削了、预测图还是完整山脉」的接缝(mimo)
-
存档地图页中间地图改为圆角卡片:四周带圆角和描边,底色不透自定义背景(壁纸/纯色),更像一块独立画布;没有可渲染内容时的空态页同样是一张圆角卡片(mimo)
-
存档地图着色新增「地形」模式:按海拔分层设色(低地绿、山地棕、雪顶白)并叠加山体阴影,山脉河流的起伏像地形图一样一眼看清;水面保持平色、雪和冰保持白色,种子预测区域同样生效(mimo)
-
存档地图「种子预测」放大后精确到方块:放大到 1 像素 = 1 方块时,预测地形不再按 4 格一块上色——群系边界与高度起伏都按单个方块计算,河流海岸线、沙滩边缘不再呈锯齿台阶;概览小图仍走快速路径,不影响打开大地图的速度(mimo)
-
存档地图渲染明显提速:打开大地图、刷新、切换维度时地表出图更快,放大后补清方块细节也更跟手(mimo)
-
修复存档地图放大后中心四周渲完、视野左右等边缘区域不再补细节的问题:重开渲染时正确作废在途瓦片任务,并增加周期补扫,确保可见范围最终都会铺满(mimo)
-
存档地图新增「种子预测」:还没走进去的区域不再是一片空白,而是按世界种子自动生成近似的地表预览——已探索范围内的空洞(含只生成了一部分区块的边缘区域)会无缝补上,真实地形与预测地形之间不再露出空缺;预测画布跟着视角走——以视角中心为圆心向四周铺开约一万格(拖出当前画布后稍等片刻会自动以新位置为中心重画),远处还没走到的地方也能提前看到地形,方便提前看清基地周围的山脉、河流和群系走向;从未去过的维度(比如还没碰过的下界)打开地图也能直接看到一张预测图。第二行新增「种子」开关(默认开启,读不出种子的存档会禁用),状态栏会标注预测了多少区域。注意:预测地形仅供规划参考,实际地形以游戏内为准(mimo)
-
设置>常规设置新增「新手引导」卡片:点击「打开新手引导」按钮可随时重新打开首次启动时的配置向导,重新设置语言、下载源、账户、Java、实例文件夹与界面样式;若在引导中切换语言,启动器会自动重启以生效(opencode)
-
支持把新版安装包直接拖进方块盒子窗口完成安装:识别官方命名的安装包后弹出确认,确认即走与检查更新相同的安装流程,拖入时会显示提示遮罩(mimo)
-
检查更新弹窗的更新说明支持 Markdown 排版并可上下滚动查看全文,不再截断成纯文本(mimo)
-
底部任务栏改为悬浮在页面内容上方:出现时不再把界面顶开,托盘用更通透的毛玻璃底并带轻柔阴影,能自然透出下方界面,不再显得生硬(mimo)
-
修复筛选栏「排序」下拉样式与旁边下拉不一致的问题:样式表里它的一组规则漏写了状态后缀,导致选中项的浅绿底色、边框和箭头样式错误地套在整个控件上(排序下拉看起来发绿、边框偏灰、箭头也不一样),现已补齐,筛选/分类/排序三种下拉外观完全统一;新增样式对比探针验证三者颜色、边框、宽度、高度全一致(mimo)
-
存档地图页木头配色修复(原木/木板逐种区分):此前所有木头只有两个兜底色——原木/茎一律
#6B5233、木板一律#9C7F4E(白桦和云杉同色、下界绯红/诡异茎被涂成棕色),而bamboo_block不含这些后缀还会掉进灰色兜底(竹块显示为灰,观感很怪)。现改为逐种精确配色:从 Minecraft 官方 1.21.11 客户端纹理(PrismarineJS/minecraft-assets 镜像)下载 26 张 16×16 原始纹理(11 种原木侧面 + 去皮橡木/白桦 + 木板 12 种含竹马赛克)计算全像素平均色写入色表,如橡木原木#6D5532、白桦#D8D7D2(浅灰白)、云杉#3A2510(深棕)、丛林#554319(绿棕)、樱花#36212C(暗红棕)、竹块#7F9039(绿黄,修掉灰色)、绯红茎#5C191D(红)、诡异茎#3A3A4D(蓝灰);木板如深色橡木#422B14、樱花#E2B2AC(粉)、诡异#2B6863(青)、绯红#653046(紫红)。未逐种列出的树种兜底同步修正:原木回退橡木色、木板回退#A2824E、去皮原木统一浅棕#9A7F52(与带皮区分)。验证:渲染探针新增第 8 组——直接断言blockColor:白桦比橡木亮 60+、云杉比橡木暗、深色橡木板 <100、樱花板粉亮、竹块绿占优、诡异板青占优、绯红茎红占优、橡木与竹块精确值等于官方平均色、去皮橡木亮于带皮——全部通过;真实存档 93/93 回归(8.4s);页面探针 100 项、压力探针 60/60、主程序全量编译链接通过(mimo) -
本地资源页顶部两行布局统一 + 拖入列表直接导入:实例管理四个子页(存档/截图/资源包/光影包)、实例-模组页、资源中心「本地管理」页统一为行1=搜索框+视图切换+分类(含管理分类按钮),行2=状态/时间/大小/排序+统计标签(本地管理页原本没有搜索框,按名称模糊匹配补上并计入统计);实例管理页去掉「拖入此处」按钮与独立拖入页,改为整页直接接受拖放——把资源包/光影包/存档/截图拖进列表即自动复制导入并刷新(悬停时列表边框主题色虚线高亮,结果提示显示在列表下方;官方安装包仍交给主窗口拖入安装流程,不被本页拦截);窄窗版两页(实例助手/基岩助手资源管理)维持此前两行结构。验证:行为探针扩至 71 项全过(含两行成员归属、按钮移除、acceptDrops 断言),qmake 全量编译链接通过。改动文件:
pages/InstanceFilePage.{h,cpp}、pages/InstanceModsPage.cpp、pages/ContentListPage.{h,cpp}、tests/file_filter_probe/file_filter_probe.cpp(mimo) -
AI 助手页面聊天区里的所有文字现在都带上了描边(欢迎语、你发送的消息、AI 的回答、思考过程、工具步骤卡片、任务清单、引用标签、打字指示器等):文字在浅色/深色背景下都更清晰醒目,流式回答和思考过程与最终排版观感一致(opencode)
-
本地「投影列表」页的每张投影卡片,标签一栏新增投影尺寸(如 5×5×5,即长×宽×高),不用打开编辑页就能一眼看出建筑占地大小(opencode)
-
本地「投影列表」页新增多选批量操作:点一下卡片即可勾选,按住鼠标从一张卡片划到另一张能快速连选,底部还有「全选」按钮;勾选后统计栏和删除按钮会实时显示已选数量,点击「删除选中 (n)」可一次删掉选中的多个投影,不再需要一个一个删(opencode)
-
多维筛选推广补齐最后两页:「服务器」页新增两行统一布局(行1=搜索+分类,行2=排序+统计)——服务器列表支持自定义分类(右键服务器卡片即可设置,键为服务器地址)与按名称/地址正反排序;「投影」页新增两行统一布局(行1=搜索+分类,行2=时间/大小/排序+统计)——投影文件支持按修改时间(7 天/30 天/一年)、大小(<10MB / 10~100MB / >100MB)筛选与名称/大小/时间六向排序,分类下拉带「最近修改」「大文件」智能项,右键投影卡片即可设置分类。两页筛空均显示「没有符合筛选条件」提示;新建分类预设新增「服务器」(生存服/创造服/小游戏等)与「投影」(建筑/内饰/红石机械等)两套模板。至此实例管理侧边栏七个页面全部接入多维筛选。验证:两页与 LocalCategoryManager 单文件编译通过,行为探针 71 项回归全过(mimo)
-
本地「投影列表」页新增瀑布流视图,并给每张卡片自动配上投影的 3D 立体预览封面:打开页面就能一眼认出建筑长什么样,不用逐个打开编辑;封面在后台生成并缓存,滚动浏览不卡顿,再次进入秒开(mimo)
-
投影封面 3D 预览升级为真实材质显示:先用色块快速画出整体轮廓,再自动加载当前实例的资源包/客户端贴图叠加细节;整个投影会完整缩放进封面,不会只显示一角。材质加载在后台进行,不卡界面、不闪退(mimo)
-
投影封面渲染逻辑对齐 WorldEdit 官方预览器 SchematicWebViewer(MIT):叶子/玻璃/台阶等不再错误挡住内部方块,更贴近真实可见面;设置→关于里已写上 SchematicWebViewer、litematic-viewer、Deepslate 等参考项目(mimo)
-
修复投影列表封面「只有一个投影有材质」:材质改为与投影编辑器同一套客户端 jar 图集,整实例只加载一次后所有封面共享,不再各自解压 jar(mimo)
-
AI 助手可配置的服务商从 8 家扩到 40 余家:设置>AI 助手的服务商列表新增 Kimi、豆包、硅基流动、腾讯混元、讯飞星火、MiniMax、Grok、Mistral、Groq、Perplexity 等国内外常用服务商,双击即可填 Key、挑预设模型;配置后模型选择窗口会自动把密钥套到对应模型上(按接口地址精确匹配,硅基流动上的 DeepSeek/Qwen 等不会被官方配置误覆盖)。顺带修正了 Gemini、文心一言的默认接口地址,以及 v2/v3 版本端点拼接错误导致请求打不通的问题(mimo)
-
实例内的模组/资源包/光影包/存档页底部新增「安装新模组/资源包/光影包/存档」按钮:一点即可打开对应的在线下载页,并自动按当前实例的游戏版本与加载器筛好结果,不用再手动挑实例(mimo)
-
实例管理>存档页每张存档卡片右侧新增「版本转化」按钮:不用装任何插件,即可在 Java 版与基岩版之间互转存档——弹窗里可选转换方向、目标版本和打包为 .mcworld/.zip 等选项,会自动识别存档类型并检测 Java 运行时,转换前会提醒先备份,进度条和日志实时显示,完成后一键打开输出文件夹。转换引擎不随安装包内置,首次使用时从官方渠道在线下载(约 32MB,自动校验完整性并缓存,之后离线也能用)(mimo)
-
存档地图第二行右侧新增「展开」按钮:打开内容列表弹窗,顶部可搜索,左侧结构、右侧群系;勾选的群系会在地图上以对应颜色叠加显示(默认不勾选,两列下方各有「全选 / 清空」),每项右侧的高亮按钮可一键跳转到离当前视角最近的该结构/群系并在地图上圈出位置;弹窗可用右上角 ×、Esc 或点击弹窗外关闭(mimo)
-
存档地图页底部新增「当前群系」显示:地图正下方随时标出当前视角中心所在的群系中文名(如平原、白桦林、下界荒地),中文名优先取自当前游戏实例的语言文件,平移地图或切换维度时自动更新(opencode)
-
本地资源列表每张卡片右侧新增「问问AI」图标:一点即跳转到 AI 助手并自动引用当前资源,可直接向 AI 询问该模组/资源包/光影包/存档等问题;本地模组详情页与在线资源详情页的「问问AI」也改为跳转 AI 助手并引用当前资源,不再跳到网页搜索(mimo)
-
在线资源详情页左侧新增「前置资源」一栏:打开资源时自动列出它依赖的前置资源,每条带图标、名称和「必备/可选」标记。点一下其中的条目就能直接跳到那个前置资源自己的详情页,不用再回列表里搜(DeepSeek)
调整
-
在线资源详情页左右比例改为左侧约 30%、右侧约 70%,右侧内容区更宽敞;模组/基岩版资源详情页左侧版本下载列表新增分页(每页 30 条),版本很多时可翻页浏览,按筛选条件过滤后也会跟着分页(mimo)
-
设置>AI 助手的「默认模型」下拉不再是一组写死的假选项,改为列出你实际添加或配置过的真实模型(自定义模型、已填好密钥的服务商所选模型等),选好后打开 AI 助手或新建对话会自动用它;恢复默认值会清回「自动」(mimo)
-
翻译设置里的「模型」输入框同样改为可编辑下拉,直接列出同一份已配置的真实模型;从列表选中后会自动填好 API 端点和密钥(仅在对应输入框为空时填入,不会覆盖你手填的内容);未单独配置翻译模型时,AI 翻译会自动改用设置里选的默认模型(mimo)
-
存档地图「种子预测」使用明显更流畅:1.18+ 概览地形改为整段一次算完再缩放,不再逐格慢慢采;拖动地图离开当前预测范围后,新画布会直接沿用已算好的区域,只补新露出来的边,不再整图重画,放大后的细节也不用重新加载(mimo)
-
存档地图顶部工具栏的坐标跳转(X/Z 输入框 + 跳转按钮)移到了「展开」内容弹窗搜索框右侧:需要传送时先点「展开」,在搜索栏右侧填好坐标回车或点「跳转」即可直达,地图顶部工具栏因此更简洁;右键地图「填入跳转坐标」也会自动弹出这个小窗(opencode)
-
存档地图内容列表弹窗样式优化:加大圆角并加柔和投影浮在地图上,搜索框带放大镜图标、聚焦主色描边,两列标题加主色竖条,勾选项用主题色浅底突出,高亮按钮悬停显主题色,「全选 / 清空」改为描边胶囊按钮,关闭按钮悬停变红,列表行加悬停高亮与分隔线,整体层次更清晰(mimo)
-
投影方块编辑器 3D 视角改为自由飞行操作:用 WASD 水平移动,空格上升、Shift 下降,按住左键拖动转向,滚轮沿视线前后,像在游戏里一样到处查看;右键破坏、Ctrl+左键放置等编辑操作不变(mimo)
-
投影方块编辑器界面美化:顶部工具栏、3D 视图与右侧调色板改为圆角卡片分区,标题/提示/按钮/开关颜色跟随当前主题,保存按钮用主色突出,批量操作改为双列紧凑排布,整体更清晰统一(mimo)
-
投影方块编辑器打开明显提速:原先每次打开都会把客户端 jar 里上千张贴图和模型逐个解压一遍(有时还会重复加载两三次),现在改为整包一次批量读取、结果写入缓存下次秒开,并去掉打开过程中的重复加载;投影列表封面与编辑器共用同一份材质,互不重复解压(mimo)
-
新手引导窗口样式优化:步骤条改为整体居中,走过的步骤圆点显示对勾、当前步骤标题高亮为绿色;账户/Java/实例列表改为圆角浅灰面板并增加内边距;底部「上一步/下一步」按钮更大更易点,跳过引导改为轻量幽灵按钮;提示条左侧增加主色竖条;完成页大对勾外圈增加浅色光环,汇总芯片改为淡绿底;卡片选项悬停/按下反馈更清晰(mimo)
-
存档版本转换弹窗调整为居中卡片式:白色弹窗浮在灰色遮罩上,卡片内文字、输入框、日志固定浅色配色,深色主题下也清晰可读(mimo)
-
实例管理>导出整合包页样式焕新:顶部新增步骤进度条(选择格式→填写信息→选择模块→选择文件),走完的步骤显示对勾;格式卡片改为双列排布并带选中对勾;深色主题下标题、输入框、按钮等不再发黑看不清;顺带去掉了「选择模块」页里和底部重复的一组上一步/下一步按钮(mimo)
-
「投影方块编辑器」成为启动器内置功能,无需再安装插件:实例管理>投影页的「编辑投影方块」按钮与每张投影卡片的 3D 编辑入口始终可用,不再依赖插件是否安装或启用;插件页不再展示投影编辑器条目,历史遗留的投影编辑器插件包会被自动忽略,不影响使用。原有在插件设置里配置过的默认工具、显示空气、实例材质、真实形状、材质来源等项会自动沿用,并转移到「设置>投影编辑器」里继续管理,随时可改、也可一键恢复默认值(opencode)
-
启动速度大幅优化:打开软件到主界面可见由约 25 秒缩短到约 2.5 秒,启动画面也提前到约 0.4 秒出现;原先启动阶段会同步检测系统里的 Java(这一步就占掉约 20 秒),现在改为直接读取已保存的 Java 列表,需要时在后台补扫并自动记住结果,下次启动直接复用(mimo)
-
首页与设置页同步减负:轮播大图不再在启动时逐张解码,最近游玩记录改为后台扫描(界面不卡,进首页照样按时显示),性能监控卡的硬件采样延后到首页显示之后,设置页改成进入时才创建,进一步压掉启动耗时(mimo)
-
存档地图上挨得太近的同一种结构图标会自动合并成一个,右上角标出 ×2(更多则 ×3……),不再叠成一团看不清;点击合并后的图标仍可打开该结构的信息窗(mimo)
-
存档地图页顶部工具栏里的「刷新」按钮已移除,刷新统一用主窗口顶栏的刷新按钮:在地图页时直接点顶栏刷新即可重新渲染当前维度,快捷键 R 也依然可用(opencode)
-
实例管理>服务器页新增多选批量删除:点一下服务器卡片即可勾选,按住鼠标从一张卡片划到另一张能快速连选,底部还有「全选」按钮;勾选后统计栏和删除按钮会实时显示已选数量,点「删除选中」可一次删掉多台服务器,未勾选时仍走原来的逐个勾选弹窗(mimo)
-
存档地图「展开」内容列表弹窗加高变宽松:整体更高、四周留白更多,结构/群系两列列表有更充裕的呼吸空间,条目不再显得拥挤(opencode)
-
资源详情页顶部信息区(大图标、名称、简介、收藏按钮)改用卡片包裹:和本地模组详情页同款的圆角玻璃卡片、带细描边与更舒展的内边距,不再是带一条下划线的裸标题行;Java 版在线资源详情页、基岩版资源详情页、模组详情页三处统一(DeepSeek)
-
在线资源详情页的翻译挪到页面右下角,改成一张悬浮圆角小卡片:左边 EN(默认选中,看英文原文)、右边「中」,点「中」就会自动调 AI 把页面上的英文简介与详细描述翻成中文,来回切换不用刷新(DeepSeek)
-
资源包、光影包、数据包、整合包、存档的列表页也能一键翻译了:右下角同样有一张 EN /「中」的悬浮小卡片,点「中」会把当前这一页所有卡片的名称和简介一起翻成中文,翻页后自动回到英文原文(DeepSeek)
-
顶栏上那个一直显示、点了也没反应的翻译按钮已经移除:翻译统一走页面右下角的 EN /「中」悬浮卡片(DeepSeek)
-
存档地图「展开」弹窗中结构/群系两列列表的条目重新排版:已勾选的条目改为主色淡底胶囊 + 同色描边 + 加粗名称,并去掉左侧那条看起来像错位的小绿线;未勾选的条目保持通透,鼠标划过时浮起一层浅底,勾选与未勾选一眼可辨(DeepSeek)
修复
-
修复存档地图缩小后仍有灰色空块、放大才恢复正常的问题:缩小看全图时用的概览缩略缓存没有跟着后台渲染刷新,旧空洞一直留在画面上;现已在内容更新后及时重建缓存(mimo)
-
修复投影方块编辑器打开时容易闪退的问题:按需加载方块形状时,在往缓存里插入新条目的过程中还握着旧数据的引用,导致内存被踩坏;现已改为按值读取,并给贴图图集写入加了防半截缓存保护(mimo)
-
修复构建时提示
StyleKit::resolve未定义、链接失败的问题:样式工具源文件漏加进工程,导致链接器找不到实现,现已补上(mimo) -
修复软件一启动就闪退的问题:导出整合包页新加的步骤进度条在同步状态时,末尾会去操作一条并不存在的连接线,取到无效控件后直接崩溃;由于该页在启动阶段就会创建,表现为打开软件就退出,现已修正(mimo)
-
修复自定义背景不生效的问题:样式文件末尾多了一个多余的右括号,导致 Qt 解析整张样式表时中断,排在末尾的背景样式(主窗口壁纸、内容区透明等)全部被丢弃,背景被内容区底色盖住;去掉这个多余括号后,所选背景能正常透出(mimo)
-
投影编辑页与投影方块编辑器均支持方块中文显示:材料清单与调色板优先显示中文名;兼容共享
.minecraft与版本隔离两种实例布局(共享布局下从.minecraft/assets读语言包,此前路径找错导致一直无中文);悬停/搜索仍可用英文 ID(mimo) -
投影编辑页材料清单与方块编辑器调色板新增方块图标:图标取自当前实例客户端贴图(与 3D 预览同一套材质);贴图图集容量扩大以覆盖 1.21 全量方块,避免部分方块无图标(mimo)
-
投影方块编辑器调色板条目改为与投影编辑页材料清单相同格式:图标 +「中文名 (英文ID)」,方块属性收到悬停提示里;列表开启隔行底色,不再用方块色当文字颜色(mimo)
-
修复实例管理>服务器页看不到游戏内添加的服务器:此前只读启动器自己的列表文件,游戏里「多人游戏」加的服务器存在另一份数据里,导致页上一直空着或对不上。现在两边会自动合并显示,在启动器里增删改也会同步回游戏列表(mimo)
-
新增「插件创造器」插件:填几个空就能生成一个正规的 .BlockBox 插件包(自动补全清单、推荐权限、生成图标和脚本骨架),生成前还会自动检查一遍是否合规,做好即可直接导入启动器使用;同时也支持 AI 助手直接调用,让 AI 一句话帮你做出插件(DeepSeek)
-
修复从详情页返回上一页后左侧子导航栏消失的问题:模组详情、本地模组详情、安装新实例的版本详情以及设置里的 Java 下载页返回时,子导航面板都会重新展开并保持原来的选中项,不再出现只剩一条侧边栏的情况(DeepSeek)
-
修复在线资源详情页「筛选选项」里版本下拉显示成一串字母的问题:此前把资源的「版本记录编号」当成了游戏版本,现在改为显示真实游戏版本;CurseForge 源还会自动去掉 Client、Fabric 这类加载器与环境项,只留下真正的游戏版本,版本筛选和卡片上的版本小标签都能正常用了(DeepSeek)
-
修复在在线资源列表页选好实例(版本、加载器)后,点进资源详情页时左侧「筛选选项」却仍停在「全部版本」、下面可下载的版本和列表页对不上的问题:现在详情页会沿用列表页选中的实例版本与加载器,进去就自动筛出对应版本,模组详情页的版本筛选也不会在详情加载完成后再被重置回「全部版本」;如果这个资源确实没有对应版本,列表区会明确提示,而不是只留一片空白(DeepSeek)
-
版本号更新为 beta4:本页所列改动即是该版本的更新内容,软件内显示的版本号与安卓安装包的版本信息已同步更新(DeepSeek)
beta3
新功能
-
存档列表新增「地图」图标按钮与存档地表地图页:实例管理>存档 的列表式与瀑布流卡片各多一个地图按钮(新图标
Images/Icons/map.svg,已注册 resources.qrc),点击经InstanceFilePage::saveMapRequested→InstanceManagePage新增 stack 索引 15(非侧边栏页,仅由存档列表进入)切到新页pages/WorldMapPage.{h,cpp},并emit saveMapOpened()让MainWindow::onSaveMapOpened把 TopBar 标题设为「实例管理>存档地图」、返回按钮回到存档列表(接线方式同存档设置页,顶栏刷新按钮 / F5 已接到该页的重新渲染)。新增utils/WorldMap/WorldMapRenderer.{h,cpp}:按维度扫描<存档>/region、DIM-1/region、DIM1/region的r.X.Z.mca,8KB 文件头位置表定位区块 → zlib 解压(1=gzip / 2=zlib / 3=未压缩)→ 流式 NBT 大端游标只记录 sections 与 block_states 的偏移、按需再解析调色板并跳过无关标签,取每列最上层非空气方块按「方块颜色 + 高度明暗」画俯视图;1.18+(root.sections / block_states)与 1.13–1.17(Level.Sections / Palette / BlockStates)两套键名都认,位宽不硬猜版本号而是把「候选位宽 × 按 long 对齐 / 位流跨 long」逐个试解并校验全部 4096 个索引落在调色板内,1.12- 老格式走Blocks字节数字 ID 配色表;方块配色为 80+ 常见方块表 + 关键字兜底(leaves/log/planks/sand/water/stone…)。世界过大时按 2 的幂降采样把主图压到 ≤4096px(约 64MB 上限),渲染跑 QtConcurrent 工作线程、进度由原子计数经 QTimer 轮询刷进度条,切维度/切着色/刷新会取消上一次渲染,并按「维度×着色」缓存最多 4 份结果避免来回切换重复解析。顶部操作区为玻璃态卡片(worldMapToolbar,style.qss 新增 Section 51,只用已有 @TOKEN@):维度下拉(主世界/下界/末地)、着色下拉(地表方块/高度)、网格开关、缩放 −/百分比/+、适应窗口、坐标 X/Z 跳转、导出 PNG(走 AppFileDialog)、刷新;画布支持拖拽平移、滚轮以光标为锚缩放、区块/区域两级网格叠加,底部状态栏显示指针方块坐标与「区域 N · 已渲染 N · 每像素 N 格」,空存档/无区块/区域读取失败分别给提示。设置>关于 新增「地图与存档」分组,致谢 MCA Selector(Querz/mcaselector,GPL-3.0)——区域文件解析与地表俯视渲染思路参考。新增探针tests/world_map_probe(合成 region → 真实渲染 → 22 项像素断言:现代/旧两种格式、左半草右半石、未生成区块透明、高度着色为灰度、空存档报错、下界维度路径;输出_out/world_map_probe{,_legacy}.png)与tests/world_map_page_probe(真实 style.qss + 真实 WorldMapPage,铺满 32×32 区块的合成存档,断言渲染完成切到画布、进度条收起、维度/着色两个下拉与 7 个操作按钮齐全、空态提示存在、QSS 无 "Could not parse" 告警、中央区域 935 色;截图_out/world_map_page_probe{,_nogrid,_empty}.png),两探针与主程序 qmake 全量编译链接均通过(mimo) -
全部本地资源页接入「分类筛选」:实例管理页的存档 / 截图 / 资源包 / 光影包四个子页(InstanceFilePage)与资源中心「本地管理」页(ContentListPage,数据包 / 资源包 / 光影包 / 世界共用)此前只能整目录浏览或按启用状态过滤,现与实例-模组页、实例助手资源管理页对齐接入 LocalCategoryManager 本地分类——顶部筛选卡片 / 顶栏新增「分类:」下拉(全部 / 用户自定义分类 / 未分类哨兵
__uncategorized__)与「管理分类」按钮(objectName 沿用categoryCombo/categoryManageBtn,样式已在 style.qss);分类数据按实例 × 资源类型独立持久化于<实例>/blockbox/categories.json(资源类型键即子目录名 resourcepacks / shaderpacks / saves / screenshots / datapacks,与分类推荐预设一一对应),InstanceFilePage 在 setInstancePath、ContentListPage 在切换实例下拉时同步切换分类管理器实例路径并重置筛选选中;过滤逻辑叠加在既有搜索(InstanceFilePage)/ 启用-禁用筛选(ContentListPage)之上,筛选生效时统计标签显示「显示 N 个X (共 M 个)」/「显示 N 个X」;列表式与瀑布流卡片(含截图缩略图封面卡)chips 行新增分类标签(categoryChip="true"属性,建卡时按当前分类直接回填);卡片右键菜单新增「设置分类」子菜单(勾选当前分类 / 清除分类 / 新建分类…,新建复用 FavoriteFolderDialog 并按资源类型给推荐预设),分配后分类标签、过滤结果与统计即时刷新(categoriesChanged / assignmentsChanged 实时联动);InstanceFilePage 纯分类过滤(无搜索词)筛空时不再出现「前往下载页搜索」按钮——被隐藏的资源实际存在,不误导去下载页。改动文件:pages/InstanceFilePage.{h,cpp}、pages/ContentListPage.{h,cpp},两文件以工程 Makefile.Release 完整编译参数实际编译通过,无新增告警(GLM) -
更多本地资源页接入「列表式 / 瀑布流」双视图切换:实例管理页的存档 / 截图 / 资源包 / 光影包四个子页(InstanceFilePage)与资源中心的「本地管理」页(ContentListPage,数据包 / 资源包 / 光影包 / 世界共用)顶部新增 ContentViewSwitch 分段控件,与模组页、实例选择页等已有页面观感一致;视图偏好按页面类型经 QSettings 持久化(键
instance_file_<子目录>/content_list_<内容类型目录>),默认列表式与原状相同。列表视图沿用原卡片(ContentListPage 原内联构建抽取为createListCard,行为不变);瀑布流视图 InstanceFilePage 新增createMasonryCard——截图以 ThumbnailProvider 512px 缩略图经 makeCoverPixmap 圆角裁剪作封面横幅,资源包 / 光影包 / 存档以提取图标经 makeRoundIcon 作半压右下 logo(提取失败回退首字母渐变徽标),chips 行含大小 / 修改日期 / 「可更新」芯片(fileUpdateChip 沿用 findChild 定位,更新检查在瀑布流下照常标记),操作按钮与列表卡同套(快捷启动 / 存档设置 / 光影设置 / 详情 / 查看截图 / 打开位置 / 删除),单击选中、滑动多选、双击打开、右键菜单经既有 filePath 属性事件过滤逻辑在瀑布流下同样生效;ContentListPage 瀑布流复用MasonryContentCard::build,以文件路径散列注入渐变色板种子使各卡配色错开,追加「已禁用」/ 文件大小芯片,右键菜单与点击进详情保持可用。切换视图时重建卡片并重应用筛选 / 搜索 / 更新标记,InstanceFilePage 沿用每批 30 张的分批创建避免大量资源时一次性重建卡顿(重建时作废在途批次回调)。MasonryContentCard::makeCoverPixmap由匿名命名空间提升为公开静态方法供页面复用;两页的 clearCards / placeCards 改为网格 / 瀑布流双布局兼容。实例助手窗口(固定 450px 宽)内的资源管理页因瀑布流卡片固定 260px 宽无法成多列,暂不接入(GLM) -
首页「最近游玩」卡片新增固定按钮,点击后将该存档/服务器固定在最近游玩区域并置顶显示,再次点击取消固定(opencode)
-
「资源>模组 / 整合包 / 数据包 / 资源包 / 光影包 / 世界」列表页首屏新增磁盘缓存:首次联网拉取后写入本地缓存(默认 6 小时有效),下次进入页面时直接从缓存加载第一页列表,无需等待网络请求;缓存键包含内容类型、来源、版本/加载器筛选、排序与页码,互不串用。实现为新增
utils/content/ContentListCache(JSON 序列化复用ModData中新增的modInfoToJson/modInfoFromJson/modSearchResultToJson/modSearchResultFromJson),ModDownloadPage与ContentDownloadPage在loadInitialMods时优先读缓存、在onSearchCompleted完成首屏后回写缓存(opencode) -
AI 助手页 AI 回答文字描边重做:修复旧实现两处缺陷——① 复刻文档未把 QTextDocument 的 documentMargin 归零(QLabel 内部文档为 0),描边层相对正文整体偏移约 (4px, 6px) 出现重影;② 描边掩码直接取文字 alpha(含字形本体),描边色垫在文字抗锯齿边缘之下导致正文发糊。新实现抽为共享组件
components/TextOutlineLayer.{h,cpp}:文字 alpha 盘状膨胀(8 邻域逐轮并集、外缘保留抗锯齿柔边)后用 DestinationOut 抠掉字形本体,描边只落在字形轮廓之外;MarkdownOutlinedLabel改调该实现(对外 API 不变),缓存指纹补入 font(修复紧凑模式等 QSS 变字号后描边层不刷新)。新增components/OutlinedTextEdit.{h,cpp}(已注册进 BlockBox.pro):流式回答期间的 QTextEdit 直接用自身 QTextDocument 渲染描边(排版零复刻、逐像素对齐),AiChatPage 的回答流式编辑器启用描边、思考内容保持无描边(createStreamEdit 新增 outlineEnabled 参数),流式与收尾观感一致。新增探针 tests/outline_redo_probe:同屏渲染新旧算法并程序化校验——描边层 alpha=0 处正文 0 扰动、复刻文档与 QLabel 真实渲染逐像素对齐(包围盒完全一致、最大差 27)、字形核心 0 残留,并以旧算法同区域核心渗色 41 像素作对照(GLM) -
AI 助手页 AI 回答正文新增文字笔画描边(文字边框):新增组件
components/MarkdownOutlinedLabel.{h,cpp}(已注册进BlockBox.pro),AI 气泡的msgContent标签由普通 QLabel 换为该组件。与仅支持纯文本的OutlinedLabel不同,该组件按 QLabel 完全相同的规则重建富文本文档(同 default font / 根帧 margin 0 / textWidth=标签宽度 / 顶部左对齐,参照 qlabel.cpp),离屏渲染后取文字 alpha 生成「描边色+文字透明度」掩码,按 8 方向偏移累加合成描边层,绘制在正文之下;正文仍由 QLabel 默认绘制,Markdown 渲染、文字可选与右键菜单行为保持不变。描边宽度默认 1px,颜色跟随 ThemeManager 文字边框颜色(@TEXT_BORDER@),主题/文字边框颜色切换时实时重绘;流式回答期间正文为纯文本 QTextEdit 暂不描边,回复收尾切回 Markdown 标签后生效(opencode) -
设置>常规>游戏下载源新增「CurseForge API Key」输入行(密码回显):填入后经
SettingsManager写入本机设置键curseforge_api_key(Windows 存于注册表 HKCU\Software\BlockBox\BlockBox),供搜索页 / 模组下载页 / 资源下载页 / 基岩版内容页 / AppFileDialog 资源选择 / AI 助手资源检索 / ModLinkResolver 共 10 处 CurseForge 调用读取,启用 CurseForge 官方 API 的模组 / 整合包 / 材质等资源检索与指纹匹配;密钥仅保存在本机,不进入源码、资源文件与构建产物(GLM) -
「资源>模组 / 资源包 / 光影包 / 数据包 / 整合包」在线资源列表在「全部来源」下按名称合并 CurseForge 与 Modrinth 同名资源为一张卡片,下载量两源相加:
ModData新增跨源合并字段(altSource/altId/altName/altDescription/altIconUrl/altPageUrl/altDownloadCount,随modInfoToJson/FromJson进列表缓存)与共享算法mergeCrossSourceResults(名称按去首尾空白+忽略大小写匹配;两列表按各自排序位次交错输出保持整体相关度顺序,同名对以 Modrinth 为主源、CurseForge 信息入 alt* 字段,加载器/分类/游戏版本并集去重);ModDownloadPage/ContentDownloadPage的全部来源搜索改为双源结果先缓冲(m_bufferedMrResults/m_bufferedCfResults,经sender()区分来源),两源齐后flushAllSourceResults合并刷卡并写入页缓存,单源失败时另一源结果照常刷出。点击合并卡片进详情,页面顶部新增「Modrinth / CurseForge」分段切换(新增共享组件components/SourceSwitchBar.{h,cpp}已注册进 BlockBox.pro,复用 contentViewSwitch 分段控件 QSS 并补充文本段激活反白color: @TEXT_ON_PRIMARY@),默认加载 Modrinth 详情:ModDetailPage切换时经switchModInfoSource换源重建并发出sourceSwitchRequested,由 MainWindow 按新源 id 重新拉取 CurseForge/Modrinth 详情(版本列表/截图/前置随源刷新,receiveDetail回填 source 保证下载/收藏走对源);ContentDetailPage同位置切换为本地换源(该页本按卡片数据展示,同步m_currentSource使收藏标识跟随当前源)。非合并卡片不显示切换条;新增探针 tests/source_switch_probe(真实 style.qss 渲染 SourceSwitchBar:按钮查找/初始激活/药丸像素/点击信号/激活段自点不发信号 12 项断言)与 mergeCrossSourceResults 算法单测(同名合并、大小写空白归一、交错顺序、下载量相加、切换往返、序列化往返、空列表)均实测通过(GLM) -
设置>常规新增「选择器类型」卡片:下拉可选「系统文件资源管理器」/「软件自带」,经
SettingsManager新增的getFilePickerType/setFilePickerType(设置键filePicker/type,默认软件自带)持久化。AppFileDialog四个静态接口(getOpenFileName / getSaveFileName / getOpenFileNames / getExistingDirectory)按该设置分派:选系统时直接转调QFileDialog同名原生对话框(AppFileDialog::Option 枚举值与 QFileDialog::Option 一致,直接 static_cast 透传 options),选软件自带时维持原有内嵌文件浏览器行为不变。同时把散落的 5 处直接QFileDialog调用(mainwindow 批量导入插件、InstanceLogPage 导出日志、LaunchDetailsPage 导出启动日志、SettingsAiAssistantPage 导入/导出模型配置)统一改走AppFileDialog静态接口并替换对应 include,使该设置对全应用文件选择生效(mimo) -
设置>常规新增「启动行为」卡片与「开机自启动」开关:勾选后系统登录即自动启动方块盒子。平台层
platform.h/cpp新增Platform::isAutoStartEnabled()/setAutoStartEnabled(bool)(Windows 读写当前用户注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run的BlockBox键,值为带引号的可执行文件绝对路径;macOS 写~/Library/LaunchAgents/com.BlockBox.BlockBox.plist(RunAtLoad);Linux 写~/.config/autostart/blockbox.desktop;关闭时移除对应条目,Android/Harmony 不支持返回 false)。SettingsManager新增同名包装方法统一入口;设置页开关初始化时读系统当前真实状态,切换即生效。改动文件:platform.{h,cpp}、utils/SettingsManager.{h,cpp}、pages/settings/SettingsGeneralPage.cpp,三处均以工程 Makefile.Release 完整编译参数-fsyntax-only验证通过,无新增告警(opencode) -
存档地图页渲染提速 + 实时渲染(边渲染边显示):
utils/WorldMap/WorldMapRenderer的render()改为区域级多线程并行(局部 QThreadPool,默认并行度取全局线程数,maxThreads=1可退回单线程;批内收 future 结果贴主图),并新增ProgressiveSink渐进上下文——先用 release/acquire 发布画布布局,之后每解完一个区域就带锁入队图块;页面侧 80ms 定时器 drain 贴图并刷新画布,WorldMapView改为引用页面画布(新增setImageRef,不拷贝数据)避免逐块贴图触发整张 QImage 隐式共享 detach。单区域内两处快路径:region 文件优先QFile::map(省一次整文件拷贝,失败回退 readAll)、纯空气 section 直接跳过(省 4096 项解码与列扫描)。页面新增isRendering()供外部等待,状态栏追加渲染耗时(RenderResult::elapsedMs)。实测tests/world_map_probe新增第 6 组用例(4 个满区域 = 4096 区块):单线程 1240~1460ms → 并行 324~374ms,约 3.8~3.9×(加速比受区域数限制,真实世界几十个区域可逼近线程数上限),同时断言渐进图块拼接结果与最终图逐字节一致、布局先于渲染发布、进度计数与已渲染区域数一致。页面探针tests/world_map_page_probe新增「渲染仍在进行时画布已切到地图视图」断言以验证实时可见;顺带修掉视图刚从空态切换时尚未拿到真实几何导致自适应缩放算错的问题(scheduleFit延迟到布局 pass 之后再 fit,配合 resizeEvent 收尾)。设置>关于 的 MCA Selector 描述补上「多线程渐进渲染思路参考」(mimo) -
存档地图页真实存档闪退修复(gdb 定位 + 防御加固):
renderRegionFile直接 0xC0000005。根因两条:① 把位置表当 4096 项读(一个 region 实为 32×32 = 1024 区块,位置表只有 1024×4B、头部 8KB),多读的部分落进时间戳表与数据区 → 约 75% 槽位被误判"越界跳过",伪造槽位还会按i&31/i>>5盖掉真实像素(地图上散布白洞);② 循环读到 4096 项时越出小文件(该存档有 56 个 0 字节 region——游戏运行中常见——外加一个 12288 字节残件,data[12288]正好越界)。修复:位置表只读 1024 项、头部下限恢复 8KB、空文件静默跳过 / 不足 8KB 的残件跳过(且在scanRegionFiles阶段就不纳入、不计入"失败")、区块槽位改按位置表索引放置(不再采信 NBT 的 xPos/zPos,避免重复坐标互盖)。同轮防御加固:NBTskipPayload加 48 层嵌套上限(防损坏数据爆栈)、调色板条目上限 8192(防异常 count 让reserve撑爆内存)、region 文件名坐标钳到 ±60000、布局跨度改 qint64 计算(防 int 溢出)、QImage创建判空。页面侧稳定性:RenderResult加渲染序号,过期任务的结果直接丢弃(快速切维度时旧结果会覆盖新结果甚至写进缓存);渲染改用页面专用QThreadPool(不与 AI 助手的QtConcurrent::run抢全局池,也不受AiService::waitForDone(5000)牵连);~WorldMapPage补取消 sink + 停定时器;缓存改"≤2 条且 ≤128MB、且只收完整渲染结果"。验证:新增tests/world_map_stress_probe(渲染中销毁 / reset 后重入 / 连切 5 次维度 / 缓存重入 / 销毁父窗口 / 退出时仍在渲染 六场景 × 60 轮)60/60 存活;world_map_probe新增--real <存档>模式(gdb-O0 -g抓栈定位用,探针保留-g便于下次定位)——主世界 93/93 三轮、下界 11/11、failed=0、渐进图块与最终图逐字节一致、8 并行约 8 秒/轮,零解析告警;合成套件 40 项、页面探针 13 项全过;主程序全量编译链接通过。渲染结果截图_out/world_map_real_overworld.png(海岸线/岛屿/河流连贯,零星白点为Status=empty占位空区块,属真实数据)(mimo) -
存档地图页鼠标操作与快捷键:鼠标——左键拖拽平移之外,新增中键拖拽平移(松开退出抓手光标)、左键单击选中区块(主色半透明填充 + 描边高亮,区块缩到很小时给 6px 最小可见尺寸;再点同一区块取消;状态栏同步显示「已选中区块 (cx, cz)」)、双击以点击点为锚放大 1.6 倍、右键弹上下文菜单(非模态
popup()+WA_DeleteOnClose,自动化点不到菜单也不会卡死:复制方块坐标 / 复制区块坐标(QApplication::clipboard()+NotificationManager::showSuccess提示)/ 居中到这里 / 填入跳转坐标 / 取消选择),滚轮保持以光标为锚缩放并新增 Shift+滚轮纵向平移;单击与拖拽靠 4px 移动阈值区分(kClickSlop)。键盘——统一入口WorldMapPage::keyPressEvent:焦点落在坐标输入框时按键被输入框自己消费、不会冒泡到这里,天然避开"输入负号 / 数字"冲突;+-缩放、0/F适应窗口、方向键与WASD平移(Shift 加速 240px)、G网格、R刷新、E导出、1/2/3直达主世界/下界/末地(副标题与渲染同步刷新)、C取消选择。刻意避开主窗口全局键(默认Esc=返回上一级、Home=回主页、F5=刷新、Ctrl+1..4=导航,均不占用),并让setCurrentSave()调setFocus(),进入页面即可用快捷键。发现性:各按钮 tooltip 标注对应按键,工具栏整体 tooltip 给出鼠标 + 快捷键总览。验证:world_map_page_probe新增交互断言——单击选中(状态栏出现"已选中")、中键进/出抓手平移态、右键弹出菜单、双击放大、G/+-/0/C/2(副标题变"下界")/1各键生效——全部通过;压力探针 40/40 存活;主程序全量编译链接通过(探针侧为NotificationManager增补fake/桩头,避免拉入 NotificationCard 依赖链)。截图_out/world_map_page_probe_selected.png(mimo) -
存档地图页渲染精度提升(四层):① 穿透可忽略覆盖物——新增
isIgnorableCover(),地表扫描跳过草丛 / 单花与两格花 / 薄雪 / 火把 / 红石线 / 拉杆 / 轨道 / 细线 / 洞穴藤蔓 / 树苗 / 农作物等"贴地薄层与细杆"(含_pressure_plate、_button、_tulip、_orchid后缀与flower、sapling泛化),取下方真正的实心地面——否则草地上一朵花就是地图上一个杂色点;树叶 / 原木 / 栏杆 / 玻璃板一律不忽略,树林必须显示成树冠。② 水深渐变——扫到水面后继续向下数连续水层(封顶 24 格),deepenWater()按深度调暗(每格 −2.7%,20 格 −54%),浅滩亮、深潭沉。③ 坡度阴影——renderChunk改为只产出「基础色 + 每像素地表高度」两个区域缓冲,新增shadeRegion()统一收尾:在高度明暗(0.72~1.16)之上叠加坡度阴影(与右/下邻居高差 ×0.010,限幅 0.55~1.45),山脊受光、背光坡压暗;区域边缘邻居缺失时用自身高度兜底,跨区域无接缝;Height灰度模式同样叠坡度。④ 高质量降采样——QImage::scaled的双线性在 bpp>2 时只采几个点会丢行,换成boxDownscale():factor×factor 全像素平均(指针扫行),且跳过透明像素,未生成区域的边缘保持实边不发虚。验证:合成套件扩到 46 项全过——调色板加入short_grass覆盖层做穿透强断言(右半区必须仍是石头灰,不穿透就会变绿)、新增远端区域r.8.8把跨度顶到 9 个 region 触发 bpp=2,并断言全图 alpha 二值(盒式降采样证据)、渐进图块仍与最终图逐字节一致;真实存档(长梦镇 148 region / 3328×2560 bpp=2)做像素级核验:alpha 非 {0,255} 的像素 = 0 / 8519680、水面蓝值 std=22.6(101~239,深浅层次明显)、绿色地表相邻像素 30.9% 亮度差 > 4(坡度阴影生效);渲染耗时 8~10s/轮(较改动前约 +20%,并行 3.6×)。页面探针、压力探针 40/40、主程序全量编译链接均通过(mimo) -
存档地图页改为「1 像素 = 1 方块 的两级 LOD 渲染」——概览先出、放大再补细节,全程不卡:① 缩放语义换算——缩放读数不再报"图像像素缩放比",改报每方块的屏幕百分比(
blockScreenSize() = scale / bpp),因此读数到 100% 就正好是 1 像素 = 1 方块;工具栏视图组新增1:1按钮(zoomToOneOne(),以视口中心为锚一键跳到方块级)。② 两级 LOD——底层仍是原来的整图概览(渐进渲染 + 降采样,负责"大致");上层新增视口内的 1:1 细节瓦片(每个 region 512×512、1 像素 1 方块),由新增的WorldMapRenderer::renderRegionTile()单独渲染,画布按绝对 region 坐标叠在概览之上,缩小时看概览、放大后被方块级瓦片逐块覆盖。③ 按需调度(防卡核心)——视口变化去抖 150ms → 展开可见 region(扫描上限 4096 防止极端缩放时遍历卡 UI)→ 按到视口中心的曼哈顿距离排序、每轮最多排 12 块 → 单 worker 串行渲染(与概览共用专用QThreadPool,概览在跑时自动排队、绝不抢 UI 的 CPU)→ 完成即入缓存并继续下一块;空文件/未生成的 region 记入m_tilesEmpty不再重试;m_tileSeq批次号丢弃换存档/换维度前的过期结果;LRU 上限 96 块(≈96MB),超出从画布剔除。④ 加载门槛:每方块屏幕像素 ≥0.5 才补细节 —— 方块还看不清时只显示概览,正对应"先大致、放大了再精细"。⑤ 绘制防卡:概览在 scale<1 时走整图缩放缓存(平移只做 blit,不再每帧重采样整图,大世界原来每帧 10ms+),scale≥1 时只绘制视口裁剪的子区域;1:1 瓦片本身就是 blit。状态栏新增「细节 N」显示已加载块数。验证:world_map_page_probe33 项全过,新增断言——渲染完成后自动加载出 1:1 细节瓦片、1:1按钮存在且点后读数由 88% 变为 100%;world_map_probe新增renderRegionTile三条断言(512×512、有地表内容、不存在的 region 返回空图),合成套件与真实存档(长梦镇 93/93 ×3 轮、下界 11/11)全过;压力探针 40/40 存活;主程序全量编译链接通过(mimo) -
存档地图页顶部新增高度选择框(可编辑下拉):
m_heightCombo设setEditable(true)+setInsertPolicy(NoInsert)+ 占位符「高度」——框内既是输入框、又能下拉,预设项全部 / Y=64 / Y=100 / Y=128,也可以直接键入任意 Y(回车或失焦经editingFinished触发)。语义是只显示该高度及以下的地表:render()/renderRegionTile()新增maxSurfaceY参数(-1 = 不限制),列扫描跳过y > maxSurfaceY的方块 —— 例如填 64 就把树冠、屋顶削掉看清地面,留空 / 选「全部」就是真实地表。高度编入渲染缓存 key(key = (dim*2+shade)*1e6 + (maxY+5e5)),不同 Y 是不同结果,切换时概览与 1:1 细节瓦片一并重渲;下拉选择与输入回车都收敛到onHeightChanged(),值没变不重复渲染。布局代价:为在 1000px 窄屏放下这个框,「适应窗口」→「适应」、「导出图片」→「导出」、坐标框 58→52、标题最小宽 56→40;QSS 补QComboBox#worldMapToolCombo QLineEdit(透明内嵌输入框,随外框 hover / focus)。验证:world_map_page_probe新增断言 —— 高度框存在且带内嵌输入框、默认「全部」、下拉选 Y=64 后 (0,0) 由水色rgb(53,99,192)变为水下的土色rgb(120,91,61)(削层生效)、直接键入 Y=100 回车后恢复真实地表;窄屏断言仍过(1053 ≤ 1075);渲染器探针、压力探针 40/40、主程序全量编译链接均通过(mimo) -
存档地图页顶部新增第二行「结构」图标条:按种子全图预测结构位置(含未探索区域)并在地图对应坐标绘制图标。① 种子→结构——引入开源库 Cubiomes(Cubitect/cubiomes,MIT,
third_party/cubiomes源码 vendoring,8 个 .c 已注册进BlockBox.pro并加 INCLUDEPATH),新增utils/WorldMap/StructureFinder.{h,cpp}:allStructures()给出 18 种结构定义(主世界村庄/前哨/海底神殿/林地府邸/沙漠神殿/丛林神庙/沼泽小屋/冰屋/海底废墟/沉船/废弃传送门/远古城市/埋藏宝藏/废弃矿井/试炼密室 + 下界要塞/猪灵堡垒 + 末地城,含中文名与 Wiki 条目标题),versionToInt()把存档Data.Version.Name(如 1.21.11)映射到 cubiomes 的 MCVersion,find()按每种结构的「区域网格」(regionSize 取自 cubiomes 版本配置表)遍历调getStructurePos(),先按范围/维度筛,再用isViableStructurePos()做 biome 合法性过滤(不过滤会满屏假村庄),Generator 按 (mc, seed, dim) 缓存复用避免反复重建;单结构区域网格扫描上限 4096 防极端范围卡 UI。实测真实存档(长梦镇 seed=4562377579810721523)±4096 方块内 817 命中 / 51ms(村庄 55、试炼密室 215、沉船 128…)。② 顶部第二行——worldMapToolbar第二行放「结构」标签 + 18 个 30×30 可勾选图标按钮(worldMapStructBtn,QSS 新增三态:默认 @BG_CARD@ 白底描边、hover 加深、选中 @PRIMARY@ 主色实心)默认全部选中,右侧「全选 / 清空」一键切换(QSignalBlocker 阻止逐个 toggled 反复重算),勾选变化即触发后台重算(独立m_structPool线程池,与渲染池互不抢占;任务进行中又改开关则置m_structDirty完成后再算一轮)。③ 图标远程 API + 本地磁盘缓存——新增utils/WorldMap/StructureIcons.{h,cpp}:内存缓存 → 磁盘缓存(<数据目录>/cache/structure_icons/<key>.png)→ 远程 Minecraft Wiki MediaWiki pageimages 标准 API(api.php?action=query&prop=pageimages&piprop=thumbnail,带 UA)查条目缩略图再下载落盘 → 失败/离线回退内置徽章(首字 + 按下标 HSV 分散配色的圆形徽章,离线也美观);下载完成后经setUpdatedHandler回调刷新第二行按钮与地图标记。实测 18/18 图标全部从 Wiki 下载并落盘(修正 3 个条目标题:丛林神庙Jungle Pyramid、海底废墟Cold Ocean Ruins、废弃矿井Mineshaft——原标题无缩略图)。④ 地图绘制——WorldMapView::drawMarkers()按方块坐标变换画 20px 图标,视口外剔除、方块过小(<0.5px/方块)不画防糊。查询范围 = 可见 region 外扩一圈、按 16384 方块封顶(缩到全图时网格数不爆炸)。⑤ 修复——StructureIcons.h文件头注释被整体写坏(/**→***、//→**,所有/变*)导致不可编译,已重写;StructureIcons.cpp两处编译错误(QJsonValue无.value()链式调用、QNetworkRequest req(QUrl(x))触发 most vexing parse 被当函数声明)已修。⑥ 探针——structure_probe(读真实存档种子/版本 → cubiomes 查询)全过:版本映射、±4096 内有村庄、下界结构在主世界维度被过滤、耗时 <2s、命中全在范围内;world_map_page_probe扩到 66 项全过(本轮加风格断言后共 72 项),新增断言:fixture level.dat 补WorldGenSettings.seed+Version.Name、第二行按钮数 = 结构全集、默认全选、图标非空、清空 → 标记归零且状态全不选 / 全选 → 标记恢复(55 个)、标记收敛等待waitForStructs();页面暴露structureButtonCount()/structureChecked()/structureMarkerCount()/waitForStructs()探针接口。压力探针 60/60 存活(其 .pro 同步补 StructureFinder/StructureIcons/cubiomes/network 依赖),渲染探针 46 项全过,主程序全量编译链接通过。截图_out/world_map_toolbar_top.png(第二行结构条)、_out/wmp_map_markers.png(地图上的结构标记)(mimo) -
存档地图页结构标记五项增强(绘制 + 结构补全 + 点击弹窗 + 完成标记):① 白色描边——地图上的结构图标改为「白色圆角底(比图标大 2px)+ 图标」的描边样式,在深色地形上清晰可辨;② 尺寸 +50%——标记图标由 20px 增至 30px(
WorldMapView::kMarkerSize,含 2px 描边共 34px);③ 缩小显示稀有结构——原先每方块屏幕像素 <0.5 时全部标记隐藏(缩到全图一个都不剩),现改为只隐藏普通结构、保留稀有结构(StructureDef新增rare字段,要塞/海底神殿/林地府邸/远古城市/试炼密室/下界要塞/猪灵堡垒/末地城 共 8 种),任何缩放级别下稀有结构图标始终可见;④ 结构补全至 22 种——新增要塞(Stronghold,cubiomes 枚举没有此项,用StrongholdIter环形迭代 128 个 +nextStronghold内部 biome 定位,按查询范围切比雪夫半径早停)、古迹废墟(Trail Ruins)、下界废弃传送门(Ruined_Portal_N,下界维度)、沙漠水井(Desert Well,rarity=1/1000 由 cubiomes 处理),均配 EnvSprite 图标(stronghold/trail-ruins/ruined-portal/desert-well),第二行开关自动扩到 22 个;⑤ 点击图标弹信息窗——单击地图上的结构图标(先于区块选中判定,markerAt()命中半径含描边)弹出内置信息窗worldMapStructPopup(Qt::Popup 非模态、点外部自动关、同屏只留一个):结构图标 + 名称、坐标「X .. Z ..」、三个操作按钮——复制坐标(剪贴板写入x, z+ 成功提示)、查看百科(zh.minecraft.wiki/w/<条目>经QUrl::toPercentEncoding,按钮属性wikiUrl供探针校验)、标记为已完成 / 取消完成标记(动态文案);标记完成后地图上该结构图标以 35% 不透明度半透明显示,状态按存档持久化(QSettings键worldMap/structDone/<qHash(存档路径)>,type_x_z列表,重进存档自动恢复)。顺带修复一个会白屏的绘制状态泄漏:drawMarkers的setBrush(Qt::white)若不恢复,paintEvent 末尾的p.drawRect(target)会以白色实心填充整个地图画布(上一轮描边引入,画布全白、地形/标记全部被盖)——已在drawMarkers内显式setBrush(Qt::NoBrush),并在drawRect前再防御性清一次。QSS Section 51 追加worldMapStructPopup弹窗三件套样式(标题/坐标/操作按钮)。验证:world_map_page_probe扩到 95 项 PASS / 0 FAIL——新增断言:结构全集 = 22、4 个新结构 key 在列、rare 标志 ≥6、白描边(marker 上沿 16px 处为纯白、19px 外为地形色非白)、点击图标弹窗(名称/坐标文本匹配)、wikiUrl指向zh.minecraft.wiki/w/、复制坐标写剪贴板192, 176、标记完成 → 内存状态 + QSettings 持久化(10_192_176)+ 按钮文案切换 + 像素差 15 > 10(半透明生效)、取消恢复、缩小 5 档后 rare 10/10 全部画出、普通结构 6 个全部隐藏;structure_probe新增要塞迭代命中与 trail_ruins 命中断言(长梦镇 ±4096 古迹废墟 34 个),9/9 全过;压力探针 60/60 存活;渲染探针全过;主程序全量编译链接通过。截图_out/wmp_icon_style_bar.png(22 个开关)、地图标记白描边效果(mimo)
调整
-
存档地图页打开时不再整图自适应,改为「固定视野 + 出生点中心」:新增
WorldMapView::resetInitialView(visibleChunks),横向固定显示 64 个区块(WorldMapPage::kInitialVisibleChunks),视口中心对准LevelDatEditor::readSave()读到的Data.SpawnX / SpawnZ(读不到就回退图像几何中心);setImageRef()的新画布绑定与resizeEvent的延迟布局纠正都改走初始视图,整图全览只留给用户主动操作(「适应窗口」按钮 /0/F)。配合上一轮的「1 像素 = 1 方块」细节瓦片,打开地图就是出生点附近的方块级视野(实测初始读数 118%),要总览才需要再按一次适应窗口。验证:world_map_page_probe的 fixture 新增最小level.dat(SpawnX=300 / SpawnZ=200),新增 4 条断言——readSave读到 (300,200)、初始读数存在且为 118%、视口中心 (299,199) ≈ 出生点 (300,200)、按0适应整图后读数与初始值不同(证明默认不是全览);全量断言通过,压力探针 40/40 存活,主程序全量编译链接通过(mimo) -
存档地图页加载改为「从视角中心往四周」——概览与细节两层都改:① 细节瓦片层——调度距离由曼哈顿改为切比雪夫
max(|dx|,|dz|)(方环一圈圈由内向外,同环内再按曼哈顿靠中心),并收紧队列语义:scheduleTiles()先清掉队列里已滚出视口的 region(既白渲又占队位),队列总量封顶 12(里面永远是"离中心最近的一批",而不是旧版"每轮新增 12"导致 pending 无限累积、把新中心的任务挤在后面);onTileFinished()渲完一块若队列见底就再排下一批(新增continueTiling()),于是加载表现为从中心持续向四周扩散,直到可见区被细节瓦片填满(旧版排完第一轮 12 块就停了,四周不再继续)。② 概览层——ProgressiveSink新增priorityRegion,render()按到它的切比雪夫距离重排 region 处理顺序(页面填出生点所在 region),渐进画面从出生点那块先长出来,而不是按文件名字典序乱冒;无优先级时保持原顺序。新接口loadedTileOrder()(LRU 序 = 加载序)供验证。验证:world_map_page_probe新增断言——第一块细节瓦片必须是视口中心所在的 region、加载距离单调不减(fixture 补一块视口内的外围区域r.1.0,打印出的顺序为 (0,0) → (1,0),中心先、外围后)、全量断言通过;真实存档回归 93/93 ×3 轮 + 下界 11/11、零告警;压力探针 40/40 存活;主程序全量编译链接通过(mimo) -
存档地图页顶部操作区样式重做:由"一整行平铺按钮"改为分组工具栏——左侧标题块(34px 圆角图标底放
map.svg+ 存档名 + 副标题「地表地图 · 主世界」,副标题随维度下拉实时刷新,新增WorldMapPage::updateSubtitle()),右侧依次为「渲染组(维度 / 着色)」「视图组(网格 · − 缩放% + · 适应窗口)」「定位组(X / Z / 跳转)」三块淡底圆角容器(worldMapToolGroup:@BG_HOVER@ 底 + 1px 描边 + 圆角 9,取代原先无分区的平铺),组内控件改扁平样式(新增QPushButton#worldMapGroupBtn,透明底、hover 翻白底、按下 @BG_PRESSED@、网格选中态由浅绿改为主色实心 + 反白字;下拉与坐标输入框同步改透明底 + hover 白底,focus 主色描边且边框盒保持不位移)。标题块与操作区之间改用 1pxQFrame竖线(worldMapToolSep),替换掉原先几乎看不见的|文字分隔符,并把 4 条分隔线精简为 1 条(分组底色已自带分区,避免"三块饼干"式的密集竖线)。右侧「导出图片 / 刷新」改用独立带框样式worldMapActionBtn(白底描边 + hover 描边加深 + disabled 灰态),与组内扁平控件拉开层次。尺寸统一:所有控件 26px 高、分组容器 36px、工具栏圆角 12→14px,makeGroup/makeSep/makeBtn(objName)三个构建 lambda 收口控件规格。顺带修掉一个会放大成整页样式崩坏的隐患:初版分隔线取色写了@BLACK_RGBA_0.10@,而ThemeManager::buildTokenTable的小数档只注册了 0.06 / 0.08 / 0.12 / 0.13 / 0.18 / 0.20 / 0.25 / 0.32(另有整数档 5/8/10/15…),该占位符不存在会让 Qt 中止解析、丢弃其后全部样式;已改用@BLACK_RGBA_0.12@,并把 Section 51 全部 18 个 token 逐一对照 ThemeManager 校验通过(探针自带 fallback 会把未知占位符兜底成灰色,所以光靠探针测不出这类问题)。验证:tests/world_map_page_probe断言全过(含"QSS 无 Could not parse 告警",并新增窄屏断言:控件宽度收紧留余量后——坐标框 64→58、缩放读数 46→42、标题 56——1000px 宽度下最右按钮右缘 988 ≤ 页面 1010、不被裁切)、压力探针 40/40 存活、主程序全量编译链接通过;截图_out/world_map_page_probe{,_narrow}.png(mimo) -
安装新实例>版本详情页>加载器详情页(
ForgeVersionListPage,Forge/NeoForge/OptiFine/Fabric/Quilt/LegacyFabric/LiteLoader/Cleanroom/OptiFabric 共用的版本列表页)的版本行卡片与「下载模组」等内容页的列表卡片统一:原实现为QTreeWidget+ 富文本 QLabel 行(粗体版本号 + 灰色 Build/日期小字;且 QSS 写的是QListWidget#forgeVersionList类型选择器,与 QTreeWidget 实例不匹配导致列表样式从未生效),现改为QListWidget(spacing 8、ScrollPerPixel)+ 共享modCardListItem系列样式的行卡片(76px 高:48px 加载器 logo 圆角图标(与版本详情页加载器卡片同源,缺失时回退首字母渐变)、版本号名称、Build/日期/分支/MC 版本等 chip、右侧「选择此版本」操作按钮,不可用版本名称置灰并附「不可用」chip),点击行为保持不变(点击行/卡片/按钮均立即选中并返回版本详情页添加该加载器,参照实例选择页为卡片加事件过滤器兜底子控件点击);QSS 中forgeVersionList/fabricVersionList/neoForgeVersionList容器同步透明化(::item/:hover/:selected 背景全透明、水平 14px 内边距),行卡片像「下载模组」页一样独立悬浮。新增探针 tests/forge_version_list_probe(复用 loader_detail_probe 的 fake 桩目录,走真实网络拉取 BMCLAPI 列表),输出 D:/BlockBox/_out/forge_version_list_forge.png 与 forge_version_list_fabric.png,已实测 Forge(66 个版本)与 Fabric(253 个版本)两页卡片渲染正常(GLM) -
实例选择页(Java 与基岩版)左侧悬浮气泡「实例文件夹 / 实例分类」导航四角新增圆角并改为玻璃态半透明:
QWidget#instanceLeftSidebar样式补充border-radius: 12px(渐变背景与右缘 1px 边框随圆角裁切,气泡整体呈圆角矩形,四角本为直角);背景由不透明的 @BG_MUTED@ → @BG_BASE@ 水平渐变改为半透明白 rgba(255,255,255,0.72→0.62) 玻璃渐变,与 SubNavPanel 等悬浮面板一致,透出页面/自定义壁纸背景;深色主题由ThemeManager::applyDarkBarOverride追加 rgba(45,45,45,0.66→0.7) 深色玻璃覆盖(opencode) -
安装新实例流程「版本详情页」(LoaderDetailPage)的加载器卡片样式与「下载模组」等内容页的列表卡片统一:此前
QListWidget#loaderListWidget自身带 @BG_CARD@ 底色、1px 边框、12px 圆角与 8px 内边距,整块列表画成一张大卡片,内部每张modCardListItem卡片又自带同款底色边框,形成「卡中卡」,且::item的 10/12px 内边距与 hover 灰底会在卡片背后再垫出一层圆角矩形,与下载模组页卡片直接悬浮在页面背景上的观感不一致。现将列表容器改为透明无边框(水平 14px 内边距与内容页卡片容器边距对齐),::item/:hover/:selected背景全部透明化,卡片背景、边框、圆角与 hover 高亮完全交由共享的modCardListItem系列样式呈现,与 ModDownloadPage / ContentListPage 等页一致。新增探针 tests/loader_detail_probe(仿 install_page_probe:fake 桩隔离 VersionDownloader 与 7 个安装器依赖,渲染真实 LoaderDetailPage + 真实 style.qss),输出 D:/BlockBox/_out/loader_detail_default.png 与 loader_detail_selected.png,已实测卡片为独立悬浮样式(GLM) -
CurseForge 源在 MCIM 镜像加速开启时不再要求 API Key,实现开箱即用:实测 MCIM 镜像端(mod.mcimirror.top/curseforge)服务端自带密钥,不带 X-API-KEY 请求 /v1/categories 返回 200,官方源同样请求返回 403;
CurseForgeAPI的搜索 / 分类 / 详情 / 指纹匹配 4 处空 key 早退改为「有 key 或 baseUrl 指向镜像(usingMirror())即放行」,构造函数默认 baseUrl 改为跟随use_mcim设置(镜像开启默认走 MCIM),新增静态mirrorEnabled()(未配置时默认开)供外部判断;AI 助手同步检索syncSearchCurseForge/syncFetchDetailCurseForge两处CURSEFORGE_API_KEY_MISSING拦截同步放行;其余 9 处调用点(搜索页 / 模组下载页 / 资源下载页 / 基岩版两页 / AppFileDialog / mainwindow / ModLinkResolver)本就不在外部拦截、仅按非空设置 key,无需改动。关闭 MCIM 镜像直连官方源时仍必须填入 API Key,未填时错误提示更新为「请在设置中填入或启用 MCIM 镜像加速」;设置页 CurseForge API Key 行文案同步改为「官方源所需,镜像开启时可不填」(GLM) -
新增本地密钥文件机制
utils/CfApiKey.h(已注册进BlockBox.proHEADERS 并git update-index --skip-worktree标记,与utils/AuthManager.cpp同一保护机制):仓库中只保留空占位符,真实 CurseForge API Key 仅填在本机该文件内(#define BLOCKBOX_CF_API_KEY "..."),git add -A/ 一键上传不会带入仓库;pre-push 钩子对$2a$形式 key 的拦截作为最后兜底。CurseForgeAPI新增static localApiKey()与成员effectiveApiKey()(优先级:设置界面 curseforge_api_key > CfApiKey.h 兜底 > 空),搜索 / 分类 / 详情 / 指纹 4 处请求的 X-API-KEY 与空 key 判定改用effectiveApiKey();AI 助手syncSearchCurseForge/syncFetchDetailCurseForge两处CURSEFORGE_API_KEY_MISSING拦截同步加入localApiKey().isEmpty()判断。注意事项已写入文件头注释:填入真实 key 后本地编译出的 exe/apk 内含该 key(可被提取),此类构建仅限自用不得作为发布包分发(GLM) -
Java 管理:将「全盘扫描」与「快速检测」合并为一个「Java检测」按钮(设置页与实例助手-Java管理页同步),检测过程按钮显示进度百分比并防重复点击;空状态与提示文案同步更新(mimo)
-
Java 检测改为开源启动器通行做法(HMCL/PrismLauncher/MultiMC):依次查环境变量(JAVA_HOME/PATH)→ 注册表(Oracle/Adoptium/Microsoft/Zulu/贝尔软等全厂商键)→ 厂商安装目录(覆盖各固定盘 Program Files、Scoop、Gradle jdks、IntelliJ .jdks、JetBrains Toolbox JBR)→ Minecraft 启动器自带运行时;快速检测未找到 Java 时自动转入全盘关键词深度搜索兜底,保证能检测出 Java。GameLauncher::detectJava 兜底与新手引导「扫描本机 Java」复用同一实现,删除三套重复的旧检测逻辑(mimo)
-
全盘深度搜索剪枝放宽 C:\Users 与其 AppData 层级,可进入 scoop/.gradle/Programs 等用户目录安装的 Java;java -version 验证超时由 2s 提到 5s(与 GameLauncher 对齐),避免杀软实时扫描下把有效 Java 误判为无效;新增探针 tests/java_detect_quick_probe.cpp 实测本机快速检测发现 Microsoft JDK 21 并拒绝已损坏的 Oracle javapath 存根(mimo)
-
首页轮播图指示点由 4×4 改为 2×2 大小(opencode)
-
「实例-模组」页本地模组卡片:有中文翻译时不再单独显示灰色英文副标题,改为按「中文翻译(英文)」单行合并显示(opencode)
-
左侧导航栏默认底色与顶栏统一:侧边栏底部渐变由 slate 色 rgba(248, 250, 252, 0.68) 改为纯白 rgba(255, 255, 255, 0.68),与顶栏玻璃渐变一致(opencode)
-
AI 助手缓存命中率优化:解析服务商返回的前缀缓存命中 token 数(OpenAI/GLM/Kimi 的
prompt_tokens_details.cached_tokens与 DeepSeek 的prompt_cache_hit_tokens),AI 回复统计行新增「缓存命中 N%」显示;将工具循环的真实请求消息(assistant tool_calls + tool 结果,含 tool_call id/参数/结果原文)随最终 assistant 消息持久化到对话 JSON(ChatMessage新增toolPhase),下一轮重建 messages 时原样回放,使请求前缀与上一轮实际请求逐 token 一致,工具调用产生的大量 token 可跨轮命中服务商隐式前缀缓存(GLM/DeepSeek/Kimi 等自动按命中前缀降低计价与首 token 延迟);新增roundTriggeredTools标记工具循环中间轮,重放历史时跳过其开场白内容(该内容从未进入过模型请求,旧对话无标记时行为不变);一次响应返回多个 tool_calls 时改为队列逐个执行、全部回填结果后再统一重发,修复此前只执行首个导致其余 tool_call 无结果消息的协议破损与模型重复调用,并新增currentDispatchedToolCall()修正搜索/网页回调固定取累积器首项取错 id 的问题;token 估算计入工具消息使压缩阈值按真实上下文触发,上下文压缩的最近消息窗口跳过中间轮消息、摘要输入附带截断后的工具结果;重新生成时清理末尾连续的 assistant 中间轮消息,避免孤立中间轮残留破坏上下文;修复工具调用记录只清空从不填充、从未写入对话历史导致重开对话后步骤卡片丢失的问题(GLM) -
账户管理页左侧悬浮气泡改为玻璃态半透明并透出页面/自定义壁纸背景:
QWidget#accountLeftSidebar背景由不透明 @BG_CARD@ → @BG_CONTENT@ 水平渐变改为半透明渐变(透明度 0.65),保留原有 16px 圆角与 1px 边框;主题表新增随当前主题派生的@BG_CARD_GLASS@/@BG_CONTENT_GLASS@两个玻璃渐变端点 token(亮色 rgba(255,255,255,0.65) / 暗色与自定义主题分别为 rgba(45,45,45,0.65)/rgba(31,31,31,0.65) 与 rgba(51,51,51,0.65)/rgba(42,42,42,0.65),与实例选择页左栏一致的玻璃质感);深色/自定义主题下由ThemeManager::applyDarkBarOverride追加 rgba(45,45,45,0.66→0.7) 深色玻璃覆盖,与instanceLeftSidebar处理一致(opencode) -
账户管理页右侧账户面板同步改为悬浮玻璃卡片:右侧区域由布局内普通面板(min/max 300–400px)改为与左侧一致的漂浮卡片
QWidget#accountRightSidebar——固定 200px 宽(与左侧 kBubbleWidth 一致)、不定期布局、float 于页面右上(同距 kBubbleMargin,高度同 = 页高减上下间距),带同款阴影、半透明玻璃渐变背景、16px 圆角与 1px 边框,深色/自定义主题下同样由applyDarkBarOverride追加深色玻璃覆盖;accountManageLayout内容左右内边距改为kBubbleWidth+kBubbleMargin为两侧气泡预留空间,中间皮肤预览保持在两卡之间;updateLeftBubbleGeometry同时负责左右两个气泡的几何、显隐与置顶(登录页展示时一并隐藏)(opencode) -
账户管理页删除「模型背景设置」与「皮肤动作设置」两组控件:右侧面板不再提供 3D 预览的皮肤背景切换(跟随主题/纯色/渐变/自定义颜色/选择图片)与皮肤视角动作(旋转/缩放/重置视角/自动旋转/切换模型),仅保留「模型动作」(肢体动画:待机/挥手/走路/跑步/骑马坐姿)。被删除的成员有
m_skinActionWidget/m_skinActionCombo/m_skinExecuteActionBtn/m_skinModelType/m_bgWidget/m_bgCombo/m_customBgBtn/m_bgImageBtn/m_skinBackgroundKey/m_customBgColor/m_bgImagePath及对应槽与私有方法(onExecuteSkinActionClicked/onBackgroundPresetChanged/onCustomBackgroundClicked/onSelectBackgroundImageClicked/initBackgroundPresetCombo/applySkinBackgroundPreset/selectBackgroundPreset/saveSkinBackgroundPreset与kSkinBackgroundPresets预设表),initSkinModelActions精简并更名为initModelActions,不再依赖 AppColorDialog/AppFileDialog(连带移除对应 include);皮肤预览背景固定为「跟随主题」:主题切换、主题色变化、设置页自定义背景变化时均调用applyThemePresetBackground()(设置页启用自定义背景时全透明透出,Classic 时随主题色),并停止读取/写入skinModelBackground设置键(遗留旧值无害);account_bg_probe探针不受影响(验证的正是跟随主题行为)。右侧玻璃卡片现仍带阴影与半透明背景(opencode) -
账户管理页左侧账户列表选中效果对齐其他子导航栏(SubNavPanel / 实例选择页侧栏):
QPushButton#accountNavBtn选中态由「1px 主色描边盒子 + 内嵌 3px 左竖条 + padding 左移」改为与subNavButton/instanceFolderNavBtn一致的主色渐变填充(@PRIMARY_RGBA_20@ → @PRIMARY_RGBA_8@水平渐变)+ 主色文字(@PRIMARY@)+ 600 字重,左侧 3px 主色指示条交给原本就在滑动的accountHighlight提供;hover 由「白卡 + 描边」改为@BLACK_RGBA_0.06@弱色蒙版 + 主文字(暗色主题自动翻转为白色蒙版),默认态去边框;accountHighlight圆角由 4px 校正为0 3px 3px 0与subNavHighlight完全一致,滑动动画(250ms OutCubic)不变(opencode) -
账户管理页「模型动作」由下拉框 + 执行按钮改为图标 + 文字按钮网格:右侧面板原「模型动作」一行(QComboBox
skinActionCombo五个动作选项 + 独立「执行」按钮)改为 2 列可勾选按钮网格(待机/挥手/走路/跑步 各占一格,「骑马坐姿」文字较长独占一行跨两列),点击按钮即直接切换皮肤模型肢体动作并迁移勾选态(选中态主题色高亮),不再需要先选中再点执行;新增 5 枚描边风格动作图标Images/Icons/pose_idle.svg(Tabler man)/pose_wave.svg(MDI hand-wave-outline)/pose_walk.svg(Tabler walk)/pose_run.svg(Tabler run)/pose_ride.svg(Tabler horse),均已注册进 resources.qrc(Iconify 下载,MIT/Apache-2.0 许可);新增QPushButton#skinPoseButton默认/hover/checked 三态 QSS(checked 用 @PRIMARY_LIGHT@ 底 + @PRIMARY@ 描边文字),并清理无实例的skinActionCombo选择器;AccountManagePage成员m_modelActionCombo/m_modelExecuteActionBtn替换为m_modelPoseButtons列表,槽onExecuteModelActionClicked更名onModelPoseButtonClicked,新增setModelPose(统一动作切换 + 勾选态 + 图标着色,登出/删号重置待机时复用)、refreshModelPoseIcons(themeChanged / themeColorChanged 时按勾选态重新着色)与modelPoseIconColor(选中用主题色、未选中用中性灰)辅助方法;新增探针 tests/account_pose_probe.cpp(复用 release 目标文件链接替换 main.o,同 account_bg_probe 方式),实测 5 按钮图标全部渲染、Dark/Light 主题切换重着色不崩溃、点击走路/骑马坐姿/待机勾选态互斥迁移,输出 account_pose_probe.png / account_pose_probe_dark.png(GLM) -
插件页顶部操作栏(
pluginPageHeader玻璃卡片)四周留白:此前PluginPage主布局mainLayout边距为 0,顶部标题卡片直接贴住页面顶/左/右边缘,观感拥挤;现将顶部操作栏包进一层headerWrap容器,容器布局左右 24px、上 16px、下 12px 边距,使标题卡片与页面边缘 / 下方列表区保留间距,其余内容区边距不变(opencode) -
实例管理页概览页统计数据卡片改为正方形方块,块内「数量」与「类型」保持同一行,「大小」卡不显示“大小”标题、仅展示数据:
InstanceOverviewPage::createStatCard固定为正方形(card->setFixedSize(side, side),边长UiMetrics::kStatCardSize),块内垂直居中排布「上部:居中图标(32→36px,内部图标 16→20px)→ 下部:数量 + 类型同一行横向排布(数量左侧、类型随行,Qt::AlignBottom对齐保持同一底线)」,「大小」卡调用时传入空标题(createStatCard(…, QString(), m_sizeLabel, m_sizeCard)),该行只显示大小数据、不输出“大小”字样;卡片内边距 (8,8,8,8)、QLabel#overviewStatCount字号 24px→18px(保证「1234 启动次数 / 1023.9 MB」类宽文本单行放得进方块)、图标 QSS min/max 32→36px、卡片 padding 16px→6px、圆角 16→14px;UiMetrics常量由kStatCardWidth重命名并为kStatCardSize = 124(注释同步说明下限由「数量 + 类型同行」最宽文本组合决定)。卡片由约 150×122 变为 124×124 的正方形,数量类型同行不换行(opencode) -
皮肤制作页(SkinEditorPage)自定义背景透出策略调整:启用自定义背景(纯色/图片/必应壁纸/流光/旋转,非 Classic 模式)时,左右区域(左侧工具栏
skinEditorLeftBar与右侧预览设置面板skinEditorRightPanel)由原本完全透明透出背景改为接近不透明的玻璃底(rgba 0.92,随亮/暗主题取白/深色)+ 1px 分隔线,只透出一点点背景,保证工具按钮与面板内容可读;中央画布底色(原固定深灰 60,60,60)改为全透明,使自定义背景从画布区域完整透出;3D 立体编辑器与右侧 3D 预览同样去掉原有主题灰色背景改为全透明透出(Skin3DWidget按首页/账户管理页既有方式启用 alpha 缓冲 +WA_AlwaysStackOnTop合成路径后setBackgroundColor(QColor(0,0,0,0)))。SkinTextureCanvas新增可配置底色setBaseColor/baseColor(默认仍为深灰,置透明时自动关闭WA_OpaquePaintEvent以生效),皮肤编辑页监听BackgroundManager::backgroundChanged、ThemeManager::themeChanged与主题色变化实时刷新(恢复 Classic 时还原深灰画布底、3D 控件恢复主题背景并清除左右玻璃底)。改动文件:components/SkinTextureCanvas.{h,cpp}、pages/SkinEditorPage.{h,cpp},两处均已按工程 Makefile.Release 完整编译参数-fsyntax-only验证通过(opencode) -
底部任务栏(TaskBar)样式重构为悬浮玻璃托盘 + 两级信息任务芯片:
TaskBar由「贴底 72px 实心色带 + 单行 8pt 小字胶囊」改为 82px 透明外条内嵌圆角 18px 的悬浮玻璃托盘(#taskBarTray,@BG_GLASS@玻璃底 + 1px@BORDER@,外层四周留 16/6/16/10 留白透出窗口背景),托盘左侧新增活跃任务计数胶囊QLabel#taskCountBadge(主色 12% 底 + 38% 描边,取m_downloadTaskCards.size(),无任务时隐藏),右侧「全部 ▶」改为「全部任务 ›」ghost 按钮(48 高、圆角 12、hover 主色 12% 底 + 主色描边、pressed 主色 20% 底)。任务芯片改为共享宽度:启动卡片常驻托盘左侧 260×48,下载卡片在滚动区内 min 240 / max 380 均分(Expanding + 尾部 stretch,超出视口才出现横向滚动条,滚动条按本区收窄到 6px 并预留竖向空间,卡片不再像旧版那样被滚动条裁掉底部进度条)。卡片视觉整体重做:由「themeColor.lighter(190)淡底 + 6px 圆角 + 单行 8pt 文字 + 贴底 3px 进度条 + 手绘 14px 图标」改为「玻璃卡面(亮色白 84%、暗色白 18%,hover 换主色描边点亮)+ 12px 圆角 + 左侧 24px 状态徽章(下载中/启动中为 60ms QTimer 驱动的旋转弧线,其余状态停止计时)+ 两行信息(12px 600 标题 + 56px 宽进度百分比 / 11px 次级状态与速度)+ 底部内嵌 3px 主题色渐变进度轨」,标题与启动消息按可用宽度做Qt::ElideRight省略号截断(resizeEvent 重算),字号由 pointSize 8/9 统一为 pixelSize 11/12。性能与主题响应:标签/按钮样式由「每次 paintEvent 里 setStyleSheet」移到applyChrome()(内容未变不重设,changeEvent(StyleChange)时刷新),setExpanded不再改 min/max height(旧逻辑会顶掉固定 48 高)。操作按钮改用自绘QIcon(暂停双竖条 / 继续三角 / 取消叉,14px 等距绘制):原先的⏸(U+23F8)、▶(U+25B6) 字形被 Segoe UI Emoji 接管渲染成彩色图标(实测暂停按钮整颗变蓝、继续按钮变蓝底白三角,QSS 里的主题色完全失效,加 U+FE0E 文本变体选择符也无效),自绘后实测暂停#FF9800、继续主色#2E7D32、取消#F44336三色全部正确。style.qss同步:QWidget#taskBar改为透明无边框、新增#taskBarTray/#taskCountBadge/ 本区 6px 滚动条规则,三张任务卡片的 background/border/padding 全部移除(外观由 paintEvent 自绘,且 QSS padding 会改变布局几何),#viewAllTaskBtn在 Section 14 与 Section 35.6 的两处重复定义合并为一处。新增探针tests/taskbar_visual_probe.cpp(复用主程序全部目标文件、仅替换 main,真实 style.qss + 真实 TaskBar/卡片,DownloadTaskManager::addTask只登记任务不触发联网),实测亮/暗主题、2 张与 6 张任务(溢出滚动)、hover 描边点亮、三种按钮图标颜色、布局几何(托盘 66px 高、卡片 48px 居中、滚动条 6px),QSS 解析 0 警告,输出taskbar_light/dark/overflow及_zoom/_hover截图;主程序增量编译链接通过(mimo) -
皮肤制作页(SkinEditorPage)右侧面板三组单选按钮改为下拉框:编辑方式(2D 像素 / 3D 立体)、模型(Classic / Slim)、格式(64x64 / 64x32)原为互斥 QRadioButton 分组,现分别改为 QComboBox(新增成员
m_modeCombo/m_modelCombo/m_formatCombo,删除原m_mode2DRadio/m_mode3DRadio/m_classicRadio/m_slimRadio/m_format64Radio/m_format32Radio),下拉项与默认选中保持一致并保留原 tooltip;文档modelChanged/formatChanged同步由 setChecked 改为 setCurrentIndex(QSignalBlocker 防回环),切换到 64x32 时取消确认改为恢复下拉框索引 0;currentIndexChanged连接分别映射 onEditModeChanged / onModelChanged / onFormatChanged,功能行为不变。改动文件:pages/SkinEditorPage.{h,cpp},并移除 QRadioButton 引用(opencode) -
瀑布流卡片「拿不到封面」时的徽标布局统一重做:原先图标/首字母徽标一律半压在封面右下角(52px),现改为封面缺失时把徽标移到封面区正中并放大(120px 高 banner 用 72px,96px 高 banner 自动收到 72px,四周留空),封面加载成功后再收回右下角半压。新增
MasonryContentCard::logoSizeFor/placeLogo统一定位(logo 开启 scaledContents,尺寸切换时按标签框缩放不裁剪),makeLogoPixmap增加尺寸参数(圆角/字号随边长缩放,52px 与原样一致),loadImageInto增加结果回调供封面成败时挪动徽标。应用到全部瀑布流卡片:内容下载/收藏/本地管理等共用卡(MasonryContentCard::build,有封面 URL 但加载失败也保持居中)、实例管理页-本地资源卡(InstanceFilePage::createMasonryCard,非截图类型永无封面,图标与首字母兜底均居中)、Java 实例选择页与基岩实例选择页(本就无封面,自定义图标/首字母居中,非方图标垫成正方形避免拉伸)。渐变占位色板由 8 色扩到 16 色(paletteFor),减少相邻卡片撞色。安装新实例页的封面迟到回填(loadCoverInto)成功后同样把居中徽标收回右下角。新增探针tests/masonry_badge_probe(真实 MasonryContentCard + 真实 style.qss,渲染本地图标/字母/封面回填/CF 四卡并断言居中 72×72、回填后右下 52×52),输出 D:/BlockBox/_out/masonry_badge_before.png 与 masonry_badge_after.png 已实测通过;改动文件以工程 Makefile.Release 完整编译参数编译并全量链接通过(mimo) -
居中徽标下方的 banner 底色自动匹配图标色系:新增
MasonryContentCard::paletteForIcon——对图标位图做 16 级量化直方图,取出现频率最高的"有颜色"色桶(饱和度 ≥0.22、排除灰/白/黑桶,透明像素跳过)作主色,生成lighter(118)/darker(118)同色系渐变;图标为空或主色过灰时返回 false,回退原散列色板。接入三处:MasonryContentCard::build(本地图标在建卡时直接换底色;网络图标异步到位后、且 banner 仍是渐变占位时再换底色,新增gradientBanner属性标记,封面真正盖上后置 false 避免被覆盖的封面卡重染)、InstanceFilePage::createMasonryCard(图标提取提前到 banner 创建前,非截图类型共用同一 pixmap)、InstanceSelectPage::buildMasonryInstanceCard(自定义图标优先,拿不到回退加载器色)。字母徽标卡不变(banner 与字母本就同取一套色)。探针tests/masonry_badge_probe实测:草方块图标卡 banner 由散列粉色变为土褐色系渐变,与图标同色系;字母卡底色与徽标同色;全量编译链接通过(mimo) -
居中徽标 banner 选色与主题明暗联动:① 主色判定改为"最抢眼"——
paletteForIcon由出现频率最高改为绝对色彩度(max-min)× 亮度加权取最高分(保留 ≥0.22 饱和度、占比 ≥0.5% 色块门槛)。不用 HSV 饱和度是因为它偏爱"暗而饱和"的颜色(草方块实测:土色 sat 0.52 会压过草绿 0.43;换绝对色彩度后选中草绿 rgb(93,142,80))。② 新增MasonryContentCard::shapePairForTheme:浅色模式整对lighter(118)偏亮色系、深色模式整对darker(130)偏暗色系(明暗相对关系保持不变),接入paletteFor(散列色板,覆盖内容卡/本地资源卡/首页最近游玩卡的 banner 与字母徽标)、paletteForIcon(图标同色系渐变)与 Java/基岩实例选择页的加载器色、强调色(banner 与字母徽标同取一对,自始匹配)。探针tests/masonry_badge_probe的 fake ThemeManager 支持BB_PROBE_DARK=1切换深色模式,浅/深两轮实测:四卡 banner 像素均值整体压暗(如草方块卡 (113,162,98)→(81,112,70)、蓝卡 (46,166,225)→(35,121,163)),选色为草绿色系;全量编译链接通过(mimo) -
游戏启动详情页(
LaunchDetailsPage)文字新增白色描边:顶部状态文字(启动日志 / 正在启动… / 游戏运行中 / 启动失败 / 游戏已停止)由普通QLabel换为OutlinedLabel并设置白色描边(setOutlineColor(QColor(Qt::white))+setOutlineWidth(2));正文日志文字由QTextEdit换为OutlinedTextEdit并设置白色描边(描边 1px),二者均复用既有描边组件,描边只落在字形轮廓外、不扰动正文像素。控件 objectName(logStatusLabel/detailsTextEdit)保持不变,style.qss 对应选择器(含滚动条样式)继续生效;LaunchDetailsPage.h中QLabel/QTextEdit成员类型与 include 同步替换。改动文件:pages/LaunchDetailsPage.{h,cpp},均以工程 Makefile.Release 完整编译参数-fsyntax-only验证通过,无新增告警(opencode) -
存档地图页结构标记图标改为「文字旁小图标」并新增风格设置:此前第二行开关与地图标记用的是 Wiki 条目页面主图(pageimages 缩略图,是一张结构概览照片),观感不像图标;现改为生成结构表中文字旁的 16px 像素小图标(
EnvSprite_*.png,直接下载zh.minecraft.wiki/images/<file>,18 种结构逐一配对:村庄new-village/ 掠夺者前哨pillager-outpost/ 海底神殿monument/ 林地府邸mansion/ 沙漠神殿desert-pyramid/ 丛林神庙jungle-pyramid/ 沼泽小屋swamp-hut/ 冰屋igloo/ 海底废墟ocean-ruin/ 沉船shipwreck/ 废弃传送门ruined-portal/ 远古城市ancient-city/ 埋藏宝藏bonus-chest/ 废弃矿井abandoned-mineshaft/ 试炼密室trial-chambers/ 下界要塞fortress/ 猪灵堡垒bastion-remnant/ 末地城end-city),默认即此风格。原「结构概览」风格保留:设置>常规新增「地图结构图标」卡片(下拉「图标(文字旁小图标)」/「结构概览(页面主图)」),经SettingsManager新增get/setMapStructureIconStyle(设置键worldMap/structureIconStyle,默认 Icon)持久化;设置页切换时同步调StructureIcons::setStyle()立即生效(清内存缓存 + 触发 onUpdated 通知已打开的地图页重取图标),地图页构造时也读设置应用一次。实现:StructureDef新增envSprite字段;StructureIcons拆双模式——Icon 直下图片文件、Overview 走原 pageimages 查询,磁盘缓存按<key>.icon.png/<key>.png分开存放互不覆盖,内存键含风格,离线/失败仍回退内置徽章。验证:world_map_page_probe新增 6 条断言——默认风格为 Icon、18 个*.icon.png全部落盘(15s 内等待下载)、切 Overview 生效且 pixmap 可解析、两套缓存并存(磁盘 36 = 18+18)、切回 Icon,全量 72 项 PASS / 0 FAIL;截图_out/wmp_icon_style_bar.png(第二行已是像素小图标)。structure_probe 全过、压力探针 60/60 存活、主程序全量编译链接通过(探针侧新增fake/utils/SettingsManager.h桩并注册 HEADERS 走 moc,避免拉入 TranslationService 依赖链)(mimo)
修复
-
修复皮肤制作页打开时控制台刷屏大量「Unknown property box-shadow」警告的问题:
styles/style.qss中QRadioButton:focus::indicator规则残留了box-shadow: 0 0 0 3px @PRIMARY_RGBA_26@;(Qt 6 QSS 不支持 box-shadow,该属性无效),皮肤制作页初始化时为大量子控件逐次应用样式表、每次重解析全局 QSS 都会重复输出该警告;移除该无效属性,保留原有的border-color: @PRIMARY@焦点描边,警告全部消除(opencode) -
修复 AI 助手页引用标签圆角未生效的问题:Qt 不钳制超出控件尺寸的 border-radius(999px 会渲染成直角),改为 8px(mimo)
-
修复「实例-模组」页中带中文翻译的模组卡片,其版本/加载器/作者等 chip 标签渲染成直角的问题:灰色英文副标题撑高了固定 76px 的卡片,把 chip 压缩到不足半圆角高度(实测 21px→13px),Qt QSS 对超尺寸圆角不收敛直接画直角;改为单行合并名称后卡片不再溢出,chip 恢复圆角(opencode)
-
修复 AI 助手页底部「思考强度 / 权限」两个选择框与其他两个按钮(模型 / 工作区)高度不一致的问题:原 QSS 的 min-height:20px + 上下各 4px 内边距使这两个下拉框实际渲染为 30px,比固定 28px 的按钮高出 2px;移除下拉框的 min-height 与垂直内边距、改为与按钮一致的
padding: 0 12px(紧凑模式0 8px),四个选择框现在高度统一(opencode) -
修复左侧导航栏底色仍比顶栏暗一截、看起来“顶栏更白”的问题:真正原因不是样式表,而是本机设置里残留的自定义「侧边栏背景色」
#F5F5F5(ThemeManager::applySidebarBgOverride 会把它以rgba(245,245,245,0.65)追加到样式表末尾、覆盖 SideBar 默认规则),使侧栏渲染为纯平 #F5F5F5,而顶栏始终是白色玻璃渐变(约 #FBFBFB–#FCFCFC),两者相差约 6~7 个色阶;已清空该自定义值(等同设置页「恢复默认值」),让侧栏回落到与顶栏一致的默认玻璃渐变;同时重编译使 style.qss 的渐变修改进入 QRC 生效(opencode) -
AI 助手页底部四个选择框的下拉倒三角统一为一个新 SVG:新建
Images/Icons/arrow_down_triangle.svg并注册进 resources.qrc;「思考强度 / 权限」两个 QComboBox 的::down-arrow由原来的 CSS 边框三角改为引用该 SVG;「模型 / 工作区」两个 QPushButton 的文本后缀▾字形改为以该 SVG 作为右对齐图标(setIcon + setLayoutDirection(Qt::RightToLeft)),四个选择框三角图标外观统一(opencode) -
修复 AI 助手页「思考强度 / 权限」下拉框出现"倒三角 + 直角方框"叠影的问题:全局基础规则
QComboBox::down-arrow仍用 border 绘制 CSS 三角(border-top/left/right),对象名规则只改了 image 和宽高、未清除继承的 border,导致 SVG 倒三角与 CSS 三角叠加;在aiChatThinkingEffortCombo/aiChatPermissionCombo的::down-arrow规则中补上border: none;清除叠影(opencode) -
修复账户管理页中间皮肤预览在设置页启用自定义背景后仍不显示背景的问题:预览控件原先始终以不透明主题色清屏,把主窗口自定义背景挡在外面;现在「跟随主题」预设在自定义背景启用(非 Classic 模式)时改为全透明清屏,让纯色/图片/必应壁纸等自定义背景从预览区完整透出(与首页皮肤预览一致启用 alpha 缓冲 + WA_AlwaysStackOnTop 合成路径,普通合成路径会把 GL 当不透明处理),并监听 BackgroundManager::backgroundChanged 在设置页改动背景时实时刷新;新增探针 tests/account_bg_probe.cpp 实测三种场景(自定义纯色透出 / Classic 保持主题色 / 页面打开时切换背景实时生效)均通过(mimo)
-
修复安装新实例时 BMCL 源必然失败的问题:
VersionDownloader::getClientDownloadUrl把客户端 JAR 的 Mojang 地址(piston-data.mojang.com/v1/objects/<hash>/client.jar)替换到 BMCLAPI 镜像时误将/v1路径段丢掉,生成了不存在的bmclapi2.bangbang93.com/objects/<hash>/client.jar端点(该端点稳定返回 HTTP 429),客户端 JAR 下载 3 次重试全部在毫秒级瞬间失败,整个安装随之报「下载失败」;现保留/v1段指向正确镜像端点bmclapi2.bangbang93.com/v1/objects/<hash>/client.jar。修复过程中实测发现并连带修复四个会导致「装不上/卡死」的薄弱点:① 分段下载重试耗尽降级单连接后downloadSingleFile未设isClientJar标记,下载成功后既不推进阶段也不报错,任务会永远停在「下载客户端 JAR」阶段(现补齐标记,降级路径同时带上 SHA1 校验与官方兜底地址);② 并发分段同时耗尽重试会互相踩踏重复降级(新增m_segmentFallbackStarted防重入,同一文件只降级一次);③ BMCL 源沿用官方源的高并发(最多 128 并发 + 16 分段)极易触发 BMCLAPI 单 IP 限流 429(BMCL 降为 8 并发 + 4 分段,effectiveConcurrentLimit());④ BMCL 的镜像后端由多所高校镜像负载均衡、可能单个故障(实测中科大镜像对 netty 本地库连续 403),依赖库/资源/客户端 JAR 全部保留官方源地址作兜底(PendingDownload::fallbackUrl),镜像失败自动切换官方源重试一次且不增加总重试次数。配套加固:downloadSingleFile与分段下载对齐强制 HTTP/1.1(BMCLAPI 会 302 到兼容性较差的对象存储后端,Qt 默认 HTTP/2 下出现 "HTTP/2 protocol error" 瞬时失败);重试改为退避延迟(普通错误 800ms×次数、限流 429/503 2000ms×次数,scheduleFileRetry,退避期间持有并发槽位防止阶段被提前判定完成,定时器带任务代数校验避免过期重试污染新任务);客户端 JAR 校验失败改为原参数重下而非入公共队列(ClientJar 阶段无队列泵,入队会永久滞留);小文件客户端 JAR 补设url属性(此前重试会拿到空地址);最终失败提示带上真实网络错误原因便于排查。新增端到端探针tests/install_vanilla_e2e_probe.cpp/.pro(真实网络全链路:清单→版本JSON→客户端JAR→依赖库→资源索引→4000+资源文件落盘,信号带时间戳全量打印,看门狗 600s 判卡死),实测:修复前 BMCL 源 1.21.1 复现安装失败(429×3 瞬间烧光重试);修复后官方源 1.21.1 三次全链路安装成功(60s/34.7s/29s)、BMCL 源 1.21.4 全链路安装成功(46.4s,客户端 JAR 经镜像 302 链正常下载);主程序增量构建通过(GLM) -
修复通用设置项「写得到、读不到」的读写不对称问题:
SettingsManager的setProperty()落在 QSettings,但全工程 15+ 处property("xxx")读取因SettingsManager未声明property()而命中 Qt 的QObject::property(const char*)(读的是 QObject 动态属性,与 QSettings 完全独立),导致use_mcim(MCIM 镜像开关)开关后重进设置页/发起检索始终回落默认值、curseforge_api_key写入后永远读出空值;现新增QVariant SettingsManager::property(const char *key, const QVariant &defaultValue = QVariant()) const重载(实作为m_settings->value())刻意遮蔽QObject::property,使全部字符串字面量读取与写入同源,一处修复覆盖use_mcim、curseforge_api_key全部读取点且不影响控件自身动态属性用法。改动文件:utils/SettingsManager.h/.cpp;utils/SettingsManager.cpp、pages/settings/SettingsGeneralPage.cpp、pages/SearchPage.cpp以工程 Makefile.Release 完整编译参数-fsyntax-only验证通过(GLM) -
修复「全部来源」下载源切换/翻页的两处列表错乱(跨源合并功能联调时发现):① 空搜索词下切换「下载源」下拉(如 全部来源→CurseForge)不重新加载——
onSourceChanged仅在有搜索词时触发检索,而分类加载回调的补检索又被非空的旧列表挡住,页面一直残留上一来源的旧卡片;现ModDownloadPage/ContentDownloadPage的onSourceChanged无论有无搜索词都清列表重新检索(分类回调的补检索有m_isLoading防重入,不会双请求)。② 全部来源模式下两源搜索回调各自m_pageCache[当前页] = result.mods相互覆盖,翻页缓存只留后到来源的 20 条,翻回该页时另一来源结果丢失;现缓存改在双源合并后的flushAllSourceResults统一写入完整合并列表(GLM) -
修复安装新实例→版本详情页(选择加载器页)加载器卡片下面有一层多余的鼠标悬浮效果:根因是
styles/style.qss里同一行叠了两层 hover——卡片自身QWidget#modCardListItem:hover(背景 + 主色描边)之外,底层列表项还有QListWidget#loaderListWidget::item:hover { background-color: @BG_HOVER@ };实测列表项与卡片并未完全重合(item rect y=8 而卡片 widget y=9,且列表项圆角 8px 小于卡片圆角 12px),悬停时列表项的灰色 hover 底会从卡片四角圆角差和顶部 1px 缝透出来,看起来像"卡片下面多垫了一层"。修复将::item/::item:hover/::item:selected及列表容器全部改为 transparent(容器同时去边框、padding 改0 14px),让 modCardListItem 卡片独立悬浮、只保留卡片自身一层 hover。新增探针tests/loader_hover_probe/(真实 style.qss + 置顶窗口真实光标悬停 + 逐像素比对)实测:悬停前后差异 bbox 恰为卡片矩形 (42,29)-(677,104),卡片圆角外 0 像素外溢(mimo)




