moonlight-qt/app/gui/PcView.qml

213 lines
6.4 KiB
QML
Raw Normal View History

2018-07-04 23:40:21 +00:00
import QtQuick 2.9
import QtQuick.Controls 2.2
2018-07-05 01:48:09 +00:00
import QtQuick.Dialogs 1.3
import QtQuick.Layouts 1.11
2018-07-04 23:40:21 +00:00
import ComputerModel 1.0
import ComputerManager 1.0
GridView {
2018-07-06 06:12:55 +00:00
property ComputerModel computerModel : createModel()
anchors.fill: parent
anchors.leftMargin: 5
anchors.topMargin: 5
anchors.rightMargin: 5
anchors.bottomMargin: 5
cellWidth: 350; cellHeight: 350;
focus: true
Component.onCompleted: {
// Start polling when this view is shown
ComputerManager.startPolling()
}
Component.onDestruction: {
// Stop polling when this view is destroyed
ComputerManager.stopPollingAsync()
}
2018-07-06 06:12:55 +00:00
function pairingComplete(error)
{
// Close the PIN dialog
pairDialog.close()
// Start polling again
ComputerManager.startPolling()
// Display a failed dialog if we got an error
if (error !== null) {
pairingFailedDialog.text = error
pairingFailedDialog.open()
}
}
function createModel()
{
var model = Qt.createQmlObject('import ComputerModel 1.0; ComputerModel {}', parent, '')
model.initialize(ComputerManager)
2018-07-06 06:12:55 +00:00
model.pairingCompleted.connect(pairingComplete)
return model
}
model: createModel()
delegate: Item {
width: 300; height: 300;
Image {
id: pcIcon
anchors.horizontalCenter: parent.horizontalCenter;
source: {
model.addPc ? "ic_add_to_queue_white_48px.svg" : "ic_tv_white_48px.svg"
2018-07-04 23:40:21 +00:00
}
sourceSize {
width: 200
height: 200
2018-07-04 23:40:21 +00:00
}
}
Text {
id: pcNameText
text: model.name
color: "white"
width: parent.width
anchors.top: pcIcon.bottom
minimumPointSize: 12
font.pointSize: 48
horizontalAlignment: Text.AlignHCenter
fontSizeMode: Text.HorizontalFit
}
2018-07-04 23:40:21 +00:00
Text {
function getStatusText(model)
{
if (model.online) {
var text = "<font color=\"green\">Online</font>"
text += "<font color=\"white\"> - </font>"
if (model.paired) {
text += "<font color=\"skyblue\">Paired</font>"
}
else if (model.busy) {
text += "<font color=\"red\">Busy</font>"
2018-07-04 23:40:21 +00:00
}
else {
text += "<font color=\"red\">Not Paired</font>"
2018-07-04 23:40:21 +00:00
}
return text
}
else {
return "<font color=\"red\">Offline</font>";
2018-07-04 23:40:21 +00:00
}
}
2018-07-04 23:40:21 +00:00
id: pcPairedText
text: getStatusText(model)
visible: !model.addPc
2018-07-04 23:40:21 +00:00
width: parent.width
anchors.top: pcNameText.bottom
minimumPointSize: 12
font.pointSize: 36
horizontalAlignment: Text.AlignHCenter
fontSizeMode: Text.HorizontalFit
}
2018-07-04 23:40:21 +00:00
MouseArea {
anchors.fill: parent
onClicked: {
if (model.addPc) {
addPcDialog.open()
}
else if (model.online) {
if (model.paired) {
// go to game view
var component = Qt.createComponent("AppView.qml")
var appView = component.createObject(stackView)
appView.computerIndex = index
stackView.push(appView)
}
else {
if (!model.busy) {
2018-07-06 04:16:32 +00:00
var pin = ("0000" + Math.floor(Math.random() * 10000)).slice(-4)
2018-07-06 06:12:55 +00:00
// Stop polling, since pairing may make GFE unresponsive
ComputerManager.stopPollingAsync()
// Kick off pairing in the background
computerModel.pairComputer(index, pin)
// Display the pairing dialog
2018-07-06 04:16:32 +00:00
pairDialog.pin = pin
pairDialog.open()
}
else {
// cannot pair while something is streaming or attempting to pair
2018-07-06 06:12:55 +00:00
pairingFailedDialog.text = "This PC is currently busy. Make sure to quit any running games and try again."
pairingFailedDialog.open()
}
}
}
else {
// TODO: Wake on LAN and delete PC options
2018-07-05 01:48:09 +00:00
}
}
}
}
MessageDialog {
id: pairingFailedDialog
// don't allow edits to the rest of the window while open
modality:Qt.WindowModal
2018-07-06 06:12:55 +00:00
icon: StandardIcon.Critical
2018-07-06 04:16:32 +00:00
standardButtons: StandardButton.Ok
}
2018-07-05 01:48:09 +00:00
MessageDialog {
id: pairDialog
// don't allow edits to the rest of the window while open
modality:Qt.WindowModal
2018-07-06 04:16:32 +00:00
property string pin : "0000"
text:"Please enter " + pin + " on your GameStream PC. This dialog will close when pairing is completed."
standardButtons: StandardButton.Cancel
2018-07-05 01:48:09 +00:00
onRejected: {
// FIXME: We should interrupt pairing here
2018-07-05 01:48:09 +00:00
}
}
Dialog {
id: addPcDialog
property string label: "Enter the IP address of your GameStream PC"
property string hint: "192.168.1.100"
2018-07-05 01:48:09 +00:00
property alias editText : editTextItem
standardButtons: StandardButton.Ok | StandardButton.Cancel
onVisibleChanged: {
editTextItem.focus = true
editTextItem.selectAll()
}
onAccepted: {
console.log("accepted, with value: " + editText.text)
}
ColumnLayout {
Text {
id: addPcDialogLabel
text: addPcDialog.label
2018-07-05 01:48:09 +00:00
}
Rectangle {
implicitWidth: parent.parent.width
height: editTextItem.height
TextInput {
id: editTextItem
inputMethodHints: Qt.ImhPreferUppercase
text: addPcDialog.hint
2018-07-04 23:40:21 +00:00
}
}
}
}
}