From 774e89d19e65f8b90a230f78c40a65f2952f3d53 Mon Sep 17 00:00:00 2001 From: waterfast <1301917161@qq.com> Date: Wed, 4 Jun 2025 19:42:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?6/4/=E6=B7=B7=E6=B2=8C=E4=BB=AA=E5=BC=8F?= =?UTF-8?q?=E4=B9=8B=E5=A4=96=E9=83=A8=E8=AF=BB=E5=8F=96=E5=8D=A1=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Fk/skin-bank.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Fk/skin-bank.js b/Fk/skin-bank.js index f5c4336..bbe8b60 100644 --- a/Fk/skin-bank.js +++ b/Fk/skin-bank.js @@ -44,6 +44,11 @@ function getGeneralExtraPic(name, extra) { function getGeneralPicture(name) { const data = lcall("GetGeneralData", name); const extension = data.extension; + const diyPath = AppPath + "/diyimage/" + extension + "/generals/" + + name + ".jpg"; + if (Backend.exists(diyPath)) { + return diyPath; + } const path = AppPath + "/packages/" + extension + "/image/generals/" + name + ".jpg"; if (Backend.exists(path)) { @@ -63,6 +68,11 @@ function getCardPicture(cidOrName) { extension = data.extension; name = data.name; } + const diyPath = AppPath + "/diyimage/" + extension + "/card/" + + name + ".jpg"; + if (Backend.exists(diyPath)) { + return diyPath; + } let path = AppPath + "/packages/" + extension + "/image/card/" + name + ".png"; -- Gitee From 83e63fdb664feaee81f3d487132c89fa56500c48 Mon Sep 17 00:00:00 2001 From: waterfast <1301917161@qq.com> Date: Thu, 5 Jun 2025 14:03:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?6/5/ui=E5=B0=8F=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Fk/Config.qml | 3 + Fk/Pages/Init.qml | 9 ++ Fk/Pages/ResourcePackManage.qml | 207 ++++++++++++++++++++++++++++++++ Fk/Pages/qmldir | 1 + Fk/main.qml | 1 + Fk/skin-bank.js | 49 +++++--- 6 files changed, 255 insertions(+), 15 deletions(-) create mode 100644 Fk/Pages/ResourcePackManage.qml diff --git a/Fk/Config.qml b/Fk/Config.qml index f2d043c..8d391d2 100644 --- a/Fk/Config.qml +++ b/Fk/Config.qml @@ -36,6 +36,7 @@ QtObject { property var curScheme property list shownPkg: [] property list favoriteGenerals: [] + property list enabledResourcePacks: [] property int preferredTimeout property int preferredLuckTime @@ -167,6 +168,7 @@ QtObject { shownPkg = conf.shownPkg ?? []; favoriteGenerals = conf.favoriteGenerals ?? []; blockedUsers = conf.blockedUsers ?? []; + enabledResourcePacks = conf.enabledResourcePacks ?? []; } function saveConf() { @@ -206,6 +208,7 @@ QtObject { conf.currentDisableIdx = currentDisableIdx; conf.favoriteGenerals = favoriteGenerals; conf.blockedUsers = blockedUsers; + conf.enabledResourcePacks = enabledResourcePacks; Backend.saveConf(JSON.stringify(conf, undefined, 2)); } diff --git a/Fk/Pages/Init.qml b/Fk/Pages/Init.qml index f356af1..1ce36da 100644 --- a/Fk/Pages/Init.qml +++ b/Fk/Pages/Init.qml @@ -92,6 +92,15 @@ Item { } } + Button { + Layout.fillWidth: true + text: qsTr("管理资源包") + onClicked: { + mainStack.push(resourcePackManage); + // 资源包管理界面后续实现 + } + } + Button { Layout.fillWidth: true text: qsTr("Quit Game") diff --git a/Fk/Pages/ResourcePackManage.qml b/Fk/Pages/ResourcePackManage.qml new file mode 100644 index 0000000..b57c96b --- /dev/null +++ b/Fk/Pages/ResourcePackManage.qml @@ -0,0 +1,207 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Item { + id: root + + // 用 ListModel 管理可用和已启用资源包 + ListModel { id: availablePackModel } + ListModel { id: enabledPackModel } + + function getPackDesc(packName) { + return ""; + } + + Component.onCompleted: { + availablePackModel.clear(); + enabledPackModel.clear(); + let allPacks = Backend.ls(AppPath + "/resource_pak/"); + let enabled = config.enabledResourcePacks || []; + let enabledSet = new Set(enabled.filter(p => allPacks.indexOf(p) !== -1)); + let available = allPacks.filter(p => !enabledSet.has(p)); + enabled.forEach(p => { if (allPacks.indexOf(p) !== -1) enabledPackModel.append({ name: p }); }); + available.forEach(p => availablePackModel.append({ name: p })); + } + + ToolBar { + RowLayout { + anchors.fill: parent + ToolButton { text: "刷新"; onClicked: root.Component.onCompleted() } + Label { text: "关注猫雷谢谢喵" } + } + } + + RowLayout { + anchors.fill: parent + anchors.margins: 60 + spacing: 40 + anchors.verticalCenter: parent.verticalCenter + + Rectangle { + radius: 16 + color: "#80FFFFFF" + border.color: "#eeeeee" + //opacity: 0.5 + + border.width: 1 + Layout.fillWidth: true + Layout.preferredWidth: 340 + height: 420 + anchors.verticalCenter: parent.verticalCenter + ColumnLayout { + anchors.fill: parent + anchors.margins: 32 + spacing: 24 + Label { + text: "可用资源包" + font.bold: true + font.pixelSize: 20 + horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter + } + ListView { + Layout.fillWidth: true + Layout.fillHeight: true + model: availablePackModel + delegate: ItemDelegate { + width: parent.width + height: 56 + Row { + spacing: 8 + Rectangle { + width: 40; height: 40; radius: 8 + color: "black" + Image { + anchors.fill: parent + anchors.margins: 2 + source: AppPath + "/resource_pak/" + name + "/icon.png" + fillMode: Image.PreserveAspectFit + visible: status === Image.Ready + } + } + Text { text: name; font.bold: true; font.pixelSize: 16 } + } + onClicked: { + enabledPackModel.insert(0, { name: name }); + availablePackModel.remove(index); + } + } + footer: Label { + text: "共 " + availablePackModel.count + " 个可用资源包" + horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter + } + } + } + } + + // 中间操作按钮(可选) + ColumnLayout { + spacing: 10 + anchors.verticalCenter: parent.verticalCenter + Button { + text: ">>" + enabled: availableListView.currentIndex >= 0 + onClicked: { + let idx = availableListView.currentIndex; + if (idx >= 0) { + let item = availablePackModel.get(idx); + enabledPackModel.insert(0, { name: item.name }); + availablePackModel.remove(idx); + } + } + } + Button { + text: "<<" + enabled: enabledListView.currentIndex >= 0 + onClicked: { + let idx = enabledListView.currentIndex; + if (idx >= 0) { + let item = enabledPackModel.get(idx); + availablePackModel.insert(0, { name: item.name }); + enabledPackModel.remove(idx); + } + } + } + } + + Rectangle { + radius: 16 + color: "#80FFFFFF" + //opacity: 0.3 + border.color: "#eeeeee" + border.width: 1 + Layout.fillWidth: true + Layout.preferredWidth: 340 + height: 420 + ColumnLayout { + anchors.fill: parent + anchors.margins: 16 + Label { + text: "已启用资源包(优先级高在上)" + font.bold: true + font.pixelSize: 20 + horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter + } + ListView { + id: enabledListView + Layout.fillWidth: true + Layout.fillHeight: true + model: enabledPackModel + delegate: ItemDelegate { + width: parent.width + height: 56 + Row { + spacing: 8 + Rectangle { + width: 40; height: 40; radius: 8 + color: "black" + Image { + anchors.fill: parent + anchors.margins: 2 + source: AppPath + "/resource_pak/" + name + "/icon.png" + fillMode: Image.PreserveAspectFit + visible: status === Image.Ready + } + } + Text { text: name; font.bold: true; font.pixelSize: 16 } + } + onClicked: { + availablePackModel.insert(0, { name: name }); + enabledPackModel.remove(index); + } + } + footer: Label { + text: "共 " + enabledPackModel.count + " 个已启用资源包" + horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter + } + } + } + } + } + + // 底部按钮 + Row { + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + spacing: 20 + Button { + text: "完成" + onClicked: { + let enabledList = []; + for (let i = 0; i < enabledPackModel.count; ++i) { + enabledList.push(enabledPackModel.get(i).name); + } + config.enabledResourcePacks = enabledList; + config.saveConf(); + if (mainStack) mainStack.pop(); + } + } + } + + // 便于按钮操作 + ListView { id: availableListView; visible: false; model: availablePackModel } +} \ No newline at end of file diff --git a/Fk/Pages/qmldir b/Fk/Pages/qmldir index c5f9aad..f041d2a 100644 --- a/Fk/Pages/qmldir +++ b/Fk/Pages/qmldir @@ -9,6 +9,7 @@ MetroButton 1.0 MetroButton.qml MetroToggleButton 1.0 MetroToggleButton.qml ModesOverview 1.0 ModesOverview.qml PackageManage 1.0 PackageManage.qml +ResourcePackManage 1.0 ResourcePackManage.qml Room 1.0 Room.qml Replay 1.0 Replay.qml TileButton 1.0 TileButton.qml diff --git a/Fk/main.qml b/Fk/main.qml index a5092ba..bc18018 100644 --- a/Fk/main.qml +++ b/Fk/main.qml @@ -51,6 +51,7 @@ Window { Component { id: init; Init {} } Component { id: packageManage; PackageManage {} } + Component { id: resourcePackManage; ResourcePackManage {} } Component { id: lobby; Lobby {} } Component { id: generalsOverview; GeneralsOverview {} } Component { id: cardsOverview; CardsOverview {} } diff --git a/Fk/skin-bank.js b/Fk/skin-bank.js index bbe8b60..4caed86 100644 --- a/Fk/skin-bank.js +++ b/Fk/skin-bank.js @@ -21,6 +21,14 @@ var LOBBY_IMG_DIR = AppPath + "/image/lobby/"; var MISC_DIR = AppPath + "/image/misc/"; const searchPkgResource = function(path, name, suffix) { + + if (typeof config !== "undefined" && config.enabledResourcePacks) { + for (let packName of config.enabledResourcePacks) { + let resPath = AppPath + "/resource_pak/" + packName + "/packages/" + path + name + suffix; + if (Backend.exists(resPath)) return resPath; + } + } + let ret; for (let dir of Backend.ls(AppPath + "/packages/")) { if (Pacman.getDisabledPacks().includes(dir) || @@ -44,16 +52,21 @@ function getGeneralExtraPic(name, extra) { function getGeneralPicture(name) { const data = lcall("GetGeneralData", name); const extension = data.extension; - const diyPath = AppPath + "/diyimage/" + extension + "/generals/" - + name + ".jpg"; - if (Backend.exists(diyPath)) { - return diyPath; + + if (typeof config !== "undefined" && config.enabledResourcePacks) { + for (let packName of config.enabledResourcePacks) { + let path = AppPath + "/resource_pak/" + packName + "/packages/" + extension + "/image/generals/" + name + ".jpg"; + if (Backend.exists(path)) return path; + } } - const path = AppPath + "/packages/" + extension + "/image/generals/" - + name + ".jpg"; + + + const path = AppPath + "/packages/" + extension + "/image/generals/" + name + ".jpg"; if (Backend.exists(path)) { return path; } + + return GENERAL_DIR + "0.jpg"; } @@ -64,24 +77,28 @@ function getCardPicture(cidOrName) { name = cidOrName; extension = lcall("GetCardExtensionByName", cidOrName); } else { - const data = lcall("GetCardData", cid); + const data = lcall("GetCardData", cidOrName); extension = data.extension; name = data.name; } - const diyPath = AppPath + "/diyimage/" + extension + "/card/" - + name + ".jpg"; - if (Backend.exists(diyPath)) { - return diyPath; + + + if (typeof config !== "undefined" && config.enabledResourcePacks) { + for (let packName of config.enabledResourcePacks) { + let path = AppPath + "/resource_pak/" + packName + "/packages/" + extension + "/image/card/" + name + ".png"; + if (Backend.exists(path)) return path; + } } - let path = AppPath + "/packages/" + extension + "/image/card/" - + name + ".png"; + + let path = AppPath + "/packages/" + extension + "/image/card/" + name + ".png"; if (Backend.exists(path)) { return path; } else { let ret = searchPkgResource("/image/card/", name, ".png"); if (ret) return ret; } + return CARD_DIR + "unknown.png"; } @@ -135,7 +152,7 @@ function getGeneralCardDir(kingdom) { return GENERALCARD_DIR; } } - +//身份和死亡嘛先算了吧 function getRolePic(role) { let path = ROLE_DIR + role + ".png"; if (Backend.exists(path)) { @@ -157,9 +174,11 @@ function getRoleDeathPic(role) { } return DEATH_DIR + "hidden.png"; } - +//mark嘛先算了吧 function getMarkPic(mark) { let ret = searchPkgResource("/image/mark/", mark, ".png"); if (ret) return ret; return ""; } + + -- Gitee