diff --git a/desktop/libs/drop-base b/desktop/libs/drop-base index 04125e89..dad3487b 160000 --- a/desktop/libs/drop-base +++ b/desktop/libs/drop-base @@ -1 +1 @@ -Subproject commit 04125e89bef517411e103cdabcfa64a1bb563423 +Subproject commit dad3487be66919348149c4392af2cc3f10f0a50b diff --git a/desktop/main/components/DefaultProtonButton.vue b/desktop/main/components/DefaultProtonButton.vue new file mode 100644 index 00000000..dda1f0f0 --- /dev/null +++ b/desktop/main/components/DefaultProtonButton.vue @@ -0,0 +1,30 @@ + + + diff --git a/desktop/main/components/GameOptions/Launch.vue b/desktop/main/components/GameOptions/Launch.vue index 054dac26..d19cb0e2 100644 --- a/desktop/main/components/GameOptions/Launch.vue +++ b/desktop/main/components/GameOptions/Launch.vue @@ -11,7 +11,7 @@ class="block w-full rounded-md bg-zinc-800 px-3 py-1.5 text-base text-zinc-100 outline-1 -outline-offset-1 outline-zinc-800 placeholder:text-zinc-400 focus:outline-2 focus:-outline-offset-2 focus:outline-blue-600 sm:text-sm/6" placeholder="{}" aria-describedby="launch-description" - v-model="model!!.launchString" + v-model="model.launchString" />

@@ -21,11 +21,203 @@ >Leaving it blank will cause the game not to start.

+ + + Proton override +
+ + {{ currentProtonPath.name }} ({{ currentProtonPath.path }}) + No override configured + + + + + +
  • + Use global default + + + +
  • +
    +

    + Auto-discovered +

    + +
  • + {{ proton.name }} ({{ proton.path }}) + + + +
  • +
    +
  • No auto-discovered layers.
  • +

    + Manually added +

    + +
  • + {{ proton.name }} ({{ proton.path }}) + + + +
  • +
    +
  • No manually added layers.
  • +
    +
    +
    +

    + Override the Proton layer used to launch this game. You can add or + remove your custom Proton layer paths in + + + Settings . +

    +
    diff --git a/desktop/main/components/GameOptionsModal.vue b/desktop/main/components/GameOptionsModal.vue index 19ff39a1..88503634 100644 --- a/desktop/main/components/GameOptionsModal.vue +++ b/desktop/main/components/GameOptionsModal.vue @@ -33,6 +33,7 @@ @@ -82,14 +83,24 @@ import Launch from "./GameOptions/Launch.vue"; import type { FrontendGameConfiguration } from "~/composables/game"; import { invoke } from "@tauri-apps/api/core"; +const appState = useAppState(); + const open = defineModel(); const props = defineProps<{ gameId: string }>(); const game = await useGame(props.gameId); const configuration: Ref = ref({ - launchString: game.version!!.launchCommandTemplate, + launchString: game.version!.userConfiguration.launchTemplate, + overrideProtonPath: game.version!.userConfiguration.overrideProtonPath, }); +const hasWindows = !!( + game.version!.setups.find((v) => v.platform === "Windows") ?? + game.version!.launches.find((v) => v.platform === "Windows") +); + +const protonEnabled = !!(appState.value!.umuState !== "NotNeeded" && hasWindows); + const tabs: Array<{ name: string; icon: Component; page: Component }> = [ { name: "Launch", @@ -108,12 +119,14 @@ const saveLoading = ref(false); const saveError = ref(); async function save() { saveLoading.value = true; + saveError.value = undefined; try { await invoke("update_game_configuration", { gameId: game.game.id, options: configuration.value, }); open.value = false; + saveError.value = undefined; } catch (e) { saveError.value = (e as unknown as string).toString(); } diff --git a/desktop/main/components/Header.vue b/desktop/main/components/Header.vue index 160b9aec..7af7cd23 100644 --- a/desktop/main/components/Header.vue +++ b/desktop/main/components/Header.vue @@ -28,6 +28,7 @@ />
      +
    1. + + + + + + + + diff --git a/desktop/main/components/HeaderQueueWidget.vue b/desktop/main/components/HeaderQueueWidget.vue index 23c5ad5a..cdcbd35d 100644 --- a/desktop/main/components/HeaderQueueWidget.vue +++ b/desktop/main/components/HeaderQueueWidget.vue @@ -18,9 +18,9 @@ const props = defineProps<{ object?: QueueState["queue"][0] }>(); ]" />
      diff --git a/desktop/main/components/HeaderWidget.vue b/desktop/main/components/HeaderWidget.vue index 31cecf61..1e25b326 100644 --- a/desktop/main/components/HeaderWidget.vue +++ b/desktop/main/components/HeaderWidget.vue @@ -1,17 +1,34 @@ \ No newline at end of file + diff --git a/desktop/main/components/LibrarySearch.vue b/desktop/main/components/LibrarySearch.vue index 20aa0556..d9b9fb3d 100644 --- a/desktop/main/components/LibrarySearch.vue +++ b/desktop/main/components/LibrarySearch.vue @@ -27,7 +27,11 @@
      - +
    @@ -171,7 +174,11 @@
    -
    +
    Version @@ -233,7 +240,8 @@ >{{ version.displayName || version.versionPath }} on {{ version.platform }} ({{ formatKilobytes( - versionOptions[installVersionIndex].size / 1024 + versionOptions[installVersionIndex].size + .installSize / 1024, ) }}B) @@ -314,8 +322,7 @@
    • - {{ formatKilobytes(content.size / 1024) }}B + {{ formatKilobytes(content.size.installSize / 1024) }}B

    @@ -566,10 +573,6 @@ const id = route.params.id.toString(); const { game: rawGame, status } = await useGame(id); const game = ref(rawGame); -const remoteUrl: string = await invoke("gen_drop_url", { - path: `/store/${game.value.id}`, -}); - const bannerUrl = await useObject(game.value.mBannerObjectId); // Get all available images @@ -577,7 +580,7 @@ const mediaUrls = await Promise.all( game.value.mImageCarouselObjectIds.map(async (v) => { const src = await useObject(v); return src; - }) + }), ); const htmlDescription = micromark(game.value.mDescription); @@ -611,7 +614,9 @@ const installVersionIndex = ref(0); const installDir = ref(0); const installDepsDisabled = ref<{ [key: string]: boolean }>({}); -const currentVersionOption = computed(() => versionOptions.value?.[installVersionIndex.value]); +const currentVersionOption = computed( + () => versionOptions.value?.[installVersionIndex.value], +); async function install() { try { if (!versionOptions.value) throw new Error("Versions have not been loaded"); @@ -661,7 +666,7 @@ async function launch() { try { const fetchedLaunchOptions = await invoke>( "get_launch_options", - { id: game.value.id } + { id: game.value.id }, ); if (fetchedLaunchOptions.length == 1) { await launchIndex(0); @@ -676,7 +681,7 @@ async function launch() { description: `Drop failed to launch "${game.value.mName}": ${e}`, buttonText: "Close", }, - (e, c) => c() + (e, c) => c(), ); console.error(e); } @@ -707,7 +712,7 @@ async function launchIndex(index: number) { description: `Drop failed to launch "${game.value.mName}": ${e}`, buttonText: "Close", }, - (e, c) => c() + (e, c) => c(), ); } } @@ -731,7 +736,7 @@ async function kill() { description: `Drop failed to stop "${game.value.mName}": ${e}`, buttonText: "Close", }, - (e, c) => c() + (e, c) => c(), ); console.error(e); } diff --git a/desktop/main/pages/settings.vue b/desktop/main/pages/settings.vue index b19b2dfc..f4db560d 100644 --- a/desktop/main/pages/settings.vue +++ b/desktop/main/pages/settings.vue @@ -9,18 +9,25 @@