From 7974fbcbaaa55529bde03d23652b63d1988ac2f0 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 28 Mar 2021 17:11:00 +0300 Subject: [PATCH 1/4] Add gamepad enabling/disabling --- src/controllers/user/controls/index.html | 24 ++++++++++++++++++++ src/controllers/user/controls/index.js | 28 ++++++++++++++++++++++++ src/controllers/user/menu/index.html | 9 ++++++++ src/controllers/user/menu/index.js | 3 +++ src/scripts/keyboardNavigation.js | 3 ++- src/scripts/routes.js | 7 ++++++ src/scripts/settings/appSettings.js | 13 +++++++++++ src/strings/en-us.json | 5 ++++- 8 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/controllers/user/controls/index.html create mode 100644 src/controllers/user/controls/index.js diff --git a/src/controllers/user/controls/index.html b/src/controllers/user/controls/index.html new file mode 100644 index 000000000..8c54db4bd --- /dev/null +++ b/src/controllers/user/controls/index.html @@ -0,0 +1,24 @@ +
+
+
+
+

+ ${Controls} +

+ +
+ +
${EnableGamepadHelp}
+
${LabelPleaseRestart}
+
+
+ + +
+
+
diff --git a/src/controllers/user/controls/index.js b/src/controllers/user/controls/index.js new file mode 100644 index 000000000..d53cd0773 --- /dev/null +++ b/src/controllers/user/controls/index.js @@ -0,0 +1,28 @@ +import { Events } from 'jellyfin-apiclient'; +import toast from '../../../components/toast/toast'; +import globalize from '../../../scripts/globalize'; +import appSettings from '../../../scripts/settings/appSettings'; + +export default function (view, params) { + function submit(e) { + appSettings.enableGamepad(view.querySelector('.chkEnableGamepad').checked); + + toast(globalize.translate('SettingsSaved')); + + Events.trigger(view, 'saved'); + + if (e) e.preventDefault(); + + return false; + } + + view.addEventListener('viewshow', function () { + view.querySelector('.chkEnableGamepad').checked = appSettings.enableGamepad(); + view.querySelector('form').addEventListener('submit', submit); + view.querySelector('.btnSave').classList.remove('hide'); + + import('../../../components/autoFocuser').then(({default: autoFocuser}) => { + autoFocuser.autoFocus(view); + }); + }); +} diff --git a/src/controllers/user/menu/index.html b/src/controllers/user/menu/index.html index 7af9be478..2fa5ffe86 100644 --- a/src/controllers/user/menu/index.html +++ b/src/controllers/user/menu/index.html @@ -66,6 +66,15 @@ + + +
+ +
+
${Controls}
+
+
+

${HeaderAdmin}

diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index 1872b9f01..215573f51 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -28,6 +28,7 @@ export default function (view, params) { page.querySelector('.lnkPlaybackPreferences').setAttribute('href', '#!/mypreferencesplayback.html?userId=' + userId); page.querySelector('.lnkSubtitlePreferences').setAttribute('href', '#!/mypreferencessubtitles.html?userId=' + userId); page.querySelector('.lnkQuickConnectPreferences').setAttribute('href', '#!/mypreferencesquickconnect.html'); + page.querySelector('.lnkControlsPreferences').setAttribute('href', '#!/mypreferencescontrols.html?userId=' + userId); const supportsClientSettings = appHost.supports('clientsettings'); page.querySelector('.clientSettings').classList.toggle('hide', !supportsClientSettings); @@ -35,6 +36,8 @@ export default function (view, params) { const supportsMultiServer = appHost.supports('multiserver'); page.querySelector('.selectServer').classList.toggle('hide', !supportsMultiServer); + page.querySelector('.lnkControlsPreferences').classList.toggle('hide', layoutManager.mobile); + ApiClient.getQuickConnect('Status') .then(status => { if (status !== 'Unavailable') { diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index ff011f387..f175bc252 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -5,6 +5,7 @@ import inputManager from './inputManager'; import layoutManager from '../components/layoutManager'; +import appSettings from './settings/appSettings'; /** * Key name mapping. @@ -160,7 +161,7 @@ function attachGamepadScript() { } // No need to check for gamepads manually at load time, the eventhandler will be fired for that -if (navigator.getGamepads) { /* eslint-disable-line compat/compat */ +if (navigator.getGamepads && appSettings.enableGamepad()) { /* eslint-disable-line compat/compat */ window.addEventListener('gamepadconnected', attachGamepadScript); } diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 388c2a83e..41497be0f 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -84,6 +84,13 @@ import { appRouter } from '../components/appRouter'; controller: 'user/profile/index' }); + defineRoute({ + alias: '/mypreferencescontrols.html', + path: 'user/controls/index.html', + autoFocus: false, + controller: 'user/controls/index' + }); + defineRoute({ alias: '/mypreferencesdisplay.html', path: 'user/display/index.html', diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index 784df48fe..7b59c35f3 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -18,6 +18,19 @@ class AppSettings { return this.get('enableAutoLogin') !== 'false'; } + /** + * Get or set 'Enable Gamepad' state. + * @param {boolean|undefined} val - Flag to enable 'Enable Gamepad' or undefined. + * @return {boolean} 'Enable Gamepad' state. + */ + enableGamepad(val) { + if (val !== undefined) { + return this.set('enableGamepad', val.toString()); + } + + return this.get('enableGamepad') === 'true'; + } + enableSystemExternalPlayers(val) { if (val !== undefined) { this.set('enableSystemExternalPlayers', val.toString()); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 0915ec57a..30eecc707 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1507,5 +1507,8 @@ "MessagePlaybackError": "There was an error playing this file on your Google Cast receiver.", "EnableEnhancedNvdecDecoder": "Enable enhanced NVDEC decoder", "EnableVppTonemapping": "Enable VPP Tone mapping", - "AllowVppTonemappingHelp": "Full hardware based tone mapping without using OpenCL filter. Currently works only when transcoding videos with embedded HDR10 metadata." + "AllowVppTonemappingHelp": "Full hardware based tone mapping without using OpenCL filter. Currently works only when transcoding videos with embedded HDR10 metadata.", + "Controls": "Controls", + "LabelEnableGamepad": "Enable Gamepad", + "EnableGamepadHelp": "Listen for input from any connected controllers." } From f956731477612e65da8d7cbc4550e0b382959c83 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 28 Mar 2021 18:04:11 +0300 Subject: [PATCH 2/4] Hide controls for admin --- src/controllers/user/menu/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index 215573f51..bace4fd08 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -59,6 +59,7 @@ export default function (view, params) { if (params.userId && params.userId !== Dashboard.getCurrentUserId) { page.querySelector('.userSection').classList.add('hide'); page.querySelector('.adminSection').classList.add('hide'); + page.querySelector('.lnkControlsPreferences').classList.add('hide'); } import('../../../components/autoFocuser').then(({default: autoFocuser}) => { From c6757b2e1fecb765a96fb77c0af0b2dee6f50326 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> Date: Tue, 15 Jun 2021 21:50:20 +0300 Subject: [PATCH 3/4] Prettify the code Co-authored-by: Bill Thornton --- src/controllers/user/controls/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/user/controls/index.js b/src/controllers/user/controls/index.js index d53cd0773..8cf59d075 100644 --- a/src/controllers/user/controls/index.js +++ b/src/controllers/user/controls/index.js @@ -11,7 +11,7 @@ export default function (view, params) { Events.trigger(view, 'saved'); - if (e) e.preventDefault(); + e?.preventDefault(); return false; } From eb9c7b08b931d951e1e737cfaa021ad0487009ea Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 15 Jun 2021 22:01:00 +0300 Subject: [PATCH 4/4] Remove unused argument --- src/controllers/user/controls/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/user/controls/index.js b/src/controllers/user/controls/index.js index 8cf59d075..dadb35ea7 100644 --- a/src/controllers/user/controls/index.js +++ b/src/controllers/user/controls/index.js @@ -3,7 +3,7 @@ import toast from '../../../components/toast/toast'; import globalize from '../../../scripts/globalize'; import appSettings from '../../../scripts/settings/appSettings'; -export default function (view, params) { +export default function (view) { function submit(e) { appSettings.enableGamepad(view.querySelector('.chkEnableGamepad').checked);