From 5554f39772b16dd974c1b6f9e0aed293127e0362 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Mon, 16 Dec 2024 20:12:44 +0200 Subject: [PATCH 1/3] feat(web-ui): replace dropdown menus with checkboxes --- src_assets/common/assets/web/Checkbox.vue | 108 ++++++++++ src_assets/common/assets/web/apps.html | 76 +++---- .../assets/web/configs/tabs/AudioVideo.vue | 15 +- .../assets/web/configs/tabs/General.vue | 27 ++- .../common/assets/web/configs/tabs/Inputs.vue | 202 ++++++++---------- .../assets/web/configs/tabs/Network.vue | 15 +- .../tabs/audiovideo/AdapterNameSelector.vue | 2 +- .../tabs/audiovideo/DisplayModesSettings.vue | 11 +- .../configs/tabs/encoders/AmdAmfEncoder.vue | 47 ++-- .../tabs/encoders/IntelQuickSyncEncoder.vue | 16 +- .../tabs/encoders/NvidiaNvencEncoder.vue | 70 +++--- .../configs/tabs/encoders/VAAPIEncoder.vue | 15 +- .../tabs/encoders/VideotoolboxEncoder.vue | 15 +- .../assets/web/public/assets/locale/en.json | 5 +- 14 files changed, 351 insertions(+), 273 deletions(-) create mode 100644 src_assets/common/assets/web/Checkbox.vue diff --git a/src_assets/common/assets/web/Checkbox.vue b/src_assets/common/assets/web/Checkbox.vue new file mode 100644 index 00000000000..1a911cce062 --- /dev/null +++ b/src_assets/common/assets/web/Checkbox.vue @@ -0,0 +1,108 @@ + + + diff --git a/src_assets/common/assets/web/apps.html b/src_assets/common/assets/web/apps.html index e10ce0262fb..5a97556dc29 100644 --- a/src_assets/common/assets/web/apps.html +++ b/src_assets/common/assets/web/apps.html @@ -116,15 +116,13 @@

{{ $t('apps.applications_title') }}

{{ $t('apps.output_desc') }}
-
- - -
{{ $t('apps.global_prep_desc') }}
-
+
{{ $t('apps.cmd_prep_desc') }}
@@ -152,12 +150,12 @@

{{ $t('apps.applications_title') }}

- -
- - -
+ +
-
- - -
{{ $t('apps.run_as_desc') }}
-
+ -
- - -
{{ $t('apps.auto_detach_desc') }}
-
+ -
- - -
{{ $t('apps.wait_all_desc') }}
-
+
@@ -358,11 +360,13 @@

{{ $t('apps.env_vars_about') }}

import { createApp } from 'vue' import { initApp } from './init' import Navbar from './Navbar.vue' + import Checkbox from './Checkbox.vue' import { Dropdown } from 'bootstrap/dist/js/bootstrap' const app = createApp({ components: { - Navbar + Navbar, + Checkbox }, data() { return { @@ -415,9 +419,9 @@

{{ $t('apps.env_vars_about') }}

if (this.editForm["detached"] === undefined) this.editForm["detached"] = []; if (this.editForm["exclude-global-prep-cmd"] === undefined) - this.editForm["exclude-global-prep-cmd"] = []; + this.editForm["exclude-global-prep-cmd"] = false; if (this.editForm["elevated"] === undefined && this.platform === 'windows') { - this.editForm["elevated"] = []; + this.editForm["elevated"] = false; } if (this.editForm["auto-detach"] === undefined) { this.editForm["auto-detach"] = true; diff --git a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue index 0f18f9a14dc..450b68afeb9 100644 --- a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue +++ b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue @@ -6,6 +6,7 @@ import AdapterNameSelector from './audiovideo/AdapterNameSelector.vue' import DisplayOutputSelector from './audiovideo/DisplayOutputSelector.vue' import DisplayDeviceOptions from "./audiovideo/DisplayDeviceOptions.vue"; import DisplayModesSettings from "./audiovideo/DisplayModesSettings.vue"; +import Checkbox from "../../Checkbox.vue"; const props = defineProps([ 'platform', @@ -54,14 +55,12 @@ const config = ref(props.config)
-
- - -
{{ $t('config.install_steam_audio_drivers_desc') }}
-
+ diff --git a/src_assets/common/assets/web/configs/tabs/General.vue b/src_assets/common/assets/web/configs/tabs/General.vue index 9596e622778..90b4c3a7c9a 100644 --- a/src_assets/common/assets/web/configs/tabs/General.vue +++ b/src_assets/common/assets/web/configs/tabs/General.vue @@ -1,4 +1,5 @@ diff --git a/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue index 209df9a76fd..10a6ee8da43 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue @@ -1,5 +1,6 @@ diff --git a/src_assets/common/assets/web/configs/tabs/General.vue b/src_assets/common/assets/web/configs/tabs/General.vue index 90b4c3a7c9a..d08bec5540c 100644 --- a/src_assets/common/assets/web/configs/tabs/General.vue +++ b/src_assets/common/assets/web/configs/tabs/General.vue @@ -129,7 +129,7 @@ function removeCmd(index) { id="notify_pre_releases" locale-prefix="config" v-model="config.notify_pre_releases" - unchecked-by-def + default="false" > diff --git a/src_assets/common/assets/web/configs/tabs/Inputs.vue b/src_assets/common/assets/web/configs/tabs/Inputs.vue index 2992f149ccf..2e7a081f85a 100644 --- a/src_assets/common/assets/web/configs/tabs/Inputs.vue +++ b/src_assets/common/assets/web/configs/tabs/Inputs.vue @@ -18,7 +18,7 @@ const config = ref(props.config) id="controller" locale-prefix="config" v-model="config.controller" - checked-by-def + default="true" > @@ -64,14 +64,14 @@ const config = ref(props.config) id="motion_as_ds4" locale-prefix="config" v-model="config.motion_as_ds4" - checked-by-def + default="true" > @@ -81,7 +81,7 @@ const config = ref(props.config) id="ds4_back_as_touchpad_click" locale-prefix="config" v-model="config.ds4_back_as_touchpad_click" - checked-by-def + default="true" > @@ -105,7 +105,7 @@ const config = ref(props.config) id="keyboard" locale-prefix="config" v-model="config.keyboard" - checked-by-def + default="true" > @@ -130,7 +130,7 @@ const config = ref(props.config) id="always_send_scancodes" locale-prefix="config" v-model="config.always_send_scancodes" - checked-by-def + default="true" > @@ -139,7 +139,7 @@ const config = ref(props.config) id="key_rightalt_to_key_win" locale-prefix="config" v-model="config.key_rightalt_to_key_win" - unchecked-by-def + default="false" > @@ -148,7 +148,7 @@ const config = ref(props.config) id="mouse" locale-prefix="config" v-model="config.mouse" - checked-by-def + default="true" > @@ -157,7 +157,7 @@ const config = ref(props.config) id="high_resolution_scrolling" locale-prefix="config" v-model="config.high_resolution_scrolling" - checked-by-def + default="true" > @@ -166,7 +166,7 @@ const config = ref(props.config) id="native_pen_touch" locale-prefix="config" v-model="config.native_pen_touch" - checked-by-def + default="true" > diff --git a/src_assets/common/assets/web/configs/tabs/Network.vue b/src_assets/common/assets/web/configs/tabs/Network.vue index 2165615eff1..4fac049dbbd 100644 --- a/src_assets/common/assets/web/configs/tabs/Network.vue +++ b/src_assets/common/assets/web/configs/tabs/Network.vue @@ -20,7 +20,7 @@ const effectivePort = computed(() => +config.value?.port ?? defaultMoonlightPort id="upnp" locale-prefix="config" v-model="config.upnp" - unchecked-by-def + default="false" > diff --git a/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue index 10a6ee8da43..1da4999942c 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue @@ -54,7 +54,7 @@ const config = ref(props.config) id="amd_enforce_hrd" locale-prefix="config" v-model="config.amd_enforce_hrd" - unchecked-by-def + default="false" > @@ -89,7 +89,7 @@ const config = ref(props.config) id="amd_preanalysis" locale-prefix="config" v-model="config.amd_preanalysis" - unchecked-by-def + default="false" > @@ -97,7 +97,7 @@ const config = ref(props.config) id="amd_vbaq" locale-prefix="config" v-model="config.amd_vbaq" - checked-by-def + default="true" > diff --git a/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue index 0a41768eab2..1a13beba054 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue @@ -41,7 +41,7 @@ const config = ref(props.config) id="qsv_slow_hevc" locale-prefix="config" v-model="config.qsv_slow_hevc" - unchecked-by-def + default="false" > diff --git a/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue index 4a1311fe7ad..15ae8dc6789 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue @@ -78,7 +78,7 @@ const config = ref(props.config) id="nvenc_realtime_hags" locale-prefix="config" v-model="config.nvenc_realtime_hags" - checked-by-def + default="true" >

@@ -91,7 +91,7 @@ const config = ref(props.config) id="nvenc_latency_over_power" locale-prefix="config" v-model="config.nvenc_latency_over_power" - checked-by-def + default="true" > @@ -100,7 +100,7 @@ const config = ref(props.config) id="nvenc_opengl_vulkan_on_dxgi" locale-prefix="config" v-model="config.nvenc_opengl_vulkan_on_dxgi" - checked-by-def + default="true" > @@ -108,7 +108,7 @@ const config = ref(props.config) id="nvenc_h264_cavlc" locale-prefix="config" v-model="config.nvenc_h264_cavlc" - unchecked-by-def + default="false" > diff --git a/src_assets/common/assets/web/configs/tabs/encoders/VAAPIEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/VAAPIEncoder.vue index 9972ae55760..063bba45b50 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/VAAPIEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/VAAPIEncoder.vue @@ -17,7 +17,7 @@ const config = ref(props.config) id="vaapi_strict_rc_buffer" locale-prefix="config" v-model="config.vaapi_strict_rc_buffer" - unchecked-by-def + default="false" > diff --git a/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue index 5f4b6356ad0..084e5f1def0 100644 --- a/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue +++ b/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue @@ -35,7 +35,7 @@ const config = ref(props.config) desc="" locale-prefix="config" v-model="config.vt_realtime" - checked-by-def + default="true" > From 3de00841407197d6e128b41f3ccf85e9ed937b67 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Sat, 4 Jan 2025 19:48:09 +0200 Subject: [PATCH 3/3] I don't like vue that much anymore --- src_assets/common/assets/web/Checkbox.vue | 79 ++++++++++++++--------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/src_assets/common/assets/web/Checkbox.vue b/src_assets/common/assets/web/Checkbox.vue index b3332e5635f..b94446d30a6 100644 --- a/src_assets/common/assets/web/Checkbox.vue +++ b/src_assets/common/assets/web/Checkbox.vue @@ -23,8 +23,8 @@ const props = defineProps({ default: "missing-prefix" }, default: { - type: [Boolean, null], - default: null + type: undefined, + default: null, } }); @@ -37,48 +37,65 @@ const extendedClassStr = (() => { return values.join(" "); })(); -// Determine the true/false values for the checkbox -const checkboxValues = (() => { - const mappedValues = (() => { - // Try literal values first - let value = model.value; - if (value === true || value === false) { - return [true, false]; - } - if (value === 1 || value === 0) { - return [1, 0]; +// Map the value to boolean representation if possible, otherwise return null. +const mapToBoolRepresentation = (value) => { + // Try literal values first + if (value === true || value === false) { + return { possibleValues: [true, false], value: value }; + } + if (value === 1 || value === 0) { + return { possibleValues: [1, 0], value: value }; + } + + const stringPairs = [ + ["true", "false"], + ["1", "0"], + ["enabled", "disabled"], + ["enable", "disable"], + ["yes", "no"], + ["on", "off"] + ]; + + value = `${value}`.toLowerCase().trim(); + for (const pair of stringPairs) { + if (value === pair[0] || value === pair[1]) { + return { possibleValues: pair, value: value }; } + } - // Try mapping strings next (first in the list will be used as fallback) - const stringPairs = [ - ["true", "false"], - ["1", "0"], - ["enabled", "disabled"], - ["enable", "disable"], - ["yes", "no"], - ["on", "off"] - ]; + return null; +} - value = `${value}`.toLowerCase().trim(); - for (const pair of stringPairs) { - if (value === pair[0] || value === pair[1]) { - return pair; - } +// Determine the true/false values for the checkbox +const checkboxValues = (() => { + const mappedValues = (() => { + const boolValues = mapToBoolRepresentation(model.value); + if (boolValues !== null) { + return boolValues.possibleValues; } - // Return default if nothing matches - console.error(`Checkbox value ${model.value} (${value}) did not match any acceptable pattern!`); - return stringPairs[0]; + // Return fallback if nothing matches + console.error(`Checkbox value ${model.value} did not match any acceptable pattern!`); + return ["true", "false"]; })(); return { truthy: mappedValues[0], falsy: mappedValues[1] }; })(); +const parsedDefaultPropValue = (() => { + const boolValues = mapToBoolRepresentation(props.default); + if (boolValues !== null) { + // Convert truthy to true/false. + return boolValues.value === boolValues.possibleValues[0]; + } + + return null; +})(); const labelField = props.label ?? `${props.localePrefix}.${props.id}`; const descField = props.desc ?? `${props.localePrefix}.${props.id}_desc`; const showDesc = props.desc !== "" || Object.entries(slots).length > 0; -const showDefValue = props.default !== null; -const defValue = props.default ? "_common.enabled_def_cbox" : "_common.disabled_def_cbox"; +const showDefValue = parsedDefaultPropValue !== null; +const defValue = parsedDefaultPropValue ? "_common.enabled_def_cbox" : "_common.disabled_def_cbox";