status-desktop/ui/app/AppLayouts/Profile/views/DevicesView.qml

248 lines
8.0 KiB
QML
Raw Normal View History

2020-07-03 16:54:27 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import QtGraphicalEffects 1.13
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import utils 1.0
import shared.panels 1.0
import shared.controls 1.0
2020-07-03 16:54:27 +00:00
import "../stores"
2020-07-03 16:54:27 +00:00
Item {
id: root
2020-07-03 19:46:06 +00:00
property DevicesStore devicesStore
2020-07-03 19:46:06 +00:00
property bool isSyncing: false
2020-07-03 16:54:27 +00:00
width: 200
height: 200
Layout.fillHeight: true
Layout.fillWidth: true
clip: true
2020-07-03 16:54:27 +00:00
Item {
id: firstTimeSetup
anchors.left: parent.left
2020-07-03 19:46:06 +00:00
anchors.leftMargin: Style.current.padding
anchors.top: parent.top
anchors.topMargin: 24
anchors.right: parent.right
2020-07-03 19:46:06 +00:00
anchors.rightMargin: Style.current.padding
visible: !root.devicesStore.isDeviceSetup
height: visible ? childrenRect.height : 0
2020-07-03 16:54:27 +00:00
StatusBaseText {
2020-07-03 16:54:27 +00:00
id: deviceNameLbl
//% "Please set a name for your device."
text: qsTrId("pairing-please-set-a-name")
2020-07-03 16:54:27 +00:00
font.pixelSize: 14
color: Theme.palette.directColor1
2020-07-03 16:54:27 +00:00
}
Input {
id: deviceNameTxt
//% "Specify a name"
placeholderText: qsTrId("specify-name")
2020-07-03 16:54:27 +00:00
anchors.top: deviceNameLbl.bottom
2020-07-03 19:46:06 +00:00
anchors.topMargin: Style.current.padding
2020-07-03 16:54:27 +00:00
}
// TODO: replace with StatusQ component
StatusButton {
2020-07-03 16:54:27 +00:00
anchors.top: deviceNameTxt.bottom
anchors.topMargin: 10
anchors.right: deviceNameTxt.right
//% "Continue"
text: qsTrId("continue")
enabled: deviceNameTxt.text !== ""
onClicked : root.devicesStore.setName(deviceNameTxt.text.trim())
2020-07-03 16:54:27 +00:00
}
}
2020-07-03 19:46:06 +00:00
Item {
2020-07-04 00:42:44 +00:00
id: advertiseDeviceItem
anchors.left: parent.left
2020-07-03 19:46:06 +00:00
anchors.leftMargin: Style.current.padding
anchors.top: firstTimeSetup.visible ? firstTimeSetup.bottom : parent.top
2020-07-03 19:46:06 +00:00
anchors.topMargin: Style.current.padding
anchors.right: parent.right
2020-07-03 19:46:06 +00:00
anchors.rightMargin: Style.current.padding
visible: root.devicesStore.isDeviceSetup
height: visible ? childrenRect.height : 0
2020-07-03 19:46:06 +00:00
Rectangle {
id: advertiseDevice
height: childrenRect.height
width: 500
anchors.left: parent.left
anchors.right: parent.right
2020-07-14 22:57:49 +00:00
color: Style.current.transparent
2020-07-03 19:46:06 +00:00
SVGImage {
id: advertiseImg
height: 32
width: 32
anchors.left: parent.left
fillMode: Image.PreserveAspectFit
source: Style.svg("messageActive")
ColorOverlay {
anchors.fill: parent
source: parent
color: Style.current.blue
}
2020-07-03 19:46:06 +00:00
}
StatusBaseText {
2020-07-03 19:46:06 +00:00
id: advertiseDeviceTitle
//% "Advertise device"
text: qsTrId("pair-this-device")
2020-07-03 19:46:06 +00:00
font.pixelSize: 18
font.weight: Font.Bold
color: Theme.palette.primaryColor1
2020-07-03 19:46:06 +00:00
anchors.left: advertiseImg.right
anchors.leftMargin: Style.current.padding
}
StatusBaseText {
2020-07-03 19:46:06 +00:00
id: advertiseDeviceDesk
//% "Pair your devices to sync contacts and chats between them"
text: qsTrId("pair-this-device-description")
2020-07-03 19:46:06 +00:00
font.pixelSize: 14
anchors.top: advertiseDeviceTitle.bottom
anchors.topMargin: 6
anchors.left: advertiseImg.right
anchors.leftMargin: Style.current.padding
color: Theme.palette.directColor1
2020-07-03 19:46:06 +00:00
}
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: root.devicesStore.advertise()
2020-07-03 19:46:06 +00:00
}
}
StatusBaseText {
2020-07-03 19:46:06 +00:00
anchors.top: advertiseDevice.bottom
anchors.topMargin: Style.current.padding
//% "Learn more"
text: qsTrId("learn-more")
2020-07-03 19:46:06 +00:00
font.pixelSize: 16
color: Theme.palette.primaryColor1
2020-07-03 19:46:06 +00:00
anchors.left: parent.left
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: Global.openLink("https://status.im/user_guides/pairing_devices.html")
2020-07-03 19:46:06 +00:00
}
}
}
2020-07-04 00:42:44 +00:00
Item {
id: deviceListItem
anchors.left: root.left
2020-07-04 00:42:44 +00:00
anchors.leftMargin: Style.current.padding
anchors.top: advertiseDeviceItem.visible ? advertiseDeviceItem.bottom : parent.top
2020-07-04 00:42:44 +00:00
anchors.topMargin: Style.current.padding * 2
anchors.bottom: syncAllBtn.top
anchors.bottomMargin: Style.current.padding
anchors.right: root.right
2020-07-04 00:42:44 +00:00
anchors.rightMargin: Style.current.padding
visible: root.devicesStore.isDeviceSetup
2020-07-04 00:42:44 +00:00
StatusBaseText {
2020-07-04 00:42:44 +00:00
id: deviceListLbl
2020-07-16 15:20:29 +00:00
//% "Paired devices"
text: qsTrId("paired-devices")
2020-07-04 00:42:44 +00:00
font.pixelSize: 16
font.weight: Font.Bold
color: Theme.palette.directColor1
2020-07-04 00:42:44 +00:00
}
ListView {
id: listView
anchors.bottom: parent.bottom
anchors.top: deviceListLbl.bottom
anchors.topMargin: Style.current.padding
spacing: 5
anchors.right: parent.right
anchors.left: parent.left
// TODO: replace with StatusQ component
2020-07-04 00:42:44 +00:00
delegate: Item {
height: childrenRect.height
SVGImage {
id: enabledIcon
source: Style.svg(devicePairedSwitch.checked ? "messageActive" : "message")
2020-07-04 00:42:44 +00:00
height: 24
width: 24
ColorOverlay {
anchors.fill: parent
source: parent
color: Style.current.blue
}
2020-07-04 00:42:44 +00:00
}
StatusBaseText {
2020-07-04 00:42:44 +00:00
id: deviceItemLbl
text: {
let deviceId = model.installationId.split("-")[0].substr(0, 5)
2020-07-16 15:20:29 +00:00
//% "No info"
2021-02-18 16:36:05 +00:00
let labelText = `${model.name || qsTrId("pairing-no-info")} ` +
//% "you"
`(${model.isCurrentDevice ? qsTrId("you") + ", ": ""}${deviceId})`;
2020-07-04 00:42:44 +00:00
return labelText;
}
elide: Text.ElideRight
font.pixelSize: 14
anchors.left: enabledIcon.right
anchors.leftMargin: Style.current.padding
color: Theme.palette.directColor1
2020-07-04 00:42:44 +00:00
}
2020-09-17 16:42:59 +00:00
StatusSwitch {
2020-07-04 00:42:44 +00:00
id: devicePairedSwitch
visible: !model.isCurrentDevice
checked: model.enabled
2020-07-04 00:42:44 +00:00
anchors.left: deviceItemLbl.right
anchors.leftMargin: Style.current.padding
anchors.top: deviceItemLbl.top
onClicked: root.devicesStore.enableDevice(model.installationId, devicePairedSwitch)
2020-07-04 00:42:44 +00:00
}
}
model: root.devicesStore.devicesModel
2020-07-04 00:42:44 +00:00
}
}
StatusButton {
2020-07-03 19:46:06 +00:00
id: syncAllBtn
anchors.bottom: root.bottom
2020-07-03 19:46:06 +00:00
anchors.bottomMargin: Style.current.padding
anchors.horizontalCenter: parent.horizontalCenter
text: isSyncing ?
//% "Syncing..."
qsTrId("sync-in-progress") :
//% "Sync all devices"
qsTrId("sync-all-devices")
enabled: !isSyncing
2020-07-03 16:54:27 +00:00
onClicked : {
2020-07-03 19:46:06 +00:00
isSyncing = true;
root.devicesStore.syncAll()
2020-07-03 19:46:06 +00:00
// Currently we don't know how long it takes, so we just disable for 10s, to avoid spamming
timer.setTimeout(function(){
isSyncing = false
}, 10000);
}
}
Timer {
id: timer
2020-07-03 16:54:27 +00:00
}
}