2018-07-08 05:15:02 +00:00
import QtQuick 2.9
2018-07-08 17:19:08 +00:00
import QtQuick . Controls 2.2
2018-07-09 05:56:38 +00:00
import StreamingPreferences 1.0
2018-09-09 19:33:19 +00:00
import ComputerManager 1.0
2018-09-30 20:41:32 +00:00
import SdlGamepadKeyNavigation 1.0
2018-07-09 05:56:38 +00:00
2018-11-14 02:03:53 +00:00
Flickable {
2018-07-08 05:15:02 +00:00
id: settingsPage
objectName: "Settings"
2018-11-14 02:03:53 +00:00
anchors.fill: parent
contentWidth: settingsColumn1 . width > settingsColumn2 . width ? settingsColumn1.width : settingsColumn2 . width
contentHeight: settingsColumn1 . height > settingsColumn2 . height ? settingsColumn1.height : settingsColumn2 . height
ScrollBar.vertical: ScrollBar {
parent: settingsPage . parent
anchors {
top: settingsPage . top
left: settingsPage . right
bottom: settingsPage . bottom
leftMargin: - 10
}
}
2018-07-08 05:15:02 +00:00
2018-07-09 05:56:38 +00:00
StreamingPreferences {
id: prefs
}
2018-09-30 20:41:32 +00:00
// The StackView will trigger a visibility change when
// we're pushed onto it, causing our onVisibleChanged
// routine to run, but only if we start as invisible
visible: false
SdlGamepadKeyNavigation {
id: gamepadKeyNav
}
onVisibleChanged: {
if ( visible ) {
gamepadKeyNav . setSettingsMode ( true )
gamepadKeyNav . enable ( )
}
else {
gamepadKeyNav . disable ( )
}
}
2018-07-09 05:56:38 +00:00
Component.onDestruction: {
prefs . save ( )
}
2018-07-08 17:19:08 +00:00
Column {
2018-07-20 22:47:50 +00:00
padding: 10
id: settingsColumn1
width: settingsPage . width / 2 - padding
2018-07-08 17:19:08 +00:00
GroupBox {
2018-07-08 18:12:22 +00:00
id: basicSettingsGroupBox
2018-07-20 22:47:50 +00:00
width: ( parent . width - 2 * parent . padding )
2018-07-08 17:19:08 +00:00
padding: 12
2018-07-08 18:20:56 +00:00
title: "<font color=\"skyblue\">Basic Settings</font>"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-07-08 17:19:08 +00:00
Column {
anchors.fill: parent
spacing: 5
Label {
width: parent . width
id: resFPStitle
2018-07-28 08:22:31 +00:00
text: qsTr ( "Resolution and FPS" )
2018-07-08 17:19:08 +00:00
font.pointSize: 12
2018-11-22 10:35:25 +00:00
wrapMode: Text . Wrap
2018-07-08 17:19:08 +00:00
}
Label {
width: parent . width
id: resFPSdesc
2018-11-04 22:36:12 +00:00
text: qsTr ( "Setting values too high for your PC or network connection may cause lag, stuttering, or errors." )
2018-07-08 17:19:08 +00:00
font.pointSize: 9
wrapMode: Text . Wrap
}
2018-07-28 08:22:31 +00:00
Row {
spacing: 5
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-07-28 08:22:31 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
2018-08-05 21:55:26 +00:00
// Add native resolutions for all attached displays
2018-09-04 04:21:37 +00:00
var done = false
for ( var displayIndex = 0 ; ! done ; displayIndex ++ ) {
for ( var displayResIndex = 0 ; displayResIndex < 2 ; displayResIndex ++ ) {
var screenRect ;
2018-08-05 21:55:26 +00:00
2018-09-04 04:21:37 +00:00
// Some platforms have different desktop resolutions
// and native resolutions (like macOS with Retina displays)
if ( displayResIndex == 0 ) {
screenRect = prefs . getDesktopResolution ( displayIndex )
}
else {
screenRect = prefs . getNativeResolution ( displayIndex )
}
2018-08-05 21:55:26 +00:00
2018-09-04 04:21:37 +00:00
if ( screenRect . width === 0 ) {
// Exceeded max count of displays
done = true
2018-08-05 21:55:26 +00:00
break
}
2018-09-04 04:21:37 +00:00
var indexToAdd = 0
for ( var j = 0 ; j < resolutionComboBox . count ; j ++ ) {
var existing_width = parseInt ( resolutionListModel . get ( j ) . video_width ) ;
var existing_height = parseInt ( resolutionListModel . get ( j ) . video_height ) ;
if ( screenRect . width === existing_width && screenRect . height === existing_height ) {
// Duplicate entry, skip
indexToAdd = - 1
break
}
else if ( screenRect . width * screenRect . height > existing_width * existing_height ) {
// Candidate entrypoint after this entry
indexToAdd = j + 1
}
2018-08-05 21:55:26 +00:00
}
2018-09-04 04:21:37 +00:00
// Insert this display's resolution if it's not a duplicate
if ( indexToAdd >= 0 ) {
resolutionListModel . insert ( indexToAdd ,
{
"text" : "Native (" + screenRect . width + "x" + screenRect . height + ")" ,
"video_width" : "" + screenRect . width ,
"video_height" : "" + screenRect . height
} )
}
2018-08-05 21:55:26 +00:00
}
}
2018-07-28 08:22:31 +00:00
// load the saved width/height, and iterate through the ComboBox until a match is found
// and set it to that index.
var saved_width = prefs . width
var saved_height = prefs . height
currentIndex = 0
2018-09-08 21:33:34 +00:00
for ( var i = 0 ; i < resolutionListModel . count ; i ++ ) {
2018-07-28 08:22:31 +00:00
var el_width = parseInt ( resolutionListModel . get ( i ) . video_width ) ;
var el_height = parseInt ( resolutionListModel . get ( i ) . video_height ) ;
2018-08-05 21:55:26 +00:00
// Pick the highest value lesser or equal to the saved resolution
if ( saved_width * saved_height >= el_width * el_height ) {
2018-07-28 08:22:31 +00:00
currentIndex = i
}
}
2018-09-08 06:16:13 +00:00
// Persist the selected value
activated ( currentIndex )
2018-07-16 01:27:41 +00:00
}
2018-07-28 08:22:31 +00:00
id: resolutionComboBox
textRole: "text"
model: ListModel {
id: resolutionListModel
2018-08-05 21:55:26 +00:00
// Other elements may be added at runtime
// based on attached display resolution
2018-07-28 08:22:31 +00:00
ListElement {
text: "720p"
video_width: "1280"
video_height: "720"
}
ListElement {
text: "1080p"
video_width: "1920"
video_height: "1080"
}
ListElement {
text: "1440p"
video_width: "2560"
video_height: "1440"
}
ListElement {
text: "4K"
video_width: "3840"
video_height: "2160"
}
2018-07-16 01:27:41 +00:00
}
2018-07-28 08:22:31 +00:00
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
2018-09-08 06:16:13 +00:00
var selectedWidth = parseInt ( resolutionListModel . get ( currentIndex ) . video_width )
var selectedHeight = parseInt ( resolutionListModel . get ( currentIndex ) . video_height )
// Only modify the bitrate if the values actually changed
if ( prefs . width !== selectedWidth || prefs . height !== selectedHeight ) {
prefs . width = selectedWidth
prefs . height = selectedHeight
2018-07-28 08:22:31 +00:00
2018-09-08 06:16:13 +00:00
prefs . bitrateKbps = prefs . getDefaultBitrate ( prefs . width , prefs . height , prefs . fps ) ;
slider . value = prefs . bitrateKbps
}
2018-07-16 01:27:41 +00:00
}
2018-07-28 08:22:31 +00:00
}
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-09-08 21:33:34 +00:00
function createModel ( ) {
var fpsListModel = Qt . createQmlObject ( 'import QtQuick 2.0; ListModel {}' , parent , '' )
2018-07-28 08:22:31 +00:00
// Get the max supported FPS on this system
var max_fps = prefs . getMaximumStreamingFrameRate ( ) ;
2018-09-08 21:33:34 +00:00
// Default entries
fpsListModel . append ( { "text" : "30 FPS" , "video_fps" : "30" } )
fpsListModel . append ( { "text" : "60 FPS" , "video_fps" : "60" } )
2018-09-08 22:09:46 +00:00
// Add unsupported FPS values that come before the display max FPS
if ( prefs . unsupportedFps ) {
if ( max_fps > 90 ) {
fpsListModel . append ( { "text" : "90 FPS (Unsupported)" , "video_fps" : "90" } )
}
if ( max_fps > 120 ) {
fpsListModel . append ( { "text" : "120 FPS (Unsupported)" , "video_fps" : "120" } )
}
}
2018-07-28 08:22:31 +00:00
// Use 64 as the cutoff for adding a separate option to
// handle wonky displays that report just over 60 Hz.
if ( max_fps > 64 ) {
2018-11-21 05:47:08 +00:00
// Mark any FPS value greater than 120 as unsupported
if ( prefs . unsupportedFps && max_fps > 120 ) {
fpsListModel . append ( { "text" : max_fps + " FPS (Unsupported)" , "video_fps" : "" + max_fps } )
}
else if ( max_fps > 120 ) {
fpsListModel . append ( { "text" : "120 FPS" , "video_fps" : "120" } )
}
else {
fpsListModel . append ( { "text" : max_fps + " FPS" , "video_fps" : "" + max_fps } )
}
2018-07-28 08:22:31 +00:00
}
2018-09-08 22:09:46 +00:00
// Add unsupported FPS values that come after the display max FPS
2018-09-08 21:33:34 +00:00
if ( prefs . unsupportedFps ) {
2018-09-08 22:09:46 +00:00
if ( max_fps < 90 ) {
2018-09-08 21:33:34 +00:00
fpsListModel . append ( { "text" : "90 FPS (Unsupported)" , "video_fps" : "90" } )
}
2018-09-08 22:09:46 +00:00
if ( max_fps < 120 ) {
2018-09-08 21:33:34 +00:00
fpsListModel . append ( { "text" : "120 FPS (Unsupported)" , "video_fps" : "120" } )
}
}
return fpsListModel
}
function reinitialize ( ) {
model = createModel ( )
2018-07-28 08:22:31 +00:00
var saved_fps = prefs . fps
currentIndex = 0
2018-09-08 21:33:34 +00:00
for ( var i = 0 ; i < model . count ; i ++ ) {
var el_fps = parseInt ( model . get ( i ) . video_fps ) ;
2018-08-05 21:55:26 +00:00
// Pick the highest value lesser or equal to the saved FPS
2018-08-05 22:09:36 +00:00
if ( saved_fps >= el_fps ) {
2018-07-28 08:22:31 +00:00
currentIndex = i
}
}
2018-09-08 06:16:13 +00:00
// Persist the selected value
activated ( currentIndex )
2018-07-16 01:27:41 +00:00
}
2018-07-28 08:22:31 +00:00
2018-09-08 21:33:34 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
reinitialize ( )
}
2018-07-28 08:22:31 +00:00
id: fpsComboBox
textRole: "text"
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
2018-09-08 21:33:34 +00:00
var selectedFps = parseInt ( model . get ( currentIndex ) . video_fps )
2018-09-08 06:16:13 +00:00
// Only modify the bitrate if the values actually changed
if ( prefs . fps !== selectedFps ) {
prefs . fps = selectedFps
2018-07-28 08:22:31 +00:00
2018-09-08 06:16:13 +00:00
prefs . bitrateKbps = prefs . getDefaultBitrate ( prefs . width , prefs . height , prefs . fps ) ;
slider . value = prefs . bitrateKbps
}
2018-07-16 01:27:41 +00:00
}
}
2018-07-08 17:19:08 +00:00
}
Label {
width: parent . width
id: bitrateTitle
2018-07-09 05:56:38 +00:00
text: qsTr ( "Video bitrate: " )
2018-07-08 17:19:08 +00:00
font.pointSize: 12
wrapMode: Text . Wrap
}
Label {
width: parent . width
id: bitrateDesc
2018-12-25 19:48:34 +00:00
text: qsTr ( "Lower the bitrate on slower connections. Raise the bitrate to increase image quality." )
2018-07-08 17:19:08 +00:00
font.pointSize: 9
wrapMode: Text . Wrap
}
Slider {
id: slider
wheelEnabled: true
2018-07-09 05:56:38 +00:00
value: prefs . bitrateKbps
2018-07-18 01:52:06 +00:00
2018-07-08 17:19:08 +00:00
stepSize: 500
from : 500
2018-07-28 08:22:31 +00:00
to: 150000
2018-07-18 01:52:06 +00:00
2018-07-08 17:19:08 +00:00
snapMode: "SnapOnRelease"
width: Math . min ( bitrateDesc . implicitWidth , parent . width )
2018-07-09 05:56:38 +00:00
onValueChanged: {
bitrateTitle . text = "Video bitrate: " + ( value / 1000.0 ) + " Mbps"
prefs . bitrateKbps = value
2018-07-08 17:19:08 +00:00
}
2018-12-25 19:48:34 +00:00
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: "This slider controls video bitrate only. Audio data will add an additional 1-2 Mbps on top of this."
2018-07-08 17:19:08 +00:00
}
2018-07-08 18:12:22 +00:00
2018-09-04 02:17:34 +00:00
Label {
width: parent . width
id: windowModeTitle
text: qsTr ( "Display mode" )
font.pointSize: 12
wrapMode: Text . Wrap
}
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-09-04 02:17:34 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
var savedWm = prefs . windowMode
currentIndex = 0
for ( var i = 0 ; i < windowModeListModel . count ; i ++ ) {
var thisWm = windowModeListModel . get ( i ) . val ;
if ( savedWm === thisWm ) {
currentIndex = i
2018-09-08 06:16:13 +00:00
break
2018-09-04 02:17:34 +00:00
}
2018-08-21 05:25:19 +00:00
}
2018-09-08 06:16:13 +00:00
activated ( currentIndex )
2018-08-21 05:25:19 +00:00
}
2018-09-04 02:17:34 +00:00
id: windowModeComboBox
2018-11-04 22:36:12 +00:00
hoverEnabled: true
2018-09-04 02:17:34 +00:00
textRole: "text"
model: ListModel {
id: windowModeListModel
ListElement {
2018-09-06 00:46:29 +00:00
text: "Full-screen (Recommended)"
2018-09-04 02:17:34 +00:00
val: StreamingPreferences . WM_FULLSCREEN
}
ListElement {
text: "Borderless windowed"
val: StreamingPreferences . WM_FULLSCREEN_DESKTOP
}
ListElement {
text: "Windowed"
val: StreamingPreferences . WM_WINDOWED
2018-08-21 05:25:19 +00:00
}
2018-07-09 05:56:38 +00:00
}
2018-09-04 02:17:34 +00:00
onActivated: {
prefs . windowMode = windowModeListModel . get ( currentIndex ) . val
}
2018-11-04 22:36:12 +00:00
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: "Full-screen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc."
2018-09-04 02:17:34 +00:00
}
CheckBox {
id: vsyncCheck
2018-11-04 22:36:12 +00:00
hoverEnabled: true
2018-12-25 20:57:00 +00:00
text: "V-Sync"
2018-09-04 02:17:34 +00:00
font.pointSize: 12
checked: prefs . enableVsync
onCheckedChanged: {
prefs . enableVsync = checked
}
2018-11-04 22:36:12 +00:00
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: "Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing"
2018-07-08 18:12:22 +00:00
}
2018-12-25 20:57:00 +00:00
CheckBox {
id: framePacingCheck
hoverEnabled: true
text: "Frame pacing"
font.pointSize: 12
enabled: prefs . enableVsync
checked: prefs . enableVsync && prefs . framePacing
onCheckedChanged: {
prefs . framePacing = checked
}
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: "Frame pacing reduces micro-stutter by delaying frames that come in too early"
}
2018-07-08 18:12:22 +00:00
}
}
GroupBox {
2018-07-18 02:39:16 +00:00
2018-07-08 18:12:22 +00:00
id: audioSettingsGroupBox
2018-07-20 22:47:50 +00:00
width: ( parent . width - 2 * parent . padding )
2018-07-08 18:12:22 +00:00
padding: 12
2018-07-08 18:20:56 +00:00
title: "<font color=\"skyblue\">Audio Settings</font>"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
Column {
anchors.fill: parent
spacing: 5
2018-07-20 21:35:47 +00:00
Label {
width: parent . width
id: resAudioTitle
text: qsTr ( "Audio configuration" )
font.pointSize: 12
wrapMode: Text . Wrap
}
2018-07-18 02:39:16 +00:00
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-07-20 21:35:47 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
var saved_audio = prefs . audioConfig
currentIndex = 0
2018-09-08 06:16:13 +00:00
for ( var i = 0 ; i < audioListModel . count ; i ++ ) {
var el_audio = audioListModel . get ( i ) . val ;
if ( saved_audio === el_audio ) {
currentIndex = i
break
}
2018-07-20 21:35:47 +00:00
}
2018-09-08 06:16:13 +00:00
activated ( currentIndex )
2018-07-20 21:35:47 +00:00
}
2018-07-18 02:39:16 +00:00
2018-07-20 21:35:47 +00:00
id: audioComboBox
textRole: "text"
model: ListModel {
id: audioListModel
ListElement {
2018-07-28 10:06:11 +00:00
text: "Stereo"
2018-10-02 22:30:22 +00:00
val: StreamingPreferences . AC_STEREO
2018-07-20 21:35:47 +00:00
}
ListElement {
2018-07-28 10:06:11 +00:00
text: "5.1 surround sound"
2018-10-02 22:30:22 +00:00
val: StreamingPreferences . AC_51_SURROUND
2018-07-20 21:35:47 +00:00
}
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
prefs . audioConfig = audioListModel . get ( currentIndex ) . val
2018-07-18 02:39:16 +00:00
}
2018-07-08 18:12:22 +00:00
}
2018-07-20 21:35:47 +00:00
2018-07-08 18:12:22 +00:00
}
}
2018-11-16 00:41:02 +00:00
GroupBox {
id: uiSettingsGroupBox
width: ( parent . width - 2 * parent . padding )
padding: 12
title: "<font color=\"skyblue\">UI Settings</font>"
font.pointSize: 12
Column {
anchors.fill: parent
spacing: 5
CheckBox {
2018-11-29 05:46:14 +00:00
id: startMaximizedCheck
text: "Maximize Moonlight window on startup"
2018-11-16 00:41:02 +00:00
font.pointSize: 12
2018-11-29 05:46:14 +00:00
checked: ! prefs . startWindowed
2018-11-16 00:41:02 +00:00
onCheckedChanged: {
2018-11-29 05:46:14 +00:00
prefs . startWindowed = ! checked
2018-11-16 00:41:02 +00:00
}
}
}
}
2018-07-20 22:47:50 +00:00
}
Column {
padding: 10
anchors.left: settingsColumn1 . right
id: settingsColumn2
width: settingsPage . width / 2 - padding
2018-07-08 18:12:22 +00:00
GroupBox {
id: gamepadSettingsGroupBox
2018-07-20 22:47:50 +00:00
width: ( parent . width - parent . padding )
2018-07-08 18:12:22 +00:00
padding: 12
2018-09-09 20:21:11 +00:00
title: "<font color=\"skyblue\">Input Settings</font>"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-11-16 00:41:02 +00:00
Column {
2018-07-08 18:12:22 +00:00
anchors.fill: parent
spacing: 5
CheckBox {
2018-11-30 04:10:47 +00:00
id: singleControllerCheck
text: "Force gamepad #1 always present"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-11-30 04:10:47 +00:00
checked: ! prefs . multiController
2018-07-09 05:56:38 +00:00
onCheckedChanged: {
2018-11-30 04:10:47 +00:00
prefs . multiController = ! checked
2018-07-09 05:56:38 +00:00
}
2018-11-30 04:10:47 +00:00
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: "Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.\n" +
"Only enable this option when streaming a game that doesn't support gamepads being connected after startup."
2018-07-08 18:12:22 +00:00
}
2018-09-09 20:21:11 +00:00
CheckBox {
2018-11-04 21:31:28 +00:00
id: rawInputCheck
hoverEnabled: true
2018-11-22 10:35:25 +00:00
text: "Raw mouse input"
2018-09-09 20:21:11 +00:00
font.pointSize: 12
2018-11-04 21:31:28 +00:00
checked: ! prefs . mouseAcceleration
2018-09-09 20:21:11 +00:00
onCheckedChanged: {
2018-11-04 21:31:28 +00:00
prefs . mouseAcceleration = ! checked
2018-09-09 20:21:11 +00:00
}
2018-11-04 21:31:28 +00:00
ToolTip.delay: 1000
ToolTip.timeout: 3000
ToolTip.visible: hovered
ToolTip.text: "When checked, mouse input is not accelerated or scaled by the OS before passing to Moonlight"
2018-09-09 20:21:11 +00:00
}
2018-07-08 18:12:22 +00:00
}
}
GroupBox {
id: hostSettingsGroupBox
2018-07-20 22:47:50 +00:00
width: ( parent . width - parent . padding )
2018-07-08 18:12:22 +00:00
padding: 12
2018-07-08 18:20:56 +00:00
title: "<font color=\"skyblue\">Host Settings</font>"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-11-16 00:41:02 +00:00
Column {
2018-07-08 18:12:22 +00:00
anchors.fill: parent
spacing: 5
CheckBox {
id: optimizeGameSettingsCheck
2018-11-22 10:35:25 +00:00
text: "Optimize game settings"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-07-09 05:56:38 +00:00
checked: prefs . gameOptimizations
onCheckedChanged: {
prefs . gameOptimizations = checked
}
2018-07-08 18:12:22 +00:00
}
CheckBox {
id: audioPcCheck
2018-11-22 10:35:25 +00:00
text: "Play audio on host PC"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
2018-07-09 05:56:38 +00:00
checked: prefs . playAudioOnHost
onCheckedChanged: {
prefs . playAudioOnHost = checked
}
2018-07-08 18:12:22 +00:00
}
}
}
GroupBox {
id: advancedSettingsGroupBox
2018-07-20 22:47:50 +00:00
width: ( parent . width - parent . padding )
2018-07-08 18:12:22 +00:00
padding: 12
2018-07-08 18:20:56 +00:00
title: "<font color=\"skyblue\">Advanced Settings</font>"
2018-07-08 18:12:22 +00:00
font.pointSize: 12
Column {
anchors.fill: parent
spacing: 5
2018-07-20 21:14:38 +00:00
Label {
width: parent . width
id: resVDSTitle
text: qsTr ( "Video decoder" )
font.pointSize: 12
wrapMode: Text . Wrap
2018-07-08 18:12:22 +00:00
}
2018-07-20 21:14:38 +00:00
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-07-20 21:14:38 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
var saved_vds = prefs . videoDecoderSelection
currentIndex = 0
2018-09-08 06:16:13 +00:00
for ( var i = 0 ; i < decoderListModel . count ; i ++ ) {
2018-07-20 21:14:38 +00:00
var el_vds = decoderListModel . get ( i ) . val ;
2018-09-08 06:16:13 +00:00
if ( saved_vds === el_vds ) {
currentIndex = i
break
}
2018-07-20 21:14:38 +00:00
}
2018-09-08 06:16:13 +00:00
activated ( currentIndex )
2018-07-20 21:14:38 +00:00
}
id: decoderComboBox
textRole: "text"
model: ListModel {
id: decoderListModel
ListElement {
2018-07-28 10:06:11 +00:00
text: "Automatic (Recommended)"
2018-07-20 21:14:38 +00:00
val: StreamingPreferences . VDS_AUTO
}
ListElement {
text: "Force software decoding"
val: StreamingPreferences . VDS_FORCE_SOFTWARE
}
ListElement {
text: "Force hardware decoding"
val: StreamingPreferences . VDS_FORCE_HARDWARE
}
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
prefs . videoDecoderSelection = decoderListModel . get ( currentIndex ) . val
}
}
2018-07-20 21:22:22 +00:00
Label {
width: parent . width
id: resVCCTitle
text: qsTr ( "Video codec" )
font.pointSize: 12
wrapMode: Text . Wrap
}
2018-10-06 19:12:05 +00:00
AutoResizingComboBox {
2018-07-20 21:22:22 +00:00
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
var saved_vcc = prefs . videoCodecConfig
currentIndex = 0
for ( var i = 0 ; i < codecListModel . count ; i ++ ) {
var el_vcc = codecListModel . get ( i ) . val ;
2018-09-08 06:16:13 +00:00
if ( saved_vcc === el_vcc ) {
currentIndex = i
break
}
2018-07-20 21:22:22 +00:00
}
2018-09-08 06:16:13 +00:00
activated ( currentIndex )
2018-07-20 21:22:22 +00:00
}
id: codecComboBox
textRole: "text"
model: ListModel {
id: codecListModel
ListElement {
2018-07-28 10:06:11 +00:00
text: "Automatic (Recommended)"
2018-07-20 21:22:22 +00:00
val: StreamingPreferences . VCC_AUTO
}
ListElement {
2018-07-28 10:06:11 +00:00
text: "Force H.264"
2018-07-20 21:22:22 +00:00
val: StreamingPreferences . VCC_FORCE_H264
}
ListElement {
text: "Force HEVC"
val: StreamingPreferences . VCC_FORCE_HEVC
}
2018-07-28 10:06:11 +00:00
// HDR seems to be broken in GFE 3.14.1, and even when that's fixed
// we'll probably need to gate this feature on OS support in our
// renderers.
/ * L i s t E l e m e n t {
2018-07-20 21:22:22 +00:00
text: "Force HEVC HDR"
val: StreamingPreferences . VCC_FORCE_HEVC_HDR
2018-07-28 10:06:11 +00:00
} * /
2018-07-20 21:22:22 +00:00
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
prefs . videoCodecConfig = codecListModel . get ( currentIndex ) . val
}
}
2018-09-08 21:33:34 +00:00
CheckBox {
id: unlockUnsupportedFps
2018-11-22 10:35:25 +00:00
text: "Unlock unsupported FPS options"
2018-09-08 21:33:34 +00:00
font.pointSize: 12
checked: prefs . unsupportedFps
onCheckedChanged: {
prefs . unsupportedFps = checked
// The selectable FPS values depend on whether
// this option is enabled or not
fpsComboBox . reinitialize ( )
}
}
2018-09-09 19:33:19 +00:00
CheckBox {
id: enableMdns
2018-11-22 10:35:25 +00:00
text: "Automatically find PCs on the local network (Recommended)"
2018-09-09 19:33:19 +00:00
font.pointSize: 12
checked: prefs . enableMdns
onCheckedChanged: {
prefs . enableMdns = checked
// We must save the updated preference to ensure
// ComputerManager can observe the change internally.
prefs . save ( )
// Restart polling so the mDNS change takes effect
if ( window . pollingActive ) {
ComputerManager . stopPollingAsync ( )
ComputerManager . startPolling ( )
}
}
}
2018-12-06 02:45:28 +00:00
CheckBox {
id: quitAppAfter
text: "Quit app after quitting session"
font.pointSize: 12
checked: prefs . quitAppAfter
onCheckedChanged: {
prefs . quitAppAfter = checked
}
}
2018-07-08 17:19:08 +00:00
}
}
}
2018-07-08 05:15:02 +00:00
}