Warning, /utilities/kirogi/src/ui/Vehicle.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * Copyright 2019 Eike Hein <hein@kde.org>
0003  *
0004  * This program is free software; you can redistribute it and/or
0005  * modify it under the terms of the GNU General Public License as
0006  * published by the Free Software Foundation; either version 2 of
0007  * the License or (at your option) version 3 or any later version
0008  * accepted by the membership of KDE e.V. (or its successor approved
0009  * by the membership of KDE e.V.), which shall act as a proxy
0010  * defined in Section 14 of version 3 of the license.
0011  *
0012  * This program is distributed in the hope that it will be useful,
0013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0015  * GNU General Public License for more details.
0016  *
0017  * You should have received a copy of the GNU General Public License
0018  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0019  */
0020 
0021 import QtQuick 2.12
0022 import QtQuick.Layouts 1.12
0023 import QtQuick.Controls 2.12 as QQC2
0024 
0025 import org.kde.kirigami 2.6 as Kirigami
0026 
0027 import org.kde.kirogi 0.1 as Kirogi
0028 
0029 Kirigami.Page {
0030     id: page
0031 
0032     leftPadding: 0
0033     rightPadding: 0
0034     topPadding: 0
0035     bottomPadding: 0
0036 
0037     Image {
0038         anchors.left: parent.left
0039         anchors.leftMargin: (((LayoutMirroring.enabled ? (parent.width - flightChecklist.x - flightChecklist.width) : flightChecklist.x) / 2) - (width / 2))
0040         anchors.verticalCenter: parent.verticalCenter
0041 
0042         width: height
0043         height: Math.min(parent.height, LayoutMirroring.enabled ? (parent.width - flightChecklist.x - flightChecklist.width) : flightChecklist.x) * 0.94
0044 
0045         fillMode: Image.PreserveAspectFit
0046         smooth: true
0047 
0048         source: "goose.webp"
0049 
0050         asynchronous: true
0051     }
0052 
0053     Component {
0054         id: pluginItemComponent
0055 
0056         Kirigami.BasicListItem {
0057             id: pluginItem
0058 
0059             height: Math.max(implicitHeight, Kirigami.Units.iconSizes.medium)
0060 
0061             supportsMouseEvents: model.status == Kirogi.VehicleSupportPluginModel.PluginNotLoaded
0062 
0063             reserveSpaceForIcon: kirogi.currentPlugin
0064             icon: model.status == Kirogi.VehicleSupportPluginModel.PluginLoaded ? "emblem-default-symbolic" : ""
0065 
0066             label: model.display
0067 
0068             onClicked: {
0069                 pluginSheet.sheetOpen = false;
0070                 pluginModel.unloadAllPlugins();
0071                 pluginModel.loadPluginByIndex(index);
0072             }
0073         }
0074     }
0075 
0076     Kirigami.OverlaySheet {
0077         id: pluginSheet
0078 
0079         parent: kirogi
0080 
0081         topPadding: 0
0082         leftPadding: 0
0083         rightPadding: 0
0084         bottomPadding: 0
0085 
0086         header: Kirigami.Heading { text: i18nc("@title:window", "Select Model") }
0087 
0088         ListView {
0089             id: pluginList
0090 
0091             implicitWidth: 18 * Kirigami.Units.gridUnit
0092 
0093             model: pluginSheet.sheetOpen ? pluginModel : null
0094 
0095             delegate: Kirigami.DelegateRecycler {
0096                 width: parent.width
0097 
0098                 sourceComponent: pluginItemComponent
0099             }
0100         }
0101     }
0102 
0103     Kirigami.AbstractCard {
0104         id: flightChecklist
0105 
0106         width: (page.width / 3) + (Kirigami.Units.gridUnit * 2)
0107 
0108         implicitHeight: height // FIXME TODO Silence Kirigami warning.
0109 
0110         anchors.right: parent.right
0111         anchors.rightMargin: Kirigami.Units.gridUnit
0112         anchors.top: parent.top
0113         anchors.topMargin: Kirigami.Units.gridUnit
0114         anchors.bottom: parent.bottom
0115         anchors.bottomMargin: Kirigami.Units.gridUnit
0116 
0117         topPadding: Kirigami.Settings.isMobile ? header.height * 0.5 : header.height
0118 
0119         header: Kirigami.Heading {
0120             text:  i18n("Flight Checklist")
0121             level: 1
0122             horizontalAlignment: Text.AlignHCenter
0123             elide: Text.ElideRight
0124         }
0125 
0126         contentItem: QQC2.ScrollView {
0127             id: checksList
0128 
0129             clip: true
0130 
0131             property int scrollBarWidth: QQC2.ScrollBar.vertical && QQC2.ScrollBar.vertical.visible
0132                 ? QQC2.ScrollBar.vertical.width : 0
0133 
0134             Column {
0135                 id: col
0136 
0137                 width: checksList.width - checksList.scrollBarWidth
0138                 height: implicitHeight
0139 
0140                 Kirigami.BasicListItem {
0141                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0142 
0143                     supportsMouseEvents: false
0144                     separatorVisible: !Kirigami.Settings.isMobile
0145 
0146                     contentItem: RowLayout {
0147                         Kirigami.Icon {
0148                             Layout.alignment: Qt.AlignVCenter
0149 
0150                             width: Kirigami.Units.iconSizes.medium
0151                             height: width
0152 
0153                             source: kirogi.currentPlugin ? "emblem-default-symbolic" : "emblem-important-symbolic"
0154                             color: kirogi.currentPlugin ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.negativeTextColor
0155                         }
0156 
0157                         QQC2.Label {
0158                             Layout.fillWidth: true
0159 
0160                             Layout.alignment: Qt.AlignVCenter
0161 
0162                             text: i18n("<b>Model:</b> %1", kirogi.currentPlugin ? kirogi.currentPluginName : i18n("Select now"))
0163                             color: kirogi.currentPlugin ? Kirigami.Theme.textColor : Kirigami.Theme.negativeTextColor
0164 
0165                             elide: Text.ElideRight
0166                         }
0167 
0168                         QQC2.ToolButton {
0169                             Layout.alignment: Qt.AlignVCenter
0170 
0171                             implicitWidth: Kirigami.Units.iconSizes.medium
0172                             implicitHeight: implicitWidth
0173 
0174                             icon.name: "configure"
0175 
0176                             onClicked: pluginSheet.sheetOpen = !pluginSheet.sheetOpen
0177 
0178                             QQC2.ToolTip.visible: modelButtonHoverHandler.hovered
0179                             QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0180                             QQC2.ToolTip.text: i18n("Select Model")
0181 
0182                             HoverHandler {
0183                                 id: modelButtonHoverHandler
0184                             }
0185                         }
0186                     }
0187                 }
0188 
0189                 Kirigami.BasicListItem {
0190                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0191 
0192                     supportsMouseEvents: false
0193                     separatorVisible: !Kirigami.Settings.isMobile
0194 
0195                     contentItem: RowLayout {
0196                         Kirigami.Icon {
0197                             visible: !kirogi.currentPlugin || kirogi.currentPlugin && kirogi.currentVehicle
0198 
0199                             Layout.alignment: Qt.AlignVCenter
0200 
0201                             width: Kirigami.Units.iconSizes.medium
0202                             height: width
0203 
0204                             source: kirogi.currentVehicle ? "emblem-default-symbolic" : "question"
0205                             color: kirogi.currentVehicle ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.disabledTextColor
0206                         }
0207 
0208                         QQC2.BusyIndicator {
0209                             visible: kirogi.currentPlugin && !kirogi.currentVehicle
0210 
0211                             Layout.alignment: Qt.AlignVCenter
0212 
0213                             implicitWidth: Kirigami.Units.iconSizes.medium
0214                             implicitHeight: implicitWidth
0215 
0216                             topPadding: 0
0217                             bottomPadding: 0
0218                             leftPadding: 0
0219                             rightPadding: 0
0220 
0221                             running: visible
0222                         }
0223 
0224                         QQC2.Label {
0225                             Layout.fillWidth: true
0226 
0227                             Layout.alignment: Qt.AlignVCenter
0228 
0229                             text: {
0230                                 var state = i18n("N/A");
0231 
0232                                 if (kirogi.currentPlugin) {
0233                                     state = i18n("Searching ...");
0234                                 }
0235 
0236                                 return i18n("<b>Drone:</b> %1", kirogi.currentVehicle ? kirogi.currentVehicle.name : state);
0237                             }
0238 
0239                             color: kirogi.currentPlugin ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0240 
0241                             elide: Text.ElideRight
0242                         }
0243                     }
0244                 }
0245 
0246                 Kirigami.BasicListItem {
0247                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0248 
0249                     supportsMouseEvents: false
0250                     separatorVisible: !Kirigami.Settings.isMobile
0251 
0252                     contentItem: RowLayout {
0253                         Kirigami.Icon {
0254                             visible: !kirogi.currentVehicle || kirogi.ready
0255 
0256                             Layout.alignment: Qt.AlignVCenter
0257 
0258                             width: Kirigami.Units.iconSizes.medium
0259                             height: width
0260 
0261                             source: kirogi.currentVehicle ? "emblem-default-symbolic" : "question"
0262                             color: kirogi.currentVehicle ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.disabledTextColor
0263                         }
0264 
0265                         QQC2.BusyIndicator {
0266                             visible: kirogi.currentVehicle && !kirogi.ready
0267 
0268                             Layout.alignment: Qt.AlignVCenter
0269 
0270                             implicitWidth: Kirigami.Units.iconSizes.medium
0271                             implicitHeight: implicitWidth
0272 
0273                             topPadding: 0
0274                             bottomPadding: 0
0275                             leftPadding: 0
0276                             rightPadding: 0
0277 
0278                             running: visible
0279                         }
0280 
0281                         QQC2.Label {
0282                             Layout.fillWidth: true
0283 
0284                             Layout.alignment: Qt.AlignVCenter
0285 
0286                             text: {
0287                                 var state = "N/A";
0288 
0289                                 if (kirogi.flying) {
0290                                     state = i18n("Flying");
0291                                 } else if (kirogi.ready) {
0292                                     state = i18n("Ready");
0293                                 } else if (kirogi.connected) {
0294                                     state = i18n("Preparing ...");
0295                                 } else if (kirogi.currentVehicle && (kirogi.currentVehicle.connectionState == Kirogi.AbstractVehicle.Connecting
0296                                     || kirogi.currentVehicle.connectionState == Kirogi.AbstractVehicle.Disconnected)) {
0297                                     state = i18n("Connecting ...");
0298                                 }
0299 
0300                                 i18n("<b>Status:</b> %1", state);
0301                             }
0302 
0303                             color: kirogi.currentVehicle ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0304 
0305                             elide: Text.ElideRight
0306                         }
0307                     }
0308                 }
0309 
0310                 Kirigami.BasicListItem {
0311                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0312 
0313                     supportsMouseEvents: false
0314                     separatorVisible: !Kirigami.Settings.isMobile
0315 
0316                     contentItem: RowLayout {
0317                         Kirigami.Icon {
0318                             Layout.alignment: Qt.AlignVCenter
0319 
0320                             width: Kirigami.Units.iconSizes.medium
0321                             height: width
0322 
0323                             source: {
0324                                 if (kirogi.currentVehicle) {
0325                                     if (kirogi.currentVehicle.signalStrength === 0) {
0326                                         return "network-wireless-connected-00";
0327                                     } else if (kirogi.currentVehicle.signalStrength < 25) {
0328                                         return "network-wireless-connected-25";
0329                                     } else if (kirogi.currentVehicle.signalStrength < 50) {
0330                                         return "network-wireless-connected-50";
0331                                     } else if (kirogi.currentVehicle.signalStrength < 75) {
0332                                         return "network-wireless-connected-75";
0333                                     } else if (kirogi.currentVehicle.signalStrength <= 100) {
0334                                         return "network-wireless-connected-100";
0335                                     }
0336                                 }
0337 
0338                                 if (kirogi.connected) {
0339                                     return "network-wireless-acquiring";
0340                                 }
0341 
0342                                 return "network-wireless-disconnected";
0343                             }
0344 
0345                             color: kirogi.currentVehicle ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0346                         }
0347 
0348                         QQC2.Label {
0349                             Layout.fillWidth: true
0350 
0351                             Layout.alignment: Qt.AlignVCenter
0352 
0353                             text: {
0354                                 var state = kirogi.currentVehicle ? i18n("%1%", kirogi.currentVehicle.signalStrength) : i18n("N/A");
0355                                 return i18n("<b>Signal:</b> %1", state);
0356                             }
0357 
0358                             color: kirogi.connected ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0359 
0360                             elide: Text.ElideRight
0361                         }
0362                     }
0363                 }
0364 
0365                 Kirigami.BasicListItem {
0366                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0367 
0368                     supportsMouseEvents: false
0369                     separatorVisible: !Kirigami.Settings.isMobile
0370 
0371                     contentItem: RowLayout {
0372                         Kirigami.Icon {
0373                             Layout.alignment: Qt.AlignVCenter
0374 
0375                             width: Kirigami.Units.iconSizes.medium
0376                             height: width
0377 
0378                             source: {
0379                                 if (kirogi.currentVehicle) {
0380                                     var roundedBatteryLevel = Math.round(kirogi.currentVehicle.batteryLevel / 10);
0381                                     return "battery-" + roundedBatteryLevel.toString().padStart(2, "0") + "0";
0382                                 }
0383 
0384                                 return "battery-missing";
0385                             }
0386 
0387                             color: kirogi.currentVehicle ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0388                         }
0389 
0390                         QQC2.Label {
0391                             Layout.fillWidth: true
0392 
0393                             Layout.alignment: Qt.AlignVCenter
0394 
0395                             text: {
0396                                 var state = kirogi.currentVehicle ? i18n("%1%", kirogi.currentVehicle.batteryLevel) : i18n("N/A");
0397                                 return i18n("<b>Battery:</b> %1", state);
0398                             }
0399 
0400                             color: kirogi.connected ? Kirigami.Theme.textColor : Kirigami.Theme.disabledTextColor
0401 
0402                             elide: Text.ElideRight
0403                         }
0404                     }
0405                 }
0406 
0407                 Kirigami.BasicListItem {
0408                     implicitHeight: Kirigami.Units.iconSizes.medium + (Kirigami.Units.smallSpacing * 2)
0409 
0410                     supportsMouseEvents: false
0411                     separatorVisible: !Kirigami.Settings.isMobile
0412 
0413                     contentItem: RowLayout {
0414                         Kirigami.Icon {
0415                             Layout.alignment: Qt.AlignVCenter
0416 
0417                             width: Kirigami.Units.iconSizes.medium
0418                             height: width
0419 
0420                             source: "gps"
0421 
0422                             color: {
0423                                 if (kirogi.connected) {
0424                                     if (kirogi.currentVehicle.gpsFix) {
0425                                         return Kirigami.Theme.positiveTextColor;
0426                                     } else if (kirogi.currentVehicle.gpsSupported) {
0427                                         return Kirigami.Theme.negativeTextColor;
0428                                     }
0429                                 }
0430 
0431                                 return Kirigami.Theme.disabledTextColor;
0432                             }
0433                         }
0434 
0435                         QQC2.Label {
0436                             Layout.fillWidth: true
0437 
0438                             Layout.alignment: Qt.AlignVCenter
0439 
0440                             text: {
0441                                 var state = i18n("N/A");
0442 
0443                                 if (kirogi.currentVehicle) {
0444                                     if (kirogi.currentVehicle.gpsFix) {
0445                                         state = i18n("Got fix");
0446                                     } else if (kirogi.currentVehicle.gpsSupported) {
0447                                         state = i18n("No fix");
0448                                     } else {
0449                                         state = i18n("Not supported");
0450                                     }
0451                                 }
0452 
0453                                 return i18n("<b>GPS:</b> %1", state)
0454                             }
0455 
0456                             color: {
0457                                 if (kirogi.connected) {
0458                                     if (kirogi.currentVehicle.gpsFix) {
0459                                         return Kirigami.Theme.positiveTextColor;
0460                                     } else if (kirogi.currentVehicle.gpsSupported) {
0461                                         return Kirigami.Theme.textColor;
0462                                     }
0463                                 }
0464 
0465                                 return Kirigami.Theme.disabledTextColor;
0466                             }
0467 
0468                             elide: Text.ElideRight
0469                         }
0470                     }
0471                 }
0472             }
0473         }
0474 
0475         footer: QQC2.Button {
0476             text: {
0477                 if (!kirogi.currentPlugin) {
0478                     return i18n("Select Model");
0479                 } else if (kirogi.ready) {
0480                     return i18n("Go to Flight Controls");
0481                 }
0482 
0483                 return i18n("Try Flight Controls");
0484             }
0485 
0486             onClicked: {
0487                 if (!kirogi.currentPlugin) {
0488                     pluginSheet.sheetOpen = !pluginSheet.sheetOpen;
0489 
0490                     return;
0491                 }
0492 
0493                 switchApplicationPage(flightControlsPage);
0494             }
0495         }
0496     }
0497 }