diff --git a/neutralino.config.json b/neutralino.config.json
index d630b22..5284b6d 100644
--- a/neutralino.config.json
+++ b/neutralino.config.json
@@ -22,7 +22,7 @@
"fullScreen": false,
"alwaysOnTop": false,
"icon": "/public/icons/64x64.png",
- "enableInspector": true,
+ "enableInspector": false,
"borderless": false,
"maximize": false,
"hidden": true,
diff --git a/public/locales/en-us.yaml b/public/locales/en-us.yaml
index ccfccbc..3716653 100644
--- a/public/locales/en-us.yaml
+++ b/public/locales/en-us.yaml
@@ -5,10 +5,49 @@ settings:
items:
# Language selection
lang:
+ # Launcher language
launcher:
title: Launcher
items:
en-us: English (US)
ru-ru: Русский
-
- dxvks: DXVK
\ No newline at end of file
+
+ # Game voice pack language
+ voice:
+ title: Voice pack
+ items:
+ en-us: English (US)
+ ja-jp: Japanese
+ ko-kr: Korean
+ zn-cn: Chinese
+
+ # Launcher theme
+ theme:
+ title: Theme
+ items:
+ system: System
+ light: Light
+ dark: Dark
+
+ discord: Discord RPC
+ dxvks: DXVK
+
+ # Enhancements
+ enhancements:
+ title: Enhancements
+ items:
+ # HUD
+ hud:
+ title: HUD
+ items:
+ none: None
+ dxvk: DXVK
+ mangohud: MangoHUD
+
+ gamemode: GameMode
+ fps_unlocker: Unlock FPS
+ purge_dxvk_logs: Auto-delete DXVK logs
+
+ # DXVKs
+ dxvks:
+ title: DXVK
\ No newline at end of file
diff --git a/public/locales/ru-ru.yaml b/public/locales/ru-ru.yaml
index 1618147..4937145 100644
--- a/public/locales/ru-ru.yaml
+++ b/public/locales/ru-ru.yaml
@@ -5,10 +5,50 @@ settings:
items:
# Выбор языка
lang:
+ # Лаунчер
launcher:
title: Лаунчер
items:
en-us: English (US)
ru-ru: Русский
-
- dxvks: DXVK
\ No newline at end of file
+
+ # Язык озвучки в игре
+ voice:
+ title: Язык озвучки
+ items:
+ en-us: Английский (США)
+ ja-jp: Японский
+ ko-kr: Корейский
+ zn-cn: Китайский
+
+ # Тема лаунчера
+ theme:
+ title: Тема
+ items:
+ system: Системная
+ light: Светлая
+ dark: Тёмная
+
+ discord: Discord RPC
+ dxvks: DXVK
+
+ # Улучшения
+ enhancements:
+ title: Улучшения
+ items:
+ # HUD
+ hud:
+ title: HUD
+ items:
+ none: Отключён
+ dxvk: DXVK
+ mangohud: MangoHUD
+
+ # TODO: add hints to the components so I could describe what these options means
+ gamemode: GameMode
+ fps_unlocker: Разблокировать FPS
+ purge_dxvk_logs: Автоматически удалять логи DXVK
+
+ # DXVKs
+ dxvks:
+ title: DXVK
\ No newline at end of file
diff --git a/src/components/DXVKSelectionList.svelte b/src/components/DXVKSelectionList.svelte
index 557e168..736053c 100644
--- a/src/components/DXVKSelectionList.svelte
+++ b/src/components/DXVKSelectionList.svelte
@@ -7,19 +7,27 @@
DXVK as TDXVK
} from '../ts/types/DXVK';
- let dxvks: TDXVK[] = [];
+ let dxvks: TDXVK[] = [], selectedVersion;
DXVK.list().then((list) => dxvks = list);
+ DXVK.current.then((current) => selectedVersion = current?.version);
import Delete from '../assets/images/delete.png';
import Download from '../assets/images/download.png';
-
-
{ $_('settings.general.items.dxvks') }
+ const dxvkInstalled = (dxvk: TDXVK): boolean => {
+ const filtered = dxvks.filter((item) => item.version === dxvk.version);
+
+ if (filtered.length === 1)
+ return filtered[0].installed;
+
+ else return false;
+ };
+
{#each dxvks as dxvk}
-
+
{ dxvk.version }
diff --git a/src/components/SelectionBox.svelte b/src/components/SelectionBox.svelte
index 75fd701..1dc37be 100644
--- a/src/components/SelectionBox.svelte
+++ b/src/components/SelectionBox.svelte
@@ -5,7 +5,7 @@
export let prop: string = '';
export let lang: string = '';
- export let items: ArrayLike
= [];
+ export let items = {};
export let valueChanged: (value: string) => void = () => {};
import Arrow from '../assets/svgs/arrow.svg';
@@ -44,7 +44,7 @@
data-value={itemLang}
on:click={selectionChanged}
-
+
on:click={() => {
selectedValue = itemLang;
diff --git a/src/defaultSettings.ts b/src/defaultSettings.ts
new file mode 100644
index 0000000..adc3836
--- /dev/null
+++ b/src/defaultSettings.ts
@@ -0,0 +1,98 @@
+import Configs from './ts/Configs';
+import constants from './ts/Constants';
+import promisify from './ts/core/promisify';
+
+promisify(async () => {
+ Configs.defaults({
+ lang: {
+ launcher: 'en-us',
+ voice: 'en-us'
+ },
+
+ /**
+ * Path to wine prefix
+ *
+ * @default constants.paths.prefix.default
+ */
+ prefix: await constants.paths.prefix.default,
+
+ /**
+ * Runner name to use, or null if runner is not specified
+ *
+ * @default null
+ */
+ runner: null,
+
+ /**
+ * DXVK name to use, or null if DXVK is not specified
+ *
+ * @default null
+ */
+ dxvk: null,
+
+ /**
+ * Launcher theme
+ *
+ * Can be "system", "light" and "dark"
+ *
+ * @defaul "system"
+ */
+ theme: 'system',
+
+ /**
+ * HUD
+ *
+ * "none" if don't use. Otherwise should be "dxvk" or "mangohud"
+ *
+ * @default "none"
+ */
+ hud: 'none',
+
+ /**
+ * vkBasalt preset to use
+ *
+ * null if don't use. Otherwise should be some folder name from the "shaders" folder
+ *
+ * @default null
+ */
+ shaders: null,
+
+ /**
+ * Discord RPC integration
+ */
+ discord: {
+ /**
+ * If it is enabled
+ *
+ * @default false
+ */
+ enabled: false,
+
+ // todo
+ texts: {
+ idk: true
+ }
+ },
+
+ /**
+ * Do the launcher should use GameMode
+ *
+ * @default false
+ */
+ gamemode: false,
+
+ /**
+ * Do the launcher should use FPS unlocker
+ *
+ * @default false
+ */
+ fps_unlocker: false,
+
+ /**
+ * Do the launcher should automatically delete DXVK log files
+ *
+ * @default true
+ */
+ purge_dxvk_logs: true
+ });
+});
diff --git a/src/pages/index.ts b/src/pages/index.ts
index 8995a8c..93c7e2c 100644
--- a/src/pages/index.ts
+++ b/src/pages/index.ts
@@ -1,43 +1,10 @@
-import Configs from '../ts/Configs';
-import constants from '../ts/Constants';
-
import '../i18n';
import App from '../index.svelte';
declare const Neutralino;
Neutralino.init();
-
-Neutralino.events.on('ready', async () => {
- Configs.defaults({
- lang: {
- launcher: 'en-us',
- voice: 'en-us'
- },
-
- // Path to wine prefix
- prefix: await constants.paths.prefix.default,
-
- // runner name to use, or null if runner is not specified
- runner: null,
-
- /**
- * HUD
- *
- * null if don't use
- * otherwise should be "dxvk" or "mangohud"
- */
- hud: null,
-
- /**
- * vkBasalt preset to use
- *
- * null if don't use
- * otherwise should be some folder name from the "shaders" folder
- */
- shaders: null
- });
-});
+Neutralino.events.on('ready', () => import('../defaultSettings'));
const app = new App({
target: document.getElementById('app')!
diff --git a/src/settings.svelte b/src/settings.svelte
index 49a6456..9723dc5 100644
--- a/src/settings.svelte
+++ b/src/settings.svelte
@@ -6,15 +6,84 @@
import SelectionBox from './components/SelectionBox.svelte';
import DXVKSelectionList from './components/DXVKSelectionList.svelte';
- let availableLocales: ArrayLike = [];
+ import Window from './ts/neutralino/Window';
+
+ // TODO: somehow simplify all this variables definitions
+
+ /**
+ * Launcher language
+ */
+ let launcherLocales = {};
$locales.forEach((locale) => {
- availableLocales[locale] = `settings.general.items.lang.launcher.items.${locale}`;
+ launcherLocales[locale] = `settings.general.items.lang.launcher.items.${locale}`;
});
- availableLocales = availableLocales;
+ launcherLocales = launcherLocales;
- import Window from './ts/neutralino/Window';
+ /**
+ * Game voice packs languages
+ */
+
+ const voiceLocales = {
+ 'en-us': 'settings.general.items.lang.voice.items.en-us',
+ 'ja-jp': 'settings.general.items.lang.voice.items.ja-jp',
+ 'ko-kr': 'settings.general.items.lang.voice.items.ko-kr',
+ 'zn-cn': 'settings.general.items.lang.voice.items.zn-cn'
+ };
+
+ /**
+ * Themes
+ */
+
+ const themes = {
+ 'system': 'settings.general.items.theme.items.system',
+ 'light': 'settings.general.items.theme.items.light',
+ 'dark': 'settings.general.items.theme.items.dark'
+ };
+
+ /**
+ * HUD options
+ */
+
+ const huds = {
+ 'none': 'settings.enhancements.items.hud.items.none',
+ 'dxvk': 'settings.enhancements.items.hud.items.dxvk',
+ 'mangohud': 'settings.enhancements.items.hud.items.mangohud'
+ };
+
+ const menuItems = [
+ 'general',
+ 'enhancements',
+ 'dxvks'
+ ];
+
+ /**
+ * Menu items changing
+ */
+ let selectedItem: string = 'general';
+
+ const changeItem = (event: MouseEvent) => {
+ const item = event.target! as HTMLElement;
+ const settings = document.getElementsByClassName('settings')[0]!;
+
+ settings.scrollTop = document.getElementById(item.getAttribute('data-anchor') as string)!.offsetTop - 16;
+
+ selectedItem = item.getAttribute('data-anchor')!;
+ };
+
+ const updateItems = () => {
+ const settings = document.getElementsByClassName('settings')[0]! as HTMLElement;
+ const settingsItems = >settings.children;
+
+ let visibleElement;
+
+ for (let i = 0; i < settingsItems.length; ++i)
+ if (settingsItems[i].offsetTop - settings.scrollTop < 180)
+ visibleElement = settingsItems[i];
+
+ selectedItem = visibleElement.getAttribute('id');
+ };
// Do some stuff when all the content will be loaded
onMount(() => {
@@ -24,20 +93,54 @@
{#if typeof $locale === 'string'}
-
+
{$_('settings.general.title')}
$locale = value}
/>
+
+
+
+
+
+
+
+
+
{$_('settings.enhancements.title')}
+
+
+
+
+
+
+
+
+
+
{$_('settings.dxvks.title')}
+
diff --git a/src/ts/core/DXVK.ts b/src/ts/core/DXVK.ts
index b4c4e10..199e860 100644
--- a/src/ts/core/DXVK.ts
+++ b/src/ts/core/DXVK.ts
@@ -1,6 +1,7 @@
import type { DXVK as TDXVK } from '../types/DXVK';
import constants from '../Constants';
+import Configs from '../Configs';
import AbstractInstaller from './AbstractInstaller';
declare const Neutralino;
@@ -15,6 +16,21 @@ class Stream extends AbstractInstaller
export default class DXVK
{
+ /**
+ * Get the current using DXVK according to the config file
+ */
+ public static get current(): Promise
+ {
+ return new Promise((resolve) => {
+ Configs.get('dxvk').then((dxvk) => {
+ if (typeof dxvk === 'string')
+ DXVK.get(dxvk).then((dxvk) => resolve(dxvk));
+
+ else resolve(null);
+ });
+ });
+ }
+
/**
* Get DXVKs list
*/
@@ -49,7 +65,7 @@ export default class DXVK
/**
* Get DXVK with specified version
*/
- public static get(version: string): Promise
+ public static get(version: string): Promise
{
return new Promise((resolve) => {
this.list().then((list) => {