Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 83 additions & 21 deletions app/gui/PcView.qml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,11 @@ CenteredGridView {
font.bold: true
enabled: false
}
NavigableMenuItem {
text: qsTr("Wake and Open")
onTriggered: wakeAndOpen()
visible: !model.online && model.wakeable
}
NavigableMenuItem {
text: qsTr("View All Apps")
onTriggered: {
Expand Down Expand Up @@ -219,29 +224,66 @@ CenteredGridView {
}
}

onClicked: {
if (model.online) {
if (!model.serverSupported) {
errorDialog.text = qsTr("The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.").arg(model.name)
errorDialog.helpText = ""
errorDialog.open()
}
else if (model.paired) {
// go to game view
var component = Qt.createComponent("AppView.qml")
var appView = component.createObject(stackView, {"computerIndex": index, "objectName": model.name})
stackView.push(appView)
}
else {
var pin = computerModel.generatePinString()
// Set when the user chose "Wake and Open"; we open the PC
// automatically once it comes online.
property bool wakeAndOpenPending: false
property bool onlineRole: model.online

onOnlineRoleChanged: {
if (wakeAndOpenPending && onlineRole) {
wakeAndOpenPending = false
wakeOpenTimeout.stop()
wakeOpenDialog.stop()
activatePc()
}
}

// Kick off pairing in the background
computerModel.pairComputer(index, pin)
Timer {
id: wakeOpenTimeout
interval: 120000
onTriggered: {
wakeAndOpenPending = false
wakeOpenDialog.stop()
errorDialog.text = qsTr("Timed out waiting for %1 to wake up.").arg(model.name)
errorDialog.helpText = ""
errorDialog.open()
}
}

// Display the pairing dialog
pairDialog.pin = pin
pairDialog.open()
}
function wakeAndOpen() {
wakeAndOpenPending = true
wakeOpenTimeout.restart()
computerModel.wakeComputer(index)
wakeOpenDialog.start(model.name)
}

function activatePc() {
if (!model.serverSupported) {
errorDialog.text = qsTr("The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.").arg(model.name)
errorDialog.helpText = ""
errorDialog.open()
}
else if (model.paired) {
// go to game view
var component = Qt.createComponent("AppView.qml")
var appView = component.createObject(stackView, {"computerIndex": index, "objectName": model.name})
stackView.push(appView)
}
else {
var pin = computerModel.generatePinString()

// Kick off pairing in the background
computerModel.pairComputer(index, pin)

// Display the pairing dialog
pairDialog.pin = pin
pairDialog.open()
}
}

onClicked: {
if (model.online) {
activatePc()
} else if (!model.online) {
// Using open() here because it may be activated by keyboard
pcContextMenu.open()
Expand Down Expand Up @@ -288,6 +330,26 @@ CenteredGridView {
helpUrl: "https://github.com/moonlight-stream/moonlight-docs/wiki/Setup-Guide"
}

// Shows while a Wake and Open is in progress so the user knows we're just
// waiting for the PC to come online. It stays up until the PC wakes or the
// timeout fires, at which point we close it explicitly (see wakeOpenTimeout
// and onOnlineRoleChanged). NoAutoClose keeps it from dismissing on a stray
// click or Escape.
NavigableMessageDialog {
id: wakeOpenDialog
closePolicy: Popup.NoAutoClose
showSpinner: true

function start(pcName) {
text = qsTr("Waking up %1...").arg(pcName) + "\n\n" + qsTr("This may take a while.")
open()
}

function stop() {
close()
}
}

NavigableMessageDialog {
id: pairDialog
closePolicy: Popup.CloseOnEscape
Expand Down
Loading