import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtQml.Models 2.15 import StatusQ.Controls 0.1 import StatusQ.Components 0.1 import StatusQ.Core 0.1 import StatusQ.Popups.Dialog 0.1 import StatusQ.Core.Theme 0.1 import StatusQ.Core.Utils 0.1 as SQUtils import utils 1.0 import AppLayouts.Profile.stores 1.0 as ProfileStores import SortFilterProxyModel 0.2 StatusDialog { id: root required property var community property ProfileStores.DevicesStore devicesStore width: 640 onAboutToShow: { devicesStore.loadDevices() } QtObject { id: d readonly property var devices: SortFilterProxyModel { sourceModel: root.devicesStore.devicesModel sorters: [ RoleSorter { roleName: "isCurrentDevice" sortOrder: Qt.DescendingOrder priority: 2 }, RoleSorter { roleName: "isMobile" priority: 1 // Higher number === higher priority } ] proxyRoles: ExpressionRole { name: "isMobile" expression: model.deviceType === "ios" || model.deviceType === "android" } } readonly property var syncedDesktopDevices: SortFilterProxyModel { sourceModel: root.devicesStore.devicesModel filters: ExpressionFilter { expression: !model.isCurrentDevice && model.enabled && (model.deviceType !== "ios" && model.deviceType !== "android") } } readonly property bool hasSyncedDesktopDevices: syncedDesktopDevices.count } header: StatusDialogHeader { headline.title: qsTr("How to move the %1 control node to another device").arg(root.community.name) actions.closeButton.onClicked: root.close() leftComponent: StatusSmartIdenticon { asset.name: root.community.image asset.isImage: !!asset.name } } contentItem: ColumnLayout { spacing: 20 Paragraph { text: d.hasSyncedDesktopDevices ? qsTr("Any of your synced desktop devices can be the control node for this Community:") : qsTr("You don’t currently have any synced desktop devices. You will need to sync another desktop device before you can move the %1 control node to it. Does the device you want to use as the control node currently have Status installed?").arg(root.community.name) } Loader { Layout.fillWidth: true Layout.fillHeight: true Layout.leftMargin: Theme.bigPadding Layout.rightMargin: Theme.bigPadding sourceComponent: d.hasSyncedDesktopDevices ? devicesInstructions : noDevicesInstructions } } footer: StatusDialogFooter { rightButtons: ObjectModel { StatusButton { text: qsTr("Close") onClicked: root.close() } } } Component { id: devicesInstructions ColumnLayout { spacing: Theme.padding Rectangle { Layout.fillWidth: true Layout.leftMargin: -40 Layout.rightMargin: -40 Layout.preferredHeight: devicesView.implicitHeight Layout.fillHeight: true color: Theme.palette.baseColor2 Rectangle { anchors.fill: parent anchors.leftMargin: -parent.Layout.leftMargin anchors.rightMargin: -parent.Layout.rightMargin anchors.topMargin: 28 anchors.bottomMargin: 28 color: Theme.palette.indirectColor4 radius: Theme.radius clip: true StatusListView { id: devicesView width: parent.width implicitHeight: contentHeight height: parent.height spacing: 0 visible: !root.devicesStore.devicesModule.devicesLoading && !root.devicesStore.devicesModule.devicesLoadingError && root.devicesStore.isDeviceSetup model: d.devices delegate: ItemDelegate { id: deviceDelegate width: ListView.view.width implicitHeight: 64 anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined horizontalPadding: Theme.padding verticalPadding: 12 text: model.name enabled: model.enabled && !model.isMobile background: null contentItem: RowLayout { spacing: Theme.padding StatusRoundIcon { Layout.alignment: Qt.AlignLeading asset.name: SQUtils.Utils.deviceIcon(model.deviceType) asset.color: model.isCurrentDevice ? Theme.palette.successColor1 : enabled ? Theme.palette.primaryColor1 : Theme.palette.baseColor1 asset.bgColor: model.isCurrentDevice ? Theme.palette.successColor3 : enabled ? Theme.palette.primaryColor3 : Theme.palette.baseColor2 } StatusBaseText { Layout.fillWidth: true color: enabled ? Theme.palette.directColor1 : Theme.palette.baseColor1 text: deviceDelegate.text } StatusBaseText { Layout.alignment: Qt.AlignTrailing visible: model.isCurrentDevice color: Theme.palette.successColor1 text: qsTr("Control node (this device)") } StatusBaseText { Layout.alignment: Qt.AlignTrailing visible: model.isMobile color: Theme.palette.baseColor1 text: qsTr("Not eligible (desktop only)") } } } } } } Instruction { text: qsTr("1. On the device you want to make the control node login using this profile").arg(Theme.palette.directColor1) } Row { Layout.fillWidth: true spacing: 4 Instruction { anchors.verticalCenter: parent.verticalCenter text: qsTr("2. Go to") } StatusRoundIcon { anchors.verticalCenter: parent.verticalCenter asset.name: "show" } Paragraph { anchors.verticalCenter: parent.verticalCenter text: qsTr("%1 Admin Overview").arg(root.community.name) } } Instruction { text: qsTr("3. Click Make this device the control node").arg(Theme.palette.directColor1) } } } Component { id: noDevicesInstructions ColumnLayout { spacing: Theme.padding StatusSwitchTabBar { id: switchBar Layout.fillWidth: true StatusSwitchTabButton { text: qsTr("Status installed on other device") } StatusSwitchTabButton { text: qsTr("Status not installed on other device") } } StackLayout { Layout.fillWidth: true Layout.fillHeight: true currentIndex: switchBar.currentIndex ColumnLayout { Instruction { text: qsTr("On this device...") } Row { Layout.fillWidth: true spacing: 4 Instruction { anchors.verticalCenter: parent.verticalCenter text: qsTr("1. Go to") } StatusRoundIcon { anchors.verticalCenter: parent.verticalCenter asset.name: "settings" } Paragraph { anchors.verticalCenter: parent.verticalCenter text: qsTr("Settings") } } Row { Layout.fillWidth: true spacing: 4 Instruction { anchors.verticalCenter: parent.verticalCenter text: qsTr("2. Go to") } StatusRoundIcon { anchors.verticalCenter: parent.verticalCenter asset.name: "rotate" } Paragraph { anchors.verticalCenter: parent.verticalCenter text: qsTr("Syncing") } } Instruction { text: qsTr("3. Click Setup Syncing and sync your other devices").arg(Theme.palette.directColor1) } Instruction { text: qsTr("4. Click How to move control node again for next instructions").arg(Theme.palette.directColor1) } } ColumnLayout { Instruction { text: qsTr("1. Install and launch Status on the device you want to use as the control node") } Instruction { text: qsTr("2. On that device, click I already use Status").arg(Theme.palette.directColor1) } Instruction { text: qsTr("3. Click Scan or enter sync code and sync your new device").arg(Theme.palette.directColor1) } Instruction { text: qsTr("4. Click How to move control node again for next instructions").arg(Theme.palette.directColor1) } } } } } component Paragraph: StatusBaseText { Layout.fillWidth: true Layout.minimumHeight: 40 font.pixelSize: Theme.primaryTextFontSize lineHeightMode: Text.FixedHeight lineHeight: 22 wrapMode: Text.Wrap verticalAlignment: Text.AlignVCenter } component Instruction: Paragraph { color: Theme.palette.baseColor1 } }