From abbb884d02bb10d20f2928d49145befdb8213025 Mon Sep 17 00:00:00 2001 From: ci010 Date: Tue, 4 Feb 2025 12:59:44 +0800 Subject: [PATCH] fix: Optimize the export dialog files display/selection --- .../components/InstanceManifestFileItem.vue | 9 ++++----- .../src/composables/instanceFileNodeData.ts | 6 ++++++ .../src/composables/instanceMods.ts | 2 ++ xmcl-keystone-ui/src/views/AppExportDialog.vue | 18 +++++++++--------- .../instanceIO/InstanceFileDiscover.ts | 3 +++ 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue b/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue index 783a24a9b..e4575ff45 100644 --- a/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue +++ b/xmcl-keystone-ui/src/components/InstanceManifestFileItem.vue @@ -24,20 +24,19 @@ chevron_right - - + {{ getIcon(item) }} - +
@@ -55,7 +54,7 @@
{{ getExpectedSize(item.size) }} diff --git a/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts b/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts index d15ece9c8..6a28d54b6 100644 --- a/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts +++ b/xmcl-keystone-ui/src/composables/instanceFileNodeData.ts @@ -2,6 +2,8 @@ import { InjectionKey, Ref } from 'vue' import { InstanceFile } from '@xmcl/runtime-api' import { basename } from '@/util/basename' import { CSSProperties } from 'vue/types/jsx' +import { injection } from '@/util/inject' +import { kInstanceModsContext } from './instanceMods' export interface InstanceFileNode { name: string @@ -28,6 +30,7 @@ export type InstanceFileExportData = { } export function useInstanceFileNodesFromLocal(local: Ref) { + const { modsIconsMap } = injection(kInstanceModsContext) function getFileNode(f: InstanceFile): InstanceFileNode { return reactive({ name: basename(f.path), @@ -42,6 +45,9 @@ export function useInstanceFileNodesFromLocal(local: Ref) { modrinth: !!f.modrinth, }, children: undefined, + curseforge: !!f.curseforge, + modrinth: !!f.modrinth, + avatar: modsIconsMap.value[basename(f.path, '/')], }) } const result = ref(local.value.map(getFileNode)) diff --git a/xmcl-keystone-ui/src/composables/instanceMods.ts b/xmcl-keystone-ui/src/composables/instanceMods.ts index ea3564e57..34e890c39 100644 --- a/xmcl-keystone-ui/src/composables/instanceMods.ts +++ b/xmcl-keystone-ui/src/composables/instanceMods.ts @@ -8,6 +8,7 @@ import { InjectionKey, Ref } from 'vue' import { useLocalStorageCache } from './cache' import { useService } from './service' import { useState } from './syncableState' +import { basename } from '@/util/basename' export const kInstanceModsContext: InjectionKey> = Symbol('instance-mods') @@ -106,6 +107,7 @@ export function useInstanceMods(instancePath: Ref, instanceRuntime: Ref< for (const item of newItems) { // Update icon map newIconMap[item.modId] = item.icon + newIconMap[basename(item.path)] = item.icon if (item.enabled) { for (const [key, val] of Object.entries(item.provideRuntime)) { runtime[key] = val diff --git a/xmcl-keystone-ui/src/views/AppExportDialog.vue b/xmcl-keystone-ui/src/views/AppExportDialog.vue index 6d1ac532c..9d1fc1a58 100644 --- a/xmcl-keystone-ui/src/views/AppExportDialog.vue +++ b/xmcl-keystone-ui/src/views/AppExportDialog.vue @@ -405,15 +405,15 @@ const { refresh, refreshing } = useRefreshable(async () => { const files = manifest.files let selected = [] as string[] selected = files - .filter(file => !file.path.startsWith('.')) - .filter(file => !file.path.startsWith('logs')) - .filter(file => !file.path.startsWith('crash-reports')) - .filter(file => !file.path.startsWith('saves')) - .filter(file => !file.path.startsWith('resourcepacks')) - .filter(file => !file.path.startsWith('screenshots')) - .filter(file => !file.path.startsWith('data')) - .filter(file => !file.path.startsWith('server')) - .filter(file => !exclusions.includes(file.path)) + .filter(file => file.path.startsWith('resourcepacks') + || file.path.startsWith('mods') + || file.path.startsWith('config') + || file.path.startsWith('scripts') + || file.path.startsWith('shaderpacks') + || file.path.startsWith('options.txt') + || file.path.startsWith('optionsof.txt') + || file.path.startsWith('servers.dat')) + .filter(file => !file.path.endsWith('.disabled')) .map(file => file.path) nextTick().then(() => { data.selected = selected }) data.files = files diff --git a/xmcl-runtime/instanceIO/InstanceFileDiscover.ts b/xmcl-runtime/instanceIO/InstanceFileDiscover.ts index 9d68c74bd..69419d40b 100644 --- a/xmcl-runtime/instanceIO/InstanceFileDiscover.ts +++ b/xmcl-runtime/instanceIO/InstanceFileDiscover.ts @@ -28,6 +28,9 @@ export async function discover(instancePath: string, logger: Logger, filter?: (r if (relativePath === 'instance.json') { return } + if (relativePath === 'server' && status.isDirectory()) { + return + } // no lib or exe if (relativePath.endsWith('.dll') || relativePath.endsWith('.so') || relativePath.endsWith('.exe')) { return