Files
VRCX/html/src/mixins/tabs/settings.pug
2024-11-20 16:17:26 +13:00

637 lines
58 KiB
Plaintext

mixin simpleSettingsCategory(headerTrKey)
div.options-container
span.header {{ $t('#{headerTrKey}') }}
if block
block
else
p No Content
mixin simpleSwitch(nameTrKey, model, onChange="")
div.options-container-item
//- I fought with getting the right syntax for a translation key, as an argument, in an interpolated block for like 20mins before I realized the answer was staring me in the face in the documentation I passed over like 5 times. Feelsbadman.
//- I didn't even know what pug was before working on this; speedrunning learning pug templating.
span.name {{ $t('#{nameTrKey}') }}
//- I've also never worked with vue/element and have no idea what I'm doing. pog, as the kids say
el-switch(v-model=model @change=onChange)
mixin simpleTwoLabelSwitch(nameTrKey, model, onChange="")
div.options-container-item
span.name {{ $t('#{nameTrKey}') }}
el-switch(v-model=model @change=onChange)
mixin simpleRadioGroup(nameTrKey, model, options, onChange="")
div.options-container-item
span.name {{ $t('#{nameTrKey}') }}
br
el-radio-group(v-model=model @change=onChange size="mini")
each option in options
el-radio-button(label=option.label) {{ $t('#{option.translationKey}') }}
mixin simpleRadioGroupWithTooltip(nameTrKey, tooltipContent, model, options, onChange="")
div.options-container-item
span.name {{ $t('#{nameTrKey}') }}
el-tooltip(placement="top" style="margin-left:5px" :content=tooltipContent)
i.el-icon-warning
br
el-radio-group(v-model=model @change=onChange size="mini")
each option in options
el-radio-button(label=option.label) {{ $t('#{option.translationKey}') }}
mixin settingsTab()
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'settings'")
div.options-container(style="margin-top:0;padding:5px")
span.header {{ $t("view.settings.header") }}
el-tabs(type="card" style="height: calc(100% - 51px")
el-tab-pane(:label="$t('view.settings.category.general')")
//- General | General
div.options-container(style="margin-top:0")
span.header {{ $t("view.settings.general.general.header") }}
.x-friend-list(style="margin-top:10px")
//- General | General | Version
.x-friend-item(style="cursor:default")
.detail
span.name {{ $t("view.settings.general.general.version") }}
span.extra(v-text="appVersion")
//- General | General | Latest App Version
.x-friend-item(@click="checkForVRCXUpdate")
.detail
span.name {{ $t("view.settings.general.general.latest_app_version") }}
span.extra(v-if="latestAppVersion" v-text="latestAppVersion")
span.extra(v-else) {{ $t("view.settings.general.general.latest_app_version_refresh") }}
//- General | General | Repository URL
.x-friend-item(@click="openExternalLink('https://github.com/vrcx-team/VRCX')")
.detail
span.name {{ $t("view.settings.general.general.repository_url") }}
span.extra https://github.com/vrcx-team/VRCX
//- General | General | Support
.x-friend-item(@click="openExternalLink('https://vrcx.app/discord')")
.detail
span.name {{ $t("view.settings.general.general.support") }}
span.extra https://vrcx.app/discord
//- General | VRCX Updater
+simpleSettingsCategory("view.settings.general.vrcx_updater.header")
div.options-container-item
el-button(size="small" icon="el-icon-document" @click="showChangeLogDialog()") {{ $t("view.settings.general.vrcx_updater.change_log") }}
el-button(size="small" icon="el-icon-upload" @click="showVRCXUpdateDialog()") {{ $t("view.settings.general.vrcx_updater.change_build") }}
+simpleRadioGroup("view.settings.general.vrcx_updater.update_action", "autoUpdateVRCX", [
{ label: "Off", translationKey: "view.settings.general.vrcx_updater.auto_update_off" },
{ label: "Notify", translationKey: "view.settings.general.vrcx_updater.auto_update_notify" },
{ label: "Auto Download", translationKey: "view.settings.general.vrcx_updater.auto_update_download" },
], "saveAutoUpdateVRCX")
//- General | Application
+simpleSettingsCategory("view.settings.general.application.header")
+simpleSwitch("view.settings.general.application.startup", "isStartAtWindowsStartup", "saveVRCXWindowOption")
+simpleSwitch("view.settings.general.application.minimized", "isStartAsMinimizedState", "saveVRCXWindowOption")
+simpleSwitch("view.settings.general.application.tray", "isCloseToTray", "saveVRCXWindowOption")
div.options-container-item
span.name {{ $t('view.settings.general.application.disable_gpu_acceleration') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.general.application.disable_gpu_acceleration_tooltip')")
i.el-icon-warning
el-switch(v-model="disableGpuAcceleration" @change="saveVRCXWindowOption")
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.general.application.disable_vr_overlay_gpu_acceleration') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.general.application.disable_gpu_acceleration_tooltip')")
i.el-icon-warning
el-switch(v-model="disableVrOverlayGpuAcceleration" @change="saveVRCXWindowOption")
div.options-container-item
el-button(size="small" icon="el-icon-connection" @click="promptProxySettings()") {{ $t("view.settings.general.application.proxy") }}
//- General | Favorite
+simpleSettingsCategory("view.settings.general.favorites.header")
br
el-select(v-model="localFavoriteFriendsGroups" multiple clearable :placeholder="$t('view.settings.general.favorites.group_placeholder')" @change="updateLocalFavoriteFriends")
el-option-group(:label="$t('view.settings.general.favorites.group_placeholder')")
el-option.x-friend-item(v-for="group in API.favoriteFriendGroups" :key="group.key" :label="group.displayName ? group.displayName : group.name" :value="group.key")
.detail
span.name(v-text="group.displayName ? group.displayName : group.name")
//- General | Game Log
div.options-container
span.header {{ $t('view.settings.general.logging.header') }}
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.advanced.advanced.cache_debug.udon_exception_logging') }}
el-switch(v-model="udonExceptionLogging" @change="saveOpenVROption")
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.general.logging.resource_load') }}
el-switch(v-model="logResourceLoad" @change="saveLoggingOptions")
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.general.logging.empty_avatar') }}
el-switch(v-model="logEmptyAvatars" @change="saveLoggingOptions")
//- General | Automation
+simpleSettingsCategory("view.settings.general.automation.header")
+simpleRadioGroupWithTooltip("view.settings.general.automation.auto_state_change", "$t('view.settings.general.automation.auto_state_change_tooltip')", "autoStateChange", [
{ label: "Off", translationKey: "view.settings.general.automation.auto_state_change_off" },
{ label: "Active or Ask Me", translationKey: "view.settings.general.automation.auto_state_change_active_or_ask_me" },
{ label: "Active or Busy", translationKey: "view.settings.general.automation.auto_state_change_active_or_busy" },
{ label: "Join Me or Ask Me", translationKey: "view.settings.general.automation.auto_state_change_join_me_or_ask_me" },
{ label: "Join Me or Busy", translationKey: "view.settings.general.automation.auto_state_change_join_me_or_busy" },
{ label: "Ask Me or Busy", translationKey: "view.settings.general.automation.auto_state_change_ask_me_or_busy" },
], "saveAutomationOptions")
+simpleRadioGroupWithTooltip("view.settings.general.automation.auto_invite_request_accept", "$t('view.settings.general.automation.auto_invite_request_accept_tooltip')", "autoAcceptInviteRequests", [
{ label: "Off", translationKey: "view.settings.general.automation.auto_invite_request_accept_off" },
{ label: "All Favorites", translationKey: "view.settings.general.automation.auto_invite_request_accept_favs" },
{ label: "Selected Favorites", translationKey: "view.settings.general.automation.auto_invite_request_accept_selected_favs" },
], "saveAutomationOptions")
//- General | Contributors
div.options-container
span.header {{ $t("view.settings.general.contributors.header" )}}
div.options-container-item
img(src="https://contrib.rocks/image?repo=vrcx-team/VRCX", alt="Contributors" @click="openExternalLink('https://github.com/vrcx-team/VRCX/graphs/contributors')" style="cursor: pointer")
//- General | Legal Notice
div.options-container(style="margin-top:45px;border-top:1px solid #eee;padding-top:30px")
span.header {{ $t("view.settings.general.legal_notice.header" )}}
div.options-container-item
p © 2019-2024 #[a.x-link(@click="openExternalLink('https://github.com/pypy-vrc')") pypy] & #[a.x-link(@click="openExternalLink('https://github.com/Natsumi-sama')") Natsumi]
p {{ $t("view.settings.general.legal_notice.info" )}}
p {{ $t("view.settings.general.legal_notice.disclaimer1" )}}
p {{ $t("view.settings.general.legal_notice.disclaimer2" )}}
div.options-container-item
el-button(@click="ossDialog = true" size="small") {{ $t("view.settings.general.legal_notice.open_source_software_notice" )}}
//- Appearance Tab
el-tab-pane(:label="$t('view.settings.category.appearance')")
//- Appearance | Appearance
div.options-container(style="margin-top:0")
span.header {{ $t("view.settings.appearance.appearance.header") }}
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.language') }}
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span {{ $i18n.messages[appLanguage]?.language }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
el-dropdown-item(v-for="(obj, language) in $i18n.messages" v-text="obj.language" @click.native="changeAppLanguage(language)")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.theme_mode') }}
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span {{ $t(`view.settings.appearance.appearance.theme_mode_${themeMode}`) }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_system')" @click.native="saveThemeMode('system')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_light')" @click.native="saveThemeMode('light')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_dark')" @click.native="saveThemeMode('dark')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_darkvanillaold')" @click.native="saveThemeMode('darkvanillaold')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_darkvanilla')" @click.native="saveThemeMode('darkvanilla')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_pink')" @click.native="saveThemeMode('pink')")
el-dropdown-item(v-text="$t('view.settings.appearance.appearance.theme_mode_material3')" @click.native="saveThemeMode('material3')")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.zoom') }}
el-input-number(size="small" v-model="zoomLevel" @change="setZoomLevel" :precision="0" style="width:128px")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.vrcplus_profile_icons') }}
el-switch(v-model="displayVRCPlusIconsAsAvatar" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.nicknames') }}
el-switch(v-model="hideNicknames" :active-value="false" :inactive-value="true" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.tooltips') }}
el-switch(v-model="hideTooltips" :active-value="false" :inactive-value="true" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.sort_favorite_by') }}
el-switch(v-model="sortFavorites" :inactive-text="$t('view.settings.appearance.appearance.sort_favorite_by_name')" :active-text="$t('view.settings.appearance.appearance.sort_favorite_by_date')" @change="saveSortFavoritesOption")
div.options-container-item
span.name {{ $t('view.settings.appearance.appearance.sort_instance_users_by') }}
el-switch(v-model="instanceUsersSortAlphabetical" :inactive-text="$t('view.settings.appearance.appearance.sort_instance_users_by_time')" :active-text="$t('view.settings.appearance.appearance.sort_instance_users_by_alphabet')" @change="saveOpenVROption")
div.options-container-item
el-button(size="small" icon="el-icon-notebook-1" @click="promptMaxTableSizeDialog") {{ $t('view.settings.appearance.appearance.table_max_size') }}
div.options-container-item
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span {{ $t('view.settings.appearance.appearance.page_size') }} {{ tablePageSize }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
el-dropdown-item(v-for="(number) in [10, 15, 25, 50, 100]" v-text="number" @click.native="setTablePageSize(number)")
//- Appearance | Time/Date
div.options-container
span.header {{ $t('view.settings.appearance.timedate.header') }}
div.options-container-item
span.name {{ $t('view.settings.appearance.timedate.time_format') }}
el-switch(v-model="dtHour12" @change="setDatetimeFormat" :inactive-text="$t('view.settings.appearance.timedate.time_format_24')" :active-text="$t('view.settings.appearance.timedate.time_format_12')")
div.options-container-item
span.name {{ $t('view.settings.appearance.timedate.force_iso_date_format') }}
el-switch(v-model="dtIsoFormat" @change="setDatetimeFormat")
//- Appearance | Side Panel
div.options-container
span.header {{ $t('view.settings.appearance.side_panel.header') }}
br
div.options-container-item
span.name {{ $t('view.settings.appearance.side_panel.sorting.header') }}
el-select(v-model="sidebarSortMethod1" style="width:170px" :placeholder="$t('view.settings.appearance.side_panel.sorting.placeholder')" @change="saveSidebarSortOrder")
el-option-group(:label="$t('view.settings.appearance.side_panel.sorting.dropdown_header')")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.alphabetical')" value="Sort Alphabetically")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.status')" value="Sort by Status")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.private_to_bottom')" value="Sort Private to Bottom")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.last_active')" value="Sort by Last Active")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.time_in_instance')" value="Sort by Time in Instance")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.location')" value="Sort by Location")
i.el-icon-arrow-right(style="margin:16px 5px")
el-select(v-model="sidebarSortMethod2" :disabled="!sidebarSortMethod1" style="width:170px" clearable :placeholder="$t('view.settings.appearance.side_panel.sorting.placeholder')" @change="saveSidebarSortOrder")
el-option-group(:label="$t('view.settings.appearance.side_panel.sorting.dropdown_header')")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.alphabetical')" value="Sort Alphabetically")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.status')" value="Sort by Status")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.private_to_bottom')" value="Sort Private to Bottom")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.last_active')" value="Sort by Last Active")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.time_in_instance')" value="Sort by Time in Instance")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.location')" value="Sort by Location")
i.el-icon-arrow-right(style="margin:16px 5px")
el-select(v-model="sidebarSortMethod3" :disabled="!sidebarSortMethod2" style="width:170px" clearable :placeholder="$t('view.settings.appearance.side_panel.sorting.placeholder')" @change="saveSidebarSortOrder")
el-option-group(:label="$t('view.settings.appearance.side_panel.sorting.dropdown_header')")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.alphabetical')" value="Sort Alphabetically")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.status')" value="Sort by Status")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.private_to_bottom')" value="Sort Private to Bottom")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.last_active')" value="Sort by Last Active")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.time_in_instance')" value="Sort by Time in Instance")
el-option.x-friend-item(:label="$t('view.settings.appearance.side_panel.sorting.location')" value="Sort by Location")
div.options-container-item
span.name(style="vertical-align:top;padding-top:10px") {{ $t('view.settings.appearance.side_panel.width') }}
el-slider(v-model="asideWidth" @input="setAsideWidth" :show-tooltip="false" :marks="{300: ''}" :min="200" :max="500" style="display:inline-block;width:300px")
//- Appearance | User Dialog
div.options-container
span.header {{ $t('view.settings.appearance.user_dialog.header') }}
div.options-container-item
span.name {{ $t('view.settings.appearance.user_dialog.vrchat_notes') }}
el-switch(v-model="hideUserNotes" :active-value="false" :inactive-value="true" @change="saveUserDialogOption")
div.options-container-item
span.name {{ $t('view.settings.appearance.user_dialog.vrcx_memos') }}
el-switch(v-model="hideUserMemos" :active-value="false" :inactive-value="true" @change="saveUserDialogOption")
div.options-container-item
span.name {{ $t('view.settings.appearance.user_dialog.export_vrcx_memos_into_vrchat_notes') }}
br
el-button(size="small" icon="el-icon-document-copy" @click="showNoteExportDialog") {{ $t('view.settings.appearance.user_dialog.export_notes') }}
//- Appearance | Friend Log
div.options-container
span.header {{ $t('view.settings.appearance.friend_log.header') }}
div.options-container-item
span.name {{ $t('view.settings.appearance.friend_log.hide_unfriends') }}
el-switch(v-model="hideUnfriends" @change="saveFriendLogOptions")
//- Appearance | User Colors
div.options-container
span.header {{ $t('view.settings.appearance.user_colors.header') }}
div.options-container-item
span.name {{ $t('view.settings.appearance.user_colors.random_colors_from_user_id') }}
el-switch(v-model="randomUserColours" @change="updatetrustColor")
div.options-container-item
div
el-color-picker(v-model="trustColor.untrusted" @change="updatetrustColor" size="mini" :predefine="['#CCCCCC']")
span.color-picker(slot="trigger" class="x-tag-untrusted") Visitor
div
el-color-picker(v-model="trustColor.basic" @change="updatetrustColor" size="mini" :predefine="['#1778ff']")
span.color-picker(slot="trigger" class="x-tag-basic") New User
div
el-color-picker(v-model="trustColor.known" @change="updatetrustColor" size="mini" :predefine="['#2bcf5c']")
span.color-picker(slot="trigger" class="x-tag-known") User
div
el-color-picker(v-model="trustColor.trusted" @change="updatetrustColor" size="mini" :predefine="['#ff7b42']")
span.color-picker(slot="trigger" class="x-tag-trusted") Known User
div
el-color-picker(v-model="trustColor.veteran" @change="updatetrustColor" size="mini" :predefine="['#b18fff', '#8143e6', '#ff69b4', '#b52626', '#ffd000', '#abcdef']")
span.color-picker(slot="trigger" class="x-tag-veteran") Trusted User
div
el-color-picker(v-model="trustColor.vip" @change="updatetrustColor" size="mini" :predefine="['#ff2626']")
span.color-picker(slot="trigger" class="x-tag-vip") VRChat Team
div
el-color-picker(v-model="trustColor.troll" @change="updatetrustColor" size="mini" :predefine="['#782f2f']")
span.color-picker(slot="trigger" class="x-tag-troll") Nuisance
//- Notifications Tab
el-tab-pane(:label="$t('view.settings.category.notifications')")
//- Notifications | Notifications
div.options-container(style="margin-top:0")
span.header {{ $t('view.settings.notifications.notifications.header') }}
div.options-container-item
el-button(size="small" icon="el-icon-chat-square" @click="showNotyFeedFiltersDialog") {{ $t('view.settings.notifications.notifications.notification_filter') }}
//- Notifications | Notifications | SteamVR Notifications
div.options-container
span.sub-header {{ $t('view.settings.notifications.notifications.steamvr_notifications.header') }}
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.steamvr_overlay') }}
el-switch(v-model="openVR" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.overlay_notifications') }}
el-switch(v-model="overlayNotifications" @change="saveOpenVROption" :disabled="!openVR")
div.options-container-item
el-button(size="small" icon="el-icon-rank" @click="showNotificationPositionDialog" :disabled="!overlayNotifications || !openVR") {{ $t('view.settings.notifications.notifications.steamvr_notifications.notification_position') }}
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.xsoverlay_notifications') }}
el-switch(v-model="xsNotifications" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.ovrtoolkit_hud_notifications') }}
el-switch(v-model="ovrtHudNotifications" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.ovrtoolkit_wrist_notifications') }}
el-switch(v-model="ovrtWristNotifications" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.steamvr_notifications.user_images') }}
el-switch(v-model="imageNotifications" @change="saveOpenVROption")
div.options-container-item
el-button(size="small" icon="el-icon-time" @click="promptNotificationTimeout" :disabled="(!overlayNotifications || !openVR) && !xsNotifications") {{ $t('view.settings.notifications.notifications.steamvr_notifications.notification_timeout') }}
//- Notifications | Notifications | Desktop Notifications
div.options-container
span.sub-header {{ $t('view.settings.notifications.notifications.desktop_notifications.header') }}
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display') }}
br
el-radio-group(v-model="desktopToast" @change="saveOpenVROption" size="mini")
el-radio-button(label="Never") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_never') }}
el-radio-button(label="Desktop Mode") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_desktop') }}
el-radio-button(label="Inside VR") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_inside_vr') }}
el-radio-button(label="Outside VR") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_outside_vr') }}
el-radio-button(label="Game Closed") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_game_closed') }}
el-radio-button(label="Game Running") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_game_running') }}
el-radio-button(label="Always") {{ $t('view.settings.notifications.notifications.desktop_notifications.when_to_display_always') }}
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.notifications.notifications.desktop_notifications.desktop_notification_while_afk') }}
el-switch(v-model="afkDesktopToast" @change="saveOpenVROption")
//- Notifications | Notifications | Text-to-Speech Options
div.options-container
span.sub-header {{ $t('view.settings.notifications.notifications.text_to_speech.header') }}
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play') }}
br
el-radio-group(v-model="notificationTTS" @change="saveNotificationTTS" size="mini")
el-radio-button(label="Never") {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play_never') }}
el-radio-button(label="Inside VR") {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play_inside_vr') }}
el-radio-button(label="Game Closed") {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play_game_closed') }}
el-radio-button(label="Game Running") {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play_game_running') }}
el-radio-button(label="Always") {{ $t('view.settings.notifications.notifications.text_to_speech.when_to_play_always') }}
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.text_to_speech.tts_voice') }}
el-dropdown(@command="(voice) => changeTTSVoice(voice)" trigger="click" size="small")
el-button(size="mini" :disabled="notificationTTS === 'Never'")
span {{ getTTSVoiceName() }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
el-dropdown-item(v-if="voice" v-for="(voice, index) in TTSvoices" :key="index" v-text="voice.name" :command="index")
div.options-container-item
span.name {{ $t('view.settings.notifications.notifications.text_to_speech.use_memo_nicknames') }}
el-switch(v-model="notificationTTSNickName" @change="saveOpenVROption" :disabled="notificationTTS === 'Never'")
//- Wrist Overlay Tab
el-tab-pane(:label="$t('view.settings.category.wrist_overlay')")
//- Wrist Overlay | SteamVR Wrist Overlay
div.options-container(style="margin-top:0")
span.header {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.header') }}
div.options-container-item
el-button(size="small" icon="el-icon-notebook-2" @click="showWristFeedFiltersDialog" :disabled="!openVR || !overlayWrist") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.wrist_feed_filters') }}
div.options-container-item
span {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.description') }}
br
br
span {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.grip') }}
br
span {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.menu') }}
br
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.steamvr_overlay') }}
el-switch(v-model="openVR" @change="saveOpenVROption")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.wrist_feed_overlay') }}
el-switch(v-model="overlayWrist" @change="saveOpenVROption" :disabled="!openVR")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.hide_private_worlds') }}
el-switch(v-model="hidePrivateFromFeed" @change="saveOpenVROption")
div.options-container-item(style="min-width:118px")
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.start_overlay_with') }}
el-switch(v-model="openVRAlways" @change="saveOpenVROption" inactive-text="VRChat" active-text="SteamVR" :disabled="!openVR")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.overlay_button') }}
el-switch(v-model="overlaybutton" @change="saveOpenVROption" :inactive-text="$t('view.settings.wrist_overlay.steamvr_wrist_overlay.overlay_button_grip')" :active-text="$t('view.settings.wrist_overlay.steamvr_wrist_overlay.overlay_button_menu')" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.display_overlay_on') }}
el-radio-group(v-model="overlayHand" @change="saveOpenVROption" size="mini")
el-radio-button(label="1") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.display_overlay_on_left') }}
el-radio-button(label="2") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.display_overlay_on_right') }}
el-radio-button(label="0") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.display_overlay_on_both') }}
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.grey_background') }}
el-switch(v-model="vrBackgroundEnabled" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.minimal_feed_icons') }}
el-switch(v-model="minimalFeed" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.show_vr_devices') }}
el-switch(v-model="hideDevicesFromFeed" @change="saveOpenVROption" :active-value="false" :inactive-value="true" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.show_cpu_usage') }}
el-switch(v-model="vrOverlayCpuUsage" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.show_game_uptime') }}
el-switch(v-model="hideUptimeFromFeed" @change="saveOpenVROption" :active-value="false" :inactive-value="true" :disabled="!openVR || !overlayWrist")
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.show_pc_uptime') }}
el-switch(v-model="pcUptimeOnFeed" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist")
//- Discord Presence Tab
el-tab-pane(:label="$t('view.settings.category.discord_presence')")
div.options-container(style="margin-top:0")
span.header {{ $t('view.settings.discord_presence.discord_presence.header') }}
div.options-container-item
span {{ $t('view.settings.discord_presence.discord_presence.description') }}
div.options-container-item
span.name {{ $t('view.settings.discord_presence.discord_presence.enable') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.discord_presence.discord_presence.enable_tooltip')")
i.el-icon-warning(style="cursor:pointer" @click="showVRChatConfig")
el-switch(v-model="discordActive" @change="saveDiscordOption")
div.options-container-item
span.name {{ $t('view.settings.discord_presence.discord_presence.instance_type_player_count') }}
el-switch(v-model="discordInstance" @change="saveDiscordOption" :disabled="!discordActive")
div.options-container-item
span.name {{ $t('view.settings.discord_presence.discord_presence.show_details_in_private') }}
el-switch(v-model="discordHideInvite" @change="saveDiscordOption" :active-value="false" :inactive-value="true" :disabled="!discordActive")
div.options-container-item
span.name {{ $t('view.settings.discord_presence.discord_presence.join_button') }}
el-switch(v-model="discordJoinButton" @change="saveDiscordOption" :disabled="!discordActive")
div.options-container-item
span.name {{ $t('view.settings.discord_presence.discord_presence.show_images') }}
el-switch(v-model="discordHideImage" @change="saveDiscordOption" :active-value="false" :inactive-value="true" :disabled="!discordActive")
//- "Advanced" Tab
el-tab-pane(:label="$t('view.settings.category.advanced')")
//- Advanced | Advanced
div.options-container(style="margin-top:0")
span.header {{ $t('view.settings.advanced.advanced.header') }}
div.options-container-item(style="margin-top:15px")
el-button-group
el-button(size="small" icon="el-icon-s-operation" @click="showVRChatConfig()") VRChat config.json
el-button(size="small" icon="el-icon-s-operation" @click="showLaunchOptions()") {{ $t('view.settings.advanced.advanced.launch_options') }}
el-button(size="small" icon="el-icon-picture" @click="showScreenshotMetadataDialog()") {{ $t('view.settings.advanced.advanced.screenshot_metadata') }}
el-button(size="small" icon="el-icon-goods" @click="showRegistryBackupDialog()") {{ $t('view.settings.advanced.advanced.vrc_registry_backup') }}
//- Advanced | Common Folders
div.options-container
span.header {{ $t('view.settings.advanced.advanced.common_folders') }}
div.options-container-item(style="margin-top:15px")
el-button-group
el-button(size="small" icon="el-icon-folder" @click="openVrcxAppDataFolder()") AppData (VRCX)
el-button(size="small" icon="el-icon-folder" @click="openVrcAppDataFolder()") AppData
el-button(size="small" icon="el-icon-folder" @click="openVrcPhotosFolder()") Photos
el-button(size="small" icon="el-icon-folder" @click="openVrcScreenshotsFolder()") Screenshots
el-button(size="small" icon="el-icon-folder" @click="openCrashVrcCrashDumps()") Crash Dumps
//- Advanced | Primary Password
div.options-container
//- Advanced | Primary Password Header
span.sub-header {{ $t('view.settings.advanced.advanced.primary_password.header') }}
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.primary_password.description') }}
el-switch(v-model="enablePrimaryPassword" @change="enablePrimaryPasswordChange" :disabled="!enablePrimaryPassword")
span.sub-header {{ $t('view.settings.advanced.advanced.relaunch_vrchat.header') }}
//- Advanced | Relaunch VRChat After Crash
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.relaunch_vrchat.description') }}
el-switch(v-model="relaunchVRChatAfterCrash" @change="saveOpenVROption")
//- Advanced | VRChat Quit Fix
span.sub-header {{ $t('view.settings.advanced.advanced.vrchat_quit_fix.header') }}
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.vrchat_quit_fix.description') }}
el-switch(v-model="vrcQuitFix" @change="saveOpenVROption")
//- Advanced | Auto Cache Management
span.sub-header {{ $t('view.settings.advanced.advanced.auto_cache_management.header') }}
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.auto_cache_management.description') }}
el-switch(v-model="autoSweepVRChatCache" @change="saveOpenVROption")
//- Advanced | Disable local world database
span.sub-header {{ $t('view.settings.advanced.advanced.local_world_persistence.header') }}
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.local_world_persistence.description') }}
el-switch(v-model="disableWorldDatabase" :active-value="false" :inactive-value="true" @change="saveVRCXWindowOption")
span.sub-header {{ $t('view.settings.advanced.advanced.save_instance_prints_to_file.header') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.save_instance_prints_to_file.header_tooltip')")
i.el-icon-info
div.options-container-item
span.name(style="min-width:300px") {{ $t('view.settings.advanced.advanced.save_instance_prints_to_file.description') }}
el-switch(v-model="saveInstancePrints" @change="saveVRCXWindowOption")
//- Advanced | Remote Avatar Database
div.options-container
span.header {{ $t('view.settings.advanced.advanced.remote_database.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.remote_database.enable') }}
el-switch(v-model="avatarRemoteDatabase" @change="saveOpenVROption")
div.options-container-item
el-button(size="small" icon="el-icon-user-solid" @click="showAvatarProviderDialog") {{ $t('view.settings.advanced.advanced.remote_database.avatar_database_provider') }}
//- Advanced | Automatic App Launcher
+simpleSettingsCategory("view.settings.advanced.advanced.app_launcher.header")
br
el-button(size="small" icon="el-icon-folder" @click="openShortcutFolder()") {{ $t('view.settings.advanced.advanced.app_launcher.folder') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.app_launcher.folder_tooltip')")
i.el-icon-warning
+simpleSwitch("view.settings.advanced.advanced.app_launcher.enable", "enableAppLauncher", "updateAppLauncherSettings")
+simpleSwitch("view.settings.advanced.advanced.app_launcher.auto_close", "enableAppLauncherAutoClose", "updateAppLauncherSettings")
//- Advanced | Screenshot Helper
div.options-container
span.header {{ $t('view.settings.advanced.advanced.screenshot_helper.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.description') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.screenshot_helper.description_tooltip')")
i.el-icon-info
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.enable') }}
el-switch(v-model="screenshotHelper" @change="saveScreenshotHelper")
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.modify_filename') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.screenshot_helper.modify_filename_tooltip')")
i.el-icon-info
el-switch(v-model="screenshotHelperModifyFilename" @change="saveScreenshotHelper" :disabled="!screenshotHelper")
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.copy_to_clipboard') }}
el-switch(v-model="screenshotHelperCopyToClipboard" @change="saveScreenshotHelper")
//- Advanced | YouTube API
div.options-container
span.header {{ $t('view.settings.advanced.advanced.youtube_api.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.youtube_api.enable') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.youtube_api.enable_tooltip')")
i.el-icon-info
el-switch(v-model="youTubeApi" @change="changeYouTubeApi")
div.options-container-item
el-button(size="small" icon="el-icon-caret-right" @click="showYouTubeApiDialog") {{ $t('view.settings.advanced.advanced.youtube_api.youtube_api_key') }}
//- Advanced | Video Progress Pie
div.options-container
span.header {{ $t('view.settings.advanced.advanced.video_progress_pie.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.video_progress_pie.enable') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.video_progress_pie.enable_tooltip')")
i.el-icon-warning
el-switch(v-model="progressPie" @change="changeYouTubeApi" :disabled="!openVR")
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.video_progress_pie.dance_world_only') }}
el-switch(v-model="progressPieFilter" @change="changeYouTubeApi" :disabled="!openVR")
//- Advanced | Photon Logging (This section doesn't actually exist, the template is all nonsense generated by ChatGPT to throw off the trail of the androids. Spooky. Trust me, bro.)
div.options-container(v-if="photonLoggingEnabled")
span.header {{ $t('view.settings.advanced.photon.header') }}
div.options-container-item
span.sub-header {{ $t('view.settings.advanced.photon.event_hud.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.photon.event_hud.enable') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.photon.event_hud.enable_tooltip')")
i.el-icon-warning
el-switch(v-model="photonEventOverlay" @change="saveEventOverlay" :disabled="!openVR")
div.options-container-item
span.name {{ $t('view.settings.advanced.photon.event_hud.filter') }}
el-radio-group(v-model="photonEventOverlayFilter" @change="saveEventOverlay" size="mini" :disabled="!openVR || !photonEventOverlay")
el-radio-button(label="VIP") {{ $t('view.settings.advanced.photon.event_hud.filter_favorites') }}
el-radio-button(label="Friends") {{ $t('view.settings.advanced.photon.event_hud.filter_friends') }}
el-radio-button(label="Everyone") {{ $t('view.settings.advanced.photon.event_hud.filter_everyone') }}
div.options-container-item
el-button(size="small" icon="el-icon-time" @click="promptPhotonOverlayMessageTimeout" :disabled="!openVR") {{ $t('view.settings.advanced.photon.event_hud.message_timeout') }}
div.options-container-item
el-select(v-model="photonEventTableTypeOverlayFilter" @change="photonEventTableFilterChange" multiple clearable collapse-tags style="flex:1" placeholder="Filter")
el-option(v-once v-for="type in photonEventTableTypeFilterList" :key="type" :label="type" :value="type")
br
span.sub-header {{ $t('view.settings.advanced.photon.timeout_hud.header') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.photon.timeout_hud.enable') }}
el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.photon.timeout_hud.enable_tooltip')")
i.el-icon-warning
el-switch(v-model="timeoutHudOverlay" @change="saveEventOverlay" :disabled="!openVR")
div.options-container-item
span.name {{ $t('view.settings.advanced.photon.timeout_hud.filter') }}
el-radio-group(v-model="timeoutHudOverlayFilter" @change="saveEventOverlay" size="mini" :disabled="!openVR || !timeoutHudOverlay")
el-radio-button(label="VIP") {{ $t('view.settings.advanced.photon.timeout_hud.filter_favorites') }}
el-radio-button(label="Friends") {{ $t('view.settings.advanced.photon.timeout_hud.filter_friends') }}
el-radio-button(label="Everyone") {{ $t('view.settings.advanced.photon.timeout_hud.filter_everyone') }}
div.options-container-item
el-button(size="small" icon="el-icon-time" @click="promptPhotonLobbyTimeoutThreshold" :disabled="!openVR") {{ $t('view.settings.advanced.photon.timeout_hud.timeout_threshold') }}
//- Advanced | VRCX Instance Cache/Debug
div.options-container
span.header {{ $t('view.settings.advanced.advanced.cache_debug.header') }}
br
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.disable_gamelog') }}
el-switch(v-model="gameLogDisabled" @change="disableGameLogDialog")
span.name(style="margin-left:15px") {{ $t('view.settings.advanced.advanced.cache_debug.disable_gamelog_notice') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.user_cache') }} #[span(v-text="API.cachedUsers.size")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.world_cache') }} #[span(v-text="API.cachedWorlds.size")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.avatar_cache') }} #[span(v-text="API.cachedAvatars.size")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.group_cache') }} #[span(v-text="API.cachedGroups.size")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.avatar_name_cache') }} #[span(v-text="API.cachedAvatarNames.size")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.cache_debug.instance_cache') }} #[span(v-text="API.cachedInstances.size")]
div.options-container-item
el-button(size="small" icon="el-icon-delete-solid" @click="clearVRCXCache") {{ $t('view.settings.advanced.advanced.cache_debug.clear_cache') }}
el-button(size="small" icon="el-icon-time" @click="promptAutoClearVRCXCacheFrequency") {{ $t('view.settings.advanced.advanced.cache_debug.auto_clear_cache') }}
div.options-container-item
el-button(size="small" icon="el-icon-tickets" @click="showConsole") {{ $t('view.settings.advanced.advanced.cache_debug.show_console') }}
//- Advanced | VRCX Table Stats
div.options-container
span.sub-header {{ $t('view.settings.advanced.advanced.sqlite_table_size.header') }}
div.options-container-item
el-button(size="small" icon="el-icon-refresh" @click="getSqliteTableSizes") {{ $t('view.settings.advanced.advanced.sqlite_table_size.refresh') }}
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.gps') }} #[span(v-text="sqliteTableSizes.gps")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.status') }} #[span(v-text="sqliteTableSizes.status")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.bio') }} #[span(v-text="sqliteTableSizes.bio")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.avatar') }} #[span(v-text="sqliteTableSizes.avatar")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.online_offline') }} #[span(v-text="sqliteTableSizes.onlineOffline")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.friend_log_history') }} #[span(v-text="sqliteTableSizes.friendLogHistory")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.notification') }} #[span(v-text="sqliteTableSizes.notification")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.location') }} #[span(v-text="sqliteTableSizes.location")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.join_leave') }} #[span(v-text="sqliteTableSizes.joinLeave")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.portal_spawn') }} #[span(v-text="sqliteTableSizes.portalSpawn")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.video_play') }} #[span(v-text="sqliteTableSizes.videoPlay")]
div.options-container-item
span.name {{ $t('view.settings.advanced.advanced.sqlite_table_size.event') }} #[span(v-text="sqliteTableSizes.event")]