2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-06-17 14:02:12 +00:00

refactor: use webwindowed-api package (#833)

This commit is contained in:
Jan
2026-06-16 13:17:08 +02:00
committed by GitHub
parent 040826b1f3
commit 4fd164ee33
14 changed files with 80 additions and 71 deletions
+19 -11
View File
@@ -994,16 +994,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@laupetin/vite-plugin-cpp-header": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@laupetin/vite-plugin-cpp-header/-/vite-plugin-cpp-header-1.1.0.tgz",
"integrity": "sha512-nUf5yTkL+oy7VxdTOe6jpx3juZksMI7f+zpA9Ns7PSAB+0vcXAa5wtkdFfbn93HaBc2QI3hJZmdfOzsCihD3Ow==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"vite": ">=7.0.0"
}
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
@@ -2687,6 +2677,23 @@
}
}
},
"node_modules/@webwindowed/vite-plugin-cpp-header": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@webwindowed/vite-plugin-cpp-header/-/vite-plugin-cpp-header-1.0.0.tgz",
"integrity": "sha512-0eALUR+M6rkq45FXslE36/UJWZ2Xy9Gt+JH1GNINnlp9QH+JP7wBqp228+bUHuSxgGIiSXsSQi3C0CA+AbmxRg==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"vite": ">=7.0.0"
}
},
"node_modules/@webwindowed/web-api": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@webwindowed/web-api/-/web-api-1.0.0.tgz",
"integrity": "sha512-/vshvMK/ApurI2Rapt5RsbhuFQZZ+IyhhSd2Plvm39otxg+DTSN6kLoiOhTTmT1rG2QNBZKvQ7f2BLjwzXF1hQ==",
"dev": true,
"license": "MIT"
},
"node_modules/abbrev": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
@@ -6883,7 +6890,6 @@
"vue-router": "5.1.0"
},
"devDependencies": {
"@laupetin/vite-plugin-cpp-header": "1.1.0",
"@tsconfig/node24": "24.0.4",
"@types/jsdom": "28.0.3",
"@types/node": "25.9.2",
@@ -6893,6 +6899,8 @@
"@vue/eslint-config-typescript": "14.8.0",
"@vue/test-utils": "2.4.11",
"@vue/tsconfig": "0.9.1",
"@webwindowed/vite-plugin-cpp-header": "1.0.0",
"@webwindowed/web-api": "1.0.0",
"eslint": "10.4.1",
"eslint-plugin-vue": "10.9.2",
"jiti": "2.7.0",
+1
View File
@@ -0,0 +1 @@
dist
+2 -1
View File
@@ -22,7 +22,6 @@
"vue-router": "5.1.0"
},
"devDependencies": {
"@laupetin/vite-plugin-cpp-header": "1.1.0",
"@tsconfig/node24": "24.0.4",
"@types/jsdom": "28.0.3",
"@types/node": "25.9.2",
@@ -32,6 +31,8 @@
"@vue/eslint-config-typescript": "14.8.0",
"@vue/test-utils": "2.4.11",
"@vue/tsconfig": "0.9.1",
"@webwindowed/vite-plugin-cpp-header": "1.0.0",
"@webwindowed/web-api": "1.0.0",
"eslint": "10.4.1",
"eslint-plugin-vue": "10.9.2",
"jiti": "2.7.0",
+6 -2
View File
@@ -1,3 +1,5 @@
import { getBinds } from "@webwindowed/web-api";
export enum CommonAssetType {
PHYS_PRESET = "PHYS_PRESET",
XANIM = "XANIM",
@@ -84,6 +86,8 @@ export interface ZoneAssetsDto {
references: AssetDto[];
}
export interface AssetBinds {
type AssetBinds = {
getAssetsForZone(zoneName: string): Promise<ZoneAssetsDto | null>;
}
};
export const { getAssetsForZone } = getBinds<AssetBinds>();
+6 -2
View File
@@ -1,3 +1,5 @@
import { getBinds } from "@webwindowed/web-api";
export interface FileDialogFilterDto {
name: string;
filter: string;
@@ -11,8 +13,10 @@ export interface SaveFileDialogDto {
filters?: FileDialogFilterDto[];
}
export interface DialogBinds {
type DialogBinds = {
openFileDialog(options?: OpenFileDialogDto): Promise<string | null>;
saveFileDialog(options?: SaveFileDialogDto): Promise<string | null>;
folderSelectDialog(): Promise<string | null>;
}
};
export const { openFileDialog, saveFileDialog, folderSelectDialog } = getBinds<DialogBinds>();
+6
View File
@@ -0,0 +1,6 @@
import { getEvents } from "@webwindowed/web-api";
import type { UnlinkingEventMap } from "@/native/UnlinkingBinds.ts";
import type { ZoneEventMap } from "@/native/ZoneBinds.ts";
type NativeEventMap = UnlinkingEventMap & ZoneEventMap;
export const { addEventListener, removeEventListener } = getEvents<NativeEventMap>();
+8 -4
View File
@@ -1,3 +1,5 @@
import { getBinds } from "@webwindowed/web-api";
export interface ZoneUnlinkProgressDto {
zoneName: string;
/**
@@ -6,10 +8,12 @@ export interface ZoneUnlinkProgressDto {
percentage: number;
}
export interface UnlinkingBinds {
type UnlinkingBinds = {
unlinkZone(zoneName: string): Promise<void>;
}
};
export interface UnlinkingEventMap {
export type UnlinkingEventMap = {
zoneUnlinkProgress: ZoneUnlinkProgressDto;
}
};
export const { unlinkZone } = getBinds<UnlinkingBinds>();
+8 -4
View File
@@ -1,3 +1,5 @@
import { getBinds } from "@webwindowed/web-api";
export enum GameId {
IW3 = "IW3",
IW4 = "IW4",
@@ -36,14 +38,16 @@ export interface ZoneUnloadedDto {
zoneName: string;
}
export interface ZoneBinds {
type ZoneBinds = {
getZones(): Promise<ZoneDto[]>;
loadFastFile(path: string): Promise<ZoneLoadedDto>;
unloadZone(zoneName: string): Promise<void>;
}
};
export interface ZoneEventMap {
export type ZoneEventMap = {
zoneLoadProgress: ZoneLoadProgressDto;
zoneLoaded: ZoneLoadedDto;
zoneUnloaded: ZoneUnloadedDto;
}
};
export const { getZones, loadFastFile, unloadZone } = getBinds<ZoneBinds>();
-28
View File
@@ -1,28 +0,0 @@
import type { AssetBinds } from "./AssetBinds";
import type { DialogBinds } from "./DialogBinds";
import type { UnlinkingBinds, UnlinkingEventMap } from "./UnlinkingBinds";
import type { ZoneBinds, ZoneEventMap } from "./ZoneBinds";
export type NativeMethods = AssetBinds & DialogBinds & UnlinkingBinds & ZoneBinds;
type NativeEventMap = UnlinkingEventMap & ZoneEventMap;
type WebWindowedExtensions = {
webwindowedBinds: NativeMethods;
webwindowedAddEventListener<K extends keyof NativeEventMap>(
eventKey: K,
callback: (payload: NativeEventMap[K]) => void,
): void;
webwindowedRemoveEventListener<K extends keyof NativeEventMap>(
eventKey: K,
callback: (payload: NativeEventMap[K]) => void,
): boolean;
};
const windowWithWebWindowedExtensions = window as typeof window & WebWindowedExtensions;
export const webwindowedBinds = windowWithWebWindowedExtensions.webwindowedBinds;
export const webwindowedAddEventListener =
windowWithWebWindowedExtensions.webwindowedAddEventListener;
export const webwindowedRemoveEventListener =
windowWithWebWindowedExtensions.webwindowedRemoveEventListener;
+2 -3
View File
@@ -1,7 +1,6 @@
import { computed, ref } from "vue";
import { defineStore } from "pinia";
import type { ZoneAssetsDto } from "@/native/AssetBinds";
import { webwindowedBinds } from "@/native";
import { getAssetsForZone, type ZoneAssetsDto } from "@/native/AssetBinds";
export const useAssetStore = defineStore("asset", () => {
const zoneName = ref<string | null>(null);
@@ -21,7 +20,7 @@ export const useAssetStore = defineStore("asset", () => {
// Only load assets when there is a new zone name specified
if (!newZoneName) return;
webwindowedBinds.getAssetsForZone(newZoneName).then((res) => {
getAssetsForZone(newZoneName).then((res) => {
if (zoneName.value === newZoneName) {
assetsOfZone.value = res;
}
+5 -4
View File
@@ -1,6 +1,7 @@
import { ref } from "vue";
import { defineStore } from "pinia";
import { webwindowedAddEventListener, webwindowedBinds } from "@/native";
import { addEventListener } from "@/native/Events.ts";
import { unlinkZone as nativeUnlinkZone } from "@/native/UnlinkingBinds.ts";
export const useUnlinkingStore = defineStore("unlinking", () => {
const isUnlinking = ref(false);
@@ -11,8 +12,8 @@ export const useUnlinkingStore = defineStore("unlinking", () => {
isUnlinking.value = true;
lastPercentage.value = 0;
failureMessage.value = null;
return webwindowedBinds
.unlinkZone(zoneName)
return nativeUnlinkZone(zoneName)
.catch((e: string) => {
console.error("Failed to unlink fastfile:", e);
failureMessage.value = e;
@@ -23,7 +24,7 @@ export const useUnlinkingStore = defineStore("unlinking", () => {
});
}
webwindowedAddEventListener("zoneUnlinkProgress", (dto) => {
addEventListener("zoneUnlinkProgress", (dto) => {
lastPercentage.value = dto.percentage;
});
+12 -8
View File
@@ -1,7 +1,12 @@
import { computed, ref } from "vue";
import { defineStore } from "pinia";
import { webwindowedAddEventListener, webwindowedBinds } from "@/native";
import type { ZoneDto, ZoneLoadedDto } from "@/native/ZoneBinds";
import {
getZones,
loadFastFile as nativeLoadFastFile,
type ZoneDto,
type ZoneLoadedDto,
} from "@/native/ZoneBinds";
import { addEventListener } from "@/native/Events.ts";
export const useZoneStore = defineStore("zone", () => {
const loadedZones = ref<ZoneDto[]>([]);
@@ -21,8 +26,7 @@ export const useZoneStore = defineStore("zone", () => {
zonesCurrentlyBeingLoaded.value.push(expectedZoneName);
lastPercentageByZoneName.value[expectedZoneName] = 0;
return webwindowedBinds
.loadFastFile(fastFilePath)
return nativeLoadFastFile(fastFilePath)
.catch((e: string) => {
console.error("Failed to load fastfile:", e);
})
@@ -44,21 +48,21 @@ export const useZoneStore = defineStore("zone", () => {
}
// Initially get all loaded zones
webwindowedBinds.getZones().then((allZones) => {
getZones().then((allZones) => {
loadedZones.value = allZones;
});
webwindowedAddEventListener("zoneLoadProgress", (dto) => {
addEventListener("zoneLoadProgress", (dto) => {
if (lastPercentageByZoneName.value[dto.zoneName] !== undefined) {
lastPercentageByZoneName.value[dto.zoneName] = dto.percentage;
}
});
webwindowedAddEventListener("zoneLoaded", (dto) => {
addEventListener("zoneLoaded", (dto) => {
loadedZones.value.push(dto.zone);
});
webwindowedAddEventListener("zoneUnloaded", (dto) => {
addEventListener("zoneUnloaded", (dto) => {
const index = loadedZones.value.findIndex((zone) => zone.name === dto.zoneName);
if (index >= 0) {
loadedZones.value.splice(index, 1);
@@ -4,7 +4,8 @@ import ProgressBar from "primevue/progressbar";
import Listbox from "primevue/listbox";
import { computed } from "vue";
import { useZoneStore } from "@/stores/ZoneStore";
import { webwindowedBinds } from "@/native";
import { openFileDialog } from "@/native/DialogBinds.ts";
import { unloadZone } from "@/native/ZoneBinds.ts";
interface SelectableZone {
isLoading: boolean;
@@ -15,7 +16,7 @@ const zoneStore = useZoneStore();
const selectedZone = defineModel<string | null>("selectedZone");
async function openFastFileSelect() {
return await webwindowedBinds.openFileDialog({
return await openFileDialog({
filters: [{ name: "Fastfiles", filter: "*.ff" }],
});
}
@@ -53,7 +54,7 @@ const availableZones = computed<SelectableZone[]>(() => {
function onUnloadClicked() {
if (!selectedZone.value) return;
webwindowedBinds.unloadZone(selectedZone.value).catch((e: string) => {
unloadZone(selectedZone.value).catch((e: string) => {
console.error("Failed to unload zone:", e);
});
}
+1 -1
View File
@@ -3,7 +3,7 @@ import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueDevTools from "vite-plugin-vue-devtools";
import PluginCppHeader from "@laupetin/vite-plugin-cpp-header";
import PluginCppHeader from "@webwindowed/vite-plugin-cpp-header";
// https://vite.dev/config/
export default defineConfig({