Add Proton path setting

This commit is contained in:
Pierce Thompson
2024-03-26 20:19:50 -04:00
committed by Pierce Thompson
parent 3cfc59982b
commit 12a8a49ccb
7 changed files with 56 additions and 5 deletions
+4
View File
@@ -15,6 +15,10 @@ ipc.on("choose-folder", (args, reply) => {
reply(from(dialog.showOpenDialog({ properties: ["openDirectory"], defaultPath: args ?? "" })));
});
ipc.on<string>("choose-file", async (args, reply) => {
reply(from(dialog.showOpenDialog({ properties: ["openFile"], defaultPath: args ?? "" })));
});
ipc.on("window.progression",(args, reply, sender) => {
BrowserWindow.fromWebContents(sender)?.setProgressBar(args / 100);
reply(of(undefined));
+1
View File
@@ -4,6 +4,7 @@ import { ProviderPlatform } from "shared/models/provider-platform.enum";
const sep = process.platform === ProviderPlatform.WINDOWS ? "\\" : "/";
contextBridge.exposeInMainWorld("electron", {
platform: process.platform,
ipcRenderer: {
sendMessage(channel: string, args: unknown[]) {
ipcRenderer.send(channel, args);
@@ -8,15 +8,20 @@ type Props = {
minorTitle?: string;
description?: string;
children?: ReactNode;
os?: string;
};
export function SettingContainer({ id, className, title, minorTitle, description, children }: Props) {
export function SettingContainer({ id, className, title, minorTitle, description, children, os }: Props) {
const t = useTranslation();
if (os && os !== window.electron.platform) {
return <></>;
}
return (
<div id={id} className={className || "relative mb-5"}>
{title && <h1 className="font-bold text-2xl mb-1 tracking-wide">{t(title)}</h1>}
{minorTitle && <h2 className="font-bold mb-1 tracking-wide text-gray-600 dark:text-gray-300">{t(minorTitle)}</h2>}
{title && <h1 className="mb-1 text-2xl font-bold tracking-wide">{t(title)}</h1>}
{minorTitle && <h2 className="mb-1 font-bold tracking-wide text-gray-600 dark:text-gray-300">{t(minorTitle)}</h2>}
{description && <p className="mb-3 text-sm text-gray-600 dark:text-gray-400">{t(description)}</p>}
{children}
</div>
+27 -2
View File
@@ -42,7 +42,7 @@ import { BsDownloaderService } from "renderer/services/bs-version-download/bs-do
import { AutoUpdaterService } from "renderer/services/auto-updater.service";
import BeatWaitingImg from "../../../assets/images/apngs/beat-waiting.png";
import { logRenderError } from "renderer";
import { BSLauncherService } from "renderer/services/bs-launcher.service";
export function SettingsPage() {
@@ -51,6 +51,7 @@ export function SettingsPage() {
const ipcService = useService(IpcService);
const modalService = useService(ModalService);
const bsDownloader = useService(BsDownloaderService);
const bsLauncher = useService(BSLauncherService);
const steamDownloader = useService(SteamDownloaderService);
const progressBarService = useService(ProgressBarService);
const notificationService = useService(NotificationService);
@@ -85,6 +86,7 @@ export function SettingsPage() {
const downloadStore = useObservable(() => bsDownloader.defaultStore$);
const [installationFolder, setInstallationFolder] = useState(null);
const [protonPath, setProtonPath] = useState(bsLauncher.getProtonPath());
const [showSupporters, setShowSupporters] = useState(false);
const [mapDeepLinksEnabled, setMapDeepLinksEnabled] = useState(false);
const [playlistsDeepLinkEnabled, setPlaylistsDeepLinkEnabled] = useState(false);
@@ -156,6 +158,20 @@ export function SettingsPage() {
clearTimeout(timeoutId);
};
const setDefaultProtonPath = () => {
if (!progressBarService.require()) {
return;
}
ipcService.sendV2<{ canceled: boolean; filePaths: string[] }>("choose-file").toPromise().then(res => {
if (!res.canceled && res.filePaths?.length) {
const protonPath = res.filePaths[0];
setProtonPath(protonPath);
bsLauncher.setProtonPath(protonPath);
}
});
};
const setDefaultInstallationFolder = () => {
if (!progressBarService.require()) {
return;
@@ -282,7 +298,16 @@ export function SettingsPage() {
<span className="block text-ellipsis overflow-hidden min-w-0" title={installationFolder}>
{installationFolder}
</span>
<BsmButton onClick={setDefaultInstallationFolder} className="shrink-0 whitespace-nowrap mr-2 px-2 font-bold italic text-sm rounded-md" text="pages.settings.installation-folder.choose-folder" withBar={false} />
<BsmButton onClick={setDefaultInstallationFolder} className="shrink-1 whitespace-nowrap mr-2 px-2 font-bold italic text-sm rounded-md" text="pages.settings.installation-folder.choose-folder" withBar={false} />
</div>
</SettingContainer>
<SettingContainer os="linux" title="pages.settings.proton-path.title" description="pages.settings.proton-path.description">
<div className="relative flex items-center justify-between w-full h-8 bg-light-main-color-1 dark:bg-main-color-1 rounded-md pl-2 py-1">
<span className="block text-ellipsis overflow-hidden min-w-0 whitespace-nowrap" title={protonPath}>
{protonPath}
</span>
<BsmButton onClick={setDefaultProtonPath} className="shrink-0 whitespace-nowrap mr-2 px-2 font-bold italic text-sm rounded-md" text="pages.settings.proton-path.choose-file" withBar={false} />
</div>
</SettingContainer>
+1
View File
@@ -1,6 +1,7 @@
declare global {
interface Window {
electron: {
platform: "win32"|"linux"|"darwin",
ipcRenderer: {
sendMessage(channel: string, args: any): void;
on(channel: string, func: (...args: any) => void): (() => void) | undefined;
@@ -23,6 +23,8 @@ export class BSLauncherService {
public readonly versionRunning$: BehaviorSubject<BSVersion> = new BehaviorSubject(null);
private readonly PROTON_PATH_KEY = "protonPath";
public static getInstance(){
if(!BSLauncherService.instance){ BSLauncherService.instance = new BSLauncherService(); }
return BSLauncherService.instance;
@@ -36,6 +38,14 @@ export class BSLauncherService {
this.modals = ModalService.getInstance();
}
public setProtonPath(protonPath: string|undefined): void {
this.config.set(this.PROTON_PATH_KEY, protonPath);
}
public getProtonPath(): string|undefined {
return this.config.get<string>(this.PROTON_PATH_KEY);
}
private notRewindBackupOculus(): boolean{
return this.config.get<boolean>("not-rewind-backup-oculus");
}