Warning, /utilities/kirogi/src/ui/VehicleActionsDrawer.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 // FIXME TODO: For lack of time this is currently written in an unrolled/static style,
0030 // but the drawer contents should be generated procedurally later to be more extensible.
0031 
0032 Kirigami.OverlayDrawer {
0033     id: drawer
0034 
0035     readonly property var __categoryActions: [flipAction, geofenceAction, performanceAction]
0036 
0037     topPadding: 0
0038     bottomPadding: 0
0039     leftPadding: 0
0040     rightPadding: 0
0041 
0042     dragMargin: 0 // FIXME TODO: Interferes with shell buttons on Android in landscape orientation.
0043 
0044     onDrawerOpenChanged: {
0045         if (!drawerOpen) {
0046             toggleCategory();
0047         }
0048     }
0049 
0050     function toggleCategory(category) {
0051         if (category && !category.collapsed) {
0052             category.collapsed = true;
0053             scrollView.scrollToBottom();
0054         } else {
0055             for (var i = 0; i < __categoryActions.length; ++i) {
0056                 if (__categoryActions[i] != category) {
0057                     __categoryActions[i].collapsed = true;
0058                 }
0059             }
0060 
0061             if (category) {
0062                 category.collapsed = false;
0063             }
0064         }
0065     }
0066 
0067     Connections {
0068         target: kirogi
0069 
0070         onCurrentPageChanged: {
0071             if (kirogi.currentPage != flightControlsPage) {
0072                 drawer.drawerOpen = false;
0073             }
0074         }
0075     }
0076 
0077     QQC2.ScrollView {
0078         id: scrollView
0079 
0080         states: State {
0081             when: !Kirigami.Settings.isMobile
0082             
0083             AnchorChanges {
0084                 target: scrollView
0085                 anchors.top: parent.top
0086             }
0087         }
0088 
0089         width: parent.width
0090         height: parent.height
0091 
0092         contentHeight: actionsColumn.implicitHeight
0093         contentWidth: drawer.width - scrollBarWidth
0094 
0095         onContentHeightChanged: {
0096             if (contentHeight < parent.height) {
0097                 return;
0098             }
0099 
0100             for (var i = 0; i < __categoryActions.length; ++i) {
0101                 var category = __categoryActions[i];
0102 
0103                 if (!category.collapsed) {
0104                     Qt.callLater(scrollView.scrollTo, category);
0105                 }
0106             }
0107         }
0108 
0109         function scrollTo(item) {
0110             QQC2.ScrollBar.vertical.position = item.y / contentHeight;
0111         }
0112 
0113         function scrollToBottom() {
0114             QQC2.ScrollBar.vertical.position = 1.0;
0115         }
0116 
0117         property int scrollBarWidth: QQC2.ScrollBar.vertical && QQC2.ScrollBar.vertical.visible
0118             ? QQC2.ScrollBar.vertical.width : 0
0119 
0120         Column {
0121             id: actionsColumn
0122 
0123             width: drawer.width - scrollView.scrollBarWidth
0124             height: parent.height
0125 
0126             spacing: Kirigami.Units.smallSpacing
0127 
0128             Kirigami.BasicListItem {
0129                 id: flatTrimAction
0130 
0131                 enabled: (kirogi.currentVehicle
0132                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.FlatTrim))
0133 
0134                 property bool collapsed: true
0135 
0136                 separatorVisible: false
0137                 icon: "format-align-vertical-bottom"
0138                 label: i18n("Flat Trim")
0139 
0140                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.FlatTrim)
0141             }
0142 
0143             Kirigami.BasicListItem {
0144                 id: flipAction
0145 
0146                 property bool collapsed: true
0147 
0148                 separatorVisible: false
0149                 icon: "chronometer-reset"
0150                 label: i18n("Flip")
0151 
0152                 onClicked: toggleCategory(flipAction)
0153 
0154                 Kirigami.Icon {
0155                     Layout.alignment: Qt.AlignVCenter
0156                     Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium
0157                     Layout.preferredWidth: Layout.preferredHeight
0158 
0159                     source: flipAction.collapsed ? "go-down-symbolic" : "go-up-symbolic"
0160                     isMask: true
0161                 }
0162             }
0163 
0164             Kirigami.AbstractListItem {
0165                 id: flipForwardAction
0166 
0167                 visible: !flipAction.collapsed
0168 
0169                 enabled: (kirogi.currentVehicle && kirogi.currentVehicle.ready
0170                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.FlipForward))
0171 
0172                 implicitHeight: flipAction.height
0173 
0174                 leftPadding: Kirigami.Units.largeSpacing * 4
0175 
0176                 separatorVisible: false
0177 
0178                 contentItem: QQC2.Label { text: i18n("Flip Forward") }
0179 
0180                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.FlipForward)
0181             }
0182 
0183             Kirigami.AbstractListItem {
0184                 id: flipBackwardAction
0185 
0186                 visible: !flipAction.collapsed
0187 
0188                 enabled: (kirogi.currentVehicle && kirogi.currentVehicle.ready
0189                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.FlipBackward))
0190 
0191                 implicitHeight: flipAction.height
0192 
0193                 leftPadding: Kirigami.Units.largeSpacing * 4
0194 
0195                 separatorVisible: false
0196 
0197                 contentItem: QQC2.Label { text: i18n("Flip Backward") }
0198 
0199                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.FlipBackward)
0200             }
0201 
0202             Kirigami.AbstractListItem {
0203                 id: flipLeftAction
0204 
0205                 visible: !flipAction.collapsed
0206 
0207                 enabled: (kirogi.currentVehicle && kirogi.currentVehicle.ready
0208                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.FlipLeft))
0209 
0210                 implicitHeight: flipAction.height
0211 
0212                 leftPadding: Kirigami.Units.largeSpacing * 4
0213 
0214                 separatorVisible: false
0215 
0216                 contentItem: QQC2.Label { text: i18n("Flip Left") }
0217 
0218                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.FlipLeft)
0219             }
0220 
0221             Kirigami.AbstractListItem {
0222                 id: flipRightAction
0223 
0224                 visible: !flipAction.collapsed
0225 
0226                 enabled: (kirogi.currentVehicle && kirogi.currentVehicle.ready
0227                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.FlipRight))
0228 
0229                 implicitHeight: flipAction.height
0230 
0231                 leftPadding: Kirigami.Units.largeSpacing * 4
0232 
0233                 separatorVisible: false
0234 
0235                 contentItem: QQC2.Label { text: i18n("Flip Right") }
0236 
0237                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.FlipRight)
0238             }
0239 
0240             Kirigami.BasicListItem {
0241                 id: geofenceAction
0242 
0243                 property bool collapsed: true
0244 
0245                 separatorVisible: false
0246                 icon: "map-flat"
0247                 label: {
0248                     if (kirogi.currentVehicle && kirogi.currentVehicle.ready) {
0249                         var status;
0250 
0251                         if (kirogi.currentVehicle.geofence) {
0252                             status = i18n("Enabled");
0253                         } else {
0254                             status = i18n("Disabled");
0255                         }
0256 
0257                         return i18n("Geofence: %1", status);
0258                     }
0259 
0260                     return i18n("Geofence");
0261                 }
0262 
0263                 onClicked: toggleCategory(geofenceAction)
0264 
0265                 Kirigami.Icon {
0266                     Layout.alignment: Qt.AlignVCenter
0267                     Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium
0268                     Layout.preferredWidth: Layout.preferredHeight
0269 
0270                     source: geofenceAction.collapsed ? "go-down-symbolic" : "go-up-symbolic"
0271                     isMask: true
0272                 }
0273             }
0274 
0275             Kirigami.AbstractListItem {
0276                 visible: !geofenceAction.collapsed
0277 
0278                 enabled: (kirogi.currentVehicle
0279                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.ToggleGeofence))
0280 
0281                 implicitHeight: geofenceAction.height
0282 
0283                 leftPadding: Kirigami.Units.largeSpacing * 4
0284 
0285                 separatorVisible: false
0286 
0287                 contentItem: QQC2.Label {
0288                     verticalAlignment: Text.AlignVCenter
0289 
0290                     text: {
0291                         if (kirogi.currentVehicle && kirogi.currentVehicle.geofence) {
0292                             return i18n("Disable Geofence");
0293                         }
0294 
0295                         return i18n("Enable Geofence");
0296                     }
0297                 }
0298 
0299                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.ToggleGeofence)
0300             }
0301 
0302             Kirigami.AbstractListItem {
0303                 visible: !geofenceAction.collapsed
0304 
0305                 enabled: (kirogi.currentVehicle
0306                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxAltitude))
0307 
0308                 leftPadding: Kirigami.Units.largeSpacing * 4
0309 
0310                 separatorVisible: false
0311                 supportsMouseEvents: false
0312 
0313                 contentItem: GridLayout {
0314                     columns: 2
0315                     rowSpacing: Kirigami.Units.smallSpacing
0316                     columnSpacing: rowSpacing
0317 
0318                     QQC2.Label {
0319                         Layout.columnSpan: 2
0320 
0321                         text: i18n("Maximum altitude:")
0322                     }
0323 
0324                     QQC2.Label {
0325                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0326                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0327 
0328                         text: i18n("%1 m", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxAltitude : 0)
0329                     }
0330 
0331                     QQC2.Slider {
0332                         Layout.fillWidth: true
0333 
0334                         live: true
0335 
0336                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxAltitudeMin : 0
0337                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxAltitudeMax : 0
0338 
0339                         onPressedChanged: {
0340                             if (!pressed && value != kirogi.currentVehicle.maxAltitude) {
0341                                 kirogi.currentVehicle.requestMaxAltitude(Math.round(value));
0342                             }
0343                         }
0344 
0345                         Connections {
0346                             target: kirogi.currentVehicle
0347 
0348                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxAltitude
0349                         }
0350 
0351                         Rectangle {
0352                             visible: parent.pressed
0353 
0354                             z: -1
0355 
0356                             width: Kirigami.Units.devicePixelRatio
0357                             height: parent.height
0358 
0359                             color: Kirigami.Theme.disabledTextColor
0360 
0361                             onVisibleChanged: {
0362                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0363                             }
0364                         }
0365                     }
0366                 }
0367             }
0368 
0369             Kirigami.AbstractListItem {
0370                 visible: !geofenceAction.collapsed
0371 
0372                 enabled: (kirogi.currentVehicle
0373                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxDistance))
0374 
0375                 leftPadding: Kirigami.Units.largeSpacing * 4
0376 
0377                 separatorVisible: false
0378                 supportsMouseEvents: false
0379 
0380                 contentItem: GridLayout {
0381                     columns: 2
0382                     rowSpacing: Kirigami.Units.smallSpacing
0383                     columnSpacing: rowSpacing
0384 
0385                     QQC2.Label {
0386                         Layout.columnSpan: 2
0387 
0388                         text: i18n("Maximum distance:")
0389                     }
0390 
0391                     QQC2.Label {
0392                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0393                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0394 
0395                         text: i18n("%1 m", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxDistance : 0)
0396                     }
0397 
0398                     QQC2.Slider {
0399                         Layout.fillWidth: true
0400 
0401                         live: true
0402 
0403                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxDistanceMin : 0
0404                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxDistanceMax : 0
0405 
0406                         onPressedChanged: {
0407                             if (!pressed && value != kirogi.currentVehicle.maxDistance) {
0408                                 kirogi.currentVehicle.requestMaxDistance(Math.round(value));
0409                             }
0410                         }
0411 
0412                         Connections {
0413                             target: kirogi.currentVehicle
0414 
0415                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxDistance
0416                         }
0417 
0418                         Rectangle {
0419                             visible: parent.pressed
0420 
0421                             z: -1
0422 
0423                             width: Kirigami.Units.devicePixelRatio
0424                             height: parent.height
0425 
0426                             color: Kirigami.Theme.disabledTextColor
0427 
0428                             onVisibleChanged: {
0429                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0430                             }
0431                         }
0432                     }
0433                 }
0434             }
0435 
0436             Kirigami.BasicListItem {
0437                 id: performanceAction
0438 
0439                 property bool collapsed: true
0440 
0441                 separatorVisible: false
0442                 icon: "speedometer"
0443                 label: {
0444                     if (kirogi.currentVehicle && kirogi.currentVehicle.ready) {
0445                         var status;
0446 
0447                         if (kirogi.currentVehicle.performanceMode == Kirogi.AbstractVehicle.FilmPerformance) {
0448                             status = i18n("Film");
0449                         } else if (kirogi.currentVehicle.performanceMode == Kirogi.AbstractVehicle.SportPerformance) {
0450                             status = i18n("Sport");
0451                         } else {
0452                             status = i18n("Custom");
0453                         }
0454 
0455                         return i18n("Performance: %1", status);
0456                     }
0457 
0458                     return i18n("Performance");
0459                 }
0460 
0461                 onClicked: toggleCategory(performanceAction)
0462 
0463                 Kirigami.Icon {
0464                     Layout.alignment: Qt.AlignVCenter
0465                     Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium
0466                     Layout.preferredWidth: Layout.preferredHeight
0467 
0468                     source: performanceAction.collapsed ? "go-down-symbolic" : "go-up-symbolic" 
0469                     isMask: true
0470                 }
0471             }
0472 
0473             Kirigami.AbstractListItem {
0474                 visible: !performanceAction.collapsed
0475 
0476                 enabled: (kirogi.currentVehicle
0477                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxRollSpeed))
0478 
0479                 leftPadding: Kirigami.Units.largeSpacing * 4
0480 
0481                 separatorVisible: false
0482                 supportsMouseEvents: false
0483 
0484                 contentItem: GridLayout {
0485                     columns: 2
0486                     rowSpacing: Kirigami.Units.smallSpacing
0487                     columnSpacing: rowSpacing
0488 
0489                     QQC2.Label {
0490                         Layout.columnSpan: 2
0491 
0492                         text: i18n("Maximum roll speed:")
0493                     }
0494 
0495                     QQC2.Label {
0496                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0497                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0498 
0499                         text: i18n("%1 °/s", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxRollSpeed : 0)
0500                     }
0501 
0502                     QQC2.Slider {
0503                         Layout.fillWidth: true
0504 
0505                         live: true
0506 
0507                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxRollSpeedMin : 0
0508                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxRollSpeedMax : 0
0509 
0510                         onPressedChanged: {
0511                             if (!pressed && value != kirogi.currentVehicle.maxRollSpeed) {
0512                                 kirogi.currentVehicle.requestMaxRollSpeed(Math.round(value));
0513                             }
0514                         }
0515 
0516                         Connections {
0517                             target: kirogi.currentVehicle
0518 
0519                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxRollSpeed
0520                         }
0521 
0522                         Rectangle {
0523                             visible: parent.pressed
0524 
0525                             z: -1
0526 
0527                             width: Kirigami.Units.devicePixelRatio
0528                             height: parent.height
0529 
0530                             color: Kirigami.Theme.disabledTextColor
0531 
0532                             onVisibleChanged: {
0533                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0534                             }
0535                         }
0536                     }
0537                 }
0538             }
0539 
0540             Kirigami.AbstractListItem {
0541                 visible: !performanceAction.collapsed
0542 
0543                 enabled: (kirogi.currentVehicle
0544                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxPitchSpeed))
0545 
0546                 leftPadding: Kirigami.Units.largeSpacing * 4
0547 
0548                 separatorVisible: false
0549                 supportsMouseEvents: false
0550 
0551                 contentItem: GridLayout {
0552                     columns: 2
0553                     rowSpacing: Kirigami.Units.smallSpacing
0554                     columnSpacing: rowSpacing
0555 
0556                     QQC2.Label {
0557                         Layout.columnSpan: 2
0558 
0559                         text: i18n("Maximum pitch speed:")
0560                     }
0561 
0562                     QQC2.Label {
0563                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0564                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0565 
0566                         text: i18n("%1 °/s", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxPitchSpeed : 0)
0567                     }
0568 
0569                     QQC2.Slider {
0570                         Layout.fillWidth: true
0571 
0572                         live: true
0573 
0574                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxPitchSpeedMin : 0
0575                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxPitchSpeedMax : 0
0576 
0577                         onPressedChanged: {
0578                             if (!pressed && value != kirogi.currentVehicle.maxPitchSpeed) {
0579                                 kirogi.currentVehicle.requestMaxPitchSpeed(Math.round(value));
0580                             }
0581                         }
0582 
0583                         Connections {
0584                             target: kirogi.currentVehicle
0585 
0586                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxPitchSpeed
0587                         }
0588 
0589                         Rectangle {
0590                             visible: parent.pressed
0591 
0592                             z: -1
0593 
0594                             width: Kirigami.Units.devicePixelRatio
0595                             height: parent.height
0596 
0597                             color: Kirigami.Theme.disabledTextColor
0598 
0599                             onVisibleChanged: {
0600                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0601                             }
0602                         }
0603                     }
0604                 }
0605             }
0606 
0607             Kirigami.AbstractListItem {
0608                 visible: !performanceAction.collapsed
0609 
0610                 enabled: (kirogi.currentVehicle
0611                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxYawSpeed))
0612 
0613                 leftPadding: Kirigami.Units.largeSpacing * 4
0614 
0615                 separatorVisible: false
0616                 supportsMouseEvents: false
0617 
0618                 contentItem: GridLayout {
0619                     columns: 2
0620                     rowSpacing: Kirigami.Units.smallSpacing
0621                     columnSpacing: rowSpacing
0622 
0623                     QQC2.Label {
0624                         Layout.columnSpan: 2
0625 
0626                         text: i18n("Maximum yaw speed:")
0627                     }
0628 
0629                     QQC2.Label {
0630                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0631                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0632 
0633                         text: i18n("%1 °/s", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxYawSpeed : 0)
0634                     }
0635 
0636                     QQC2.Slider {
0637                         Layout.fillWidth: true
0638 
0639                         live: true
0640 
0641                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxYawSpeedMin : 0
0642                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxYawSpeedMax : 0
0643 
0644                         onPressedChanged: {
0645                             if (!pressed && value != kirogi.currentVehicle.maxYawSpeed) {
0646                                 kirogi.currentVehicle.requestMaxYawSpeed(Math.round(value));
0647                             }
0648                         }
0649 
0650                         Connections {
0651                             target: kirogi.currentVehicle
0652 
0653                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxYawSpeed
0654                         }
0655 
0656                         Rectangle {
0657                             visible: parent.pressed
0658 
0659                             z: -1
0660 
0661                             width: Kirigami.Units.devicePixelRatio
0662                             height: parent.height
0663 
0664                             color: Kirigami.Theme.disabledTextColor
0665 
0666                             onVisibleChanged: {
0667                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0668                             }
0669                         }
0670                     }
0671                 }
0672             }
0673 
0674             Kirigami.AbstractListItem {
0675                 visible: !performanceAction.collapsed
0676 
0677                 enabled: (kirogi.currentVehicle
0678                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxGazSpeed))
0679 
0680                 leftPadding: Kirigami.Units.largeSpacing * 4
0681 
0682                 separatorVisible: false
0683                 supportsMouseEvents: false
0684 
0685                 contentItem: GridLayout {
0686                     columns: 2
0687                     rowSpacing: Kirigami.Units.smallSpacing
0688                     columnSpacing: rowSpacing
0689 
0690                     QQC2.Label {
0691                         Layout.columnSpan: 2
0692 
0693                         text: i18n("Maximum vertical speed:")
0694                     }
0695 
0696                     QQC2.Label {
0697                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0698                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0699 
0700                         text: i18n("%1 m/s", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxGazSpeed : 0)
0701                     }
0702 
0703                     QQC2.Slider {
0704                         Layout.fillWidth: true
0705 
0706                         live: true
0707 
0708                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxGazSpeedMin : 0
0709                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxGazSpeedMax : 0
0710 
0711                         onPressedChanged: {
0712                             if (!pressed && value != kirogi.currentVehicle.maxGazSpeed) {
0713                                 kirogi.currentVehicle.requestMaxGazSpeed(Math.round(value));
0714                             }
0715                         }
0716 
0717                         Connections {
0718                             target: kirogi.currentVehicle
0719 
0720                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxGazSpeed
0721                         }
0722 
0723                         Rectangle {
0724                             visible: parent.pressed
0725 
0726                             z: -1
0727 
0728                             width: Kirigami.Units.devicePixelRatio
0729                             height: parent.height
0730 
0731                             color: Kirigami.Theme.disabledTextColor
0732 
0733                             onVisibleChanged: {
0734                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0735                             }
0736                         }
0737                     }
0738                 }
0739             }
0740 
0741             Kirigami.AbstractListItem {
0742                 visible: !performanceAction.collapsed
0743 
0744                 enabled: (kirogi.currentVehicle
0745                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.SetMaxTilt))
0746 
0747                 leftPadding: Kirigami.Units.largeSpacing * 4
0748 
0749                 separatorVisible: false
0750                 supportsMouseEvents: false
0751 
0752                 contentItem: GridLayout {
0753                     columns: 2
0754                     rowSpacing: Kirigami.Units.smallSpacing
0755                     columnSpacing: rowSpacing
0756 
0757                     QQC2.Label {
0758                         Layout.columnSpan: 2
0759 
0760                         text: i18n("Maximum tilt:")
0761                     }
0762 
0763                     QQC2.Label {
0764                         Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0765                         Layout.maximumWidth: Kirigami.Units.gridUnit * 3
0766 
0767                         text: i18n("%1°", (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxTilt : 0)
0768                     }
0769 
0770                     QQC2.Slider {
0771                         Layout.fillWidth: true
0772 
0773                         live: true
0774 
0775                         from: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxTiltMin : 0
0776                         to: (kirogi.currentVehicle && kirogi.currentVehicle.ready) ? kirogi.currentVehicle.maxTiltMax : 0
0777 
0778                         onPressedChanged: {
0779                             if (!pressed && value != kirogi.currentVehicle.maxTilt) {
0780                                 kirogi.currentVehicle.requestMaxTilt(Math.round(value));
0781                             }
0782                         }
0783 
0784                         Connections {
0785                             target: kirogi.currentVehicle
0786 
0787                             onMaxDistanceChanged: parent.value = kirogi.currentVehicle.maxTilt
0788                         }
0789 
0790                         Rectangle {
0791                             visible: parent.pressed
0792 
0793                             z: -1
0794 
0795                             width: Kirigami.Units.devicePixelRatio
0796                             height: parent.height
0797 
0798                             color: Kirigami.Theme.disabledTextColor
0799 
0800                             onVisibleChanged: {
0801                                 x = parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width));
0802                             }
0803                         }
0804                     }
0805                 }
0806             }
0807 
0808             Kirigami.AbstractListItem {
0809                 visible: !performanceAction.collapsed
0810 
0811                 enabled: (kirogi.currentVehicle
0812                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.ToggleBankedTurns))
0813 
0814                 implicitHeight: performanceAction.height
0815 
0816                 leftPadding: Kirigami.Units.largeSpacing * 4
0817 
0818                 separatorVisible: false
0819 
0820                 contentItem: QQC2.Label {
0821                     verticalAlignment: Text.AlignVCenter
0822 
0823                     text: {
0824                         if (enabled && kirogi.currentVehicle.bankedTurns) {
0825                             return i18n("Disable Banked Turns");
0826                         }
0827 
0828                         return i18n("Enable Banked Turns");
0829                     }
0830                 }
0831 
0832                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.ToggleBankedTurns)
0833             }
0834 
0835             Kirigami.AbstractListItem {
0836                 visible: !performanceAction.collapsed
0837 
0838                 enabled: (kirogi.currentVehicle
0839                     && kirogi.currentVehicle.isActionSupported(Kirogi.AbstractVehicle.ToggleVideoStabilization))
0840 
0841                 implicitHeight: performanceAction.height
0842 
0843                 leftPadding: Kirigami.Units.largeSpacing * 4
0844 
0845                 separatorVisible: false
0846 
0847                 contentItem: QQC2.Label {
0848                     verticalAlignment: Text.AlignVCenter
0849 
0850                     text: {
0851                         if (enabled && kirogi.currentVehicle.videoStabilization) {
0852                             return i18n("Disable Video Stabilization");
0853                         }
0854 
0855                         return i18n("Enable Video Stabilization");
0856                     }
0857                 }
0858 
0859                 onClicked: kirogi.currentVehicle.requestAction(Kirogi.AbstractVehicle.ToggleVideoStabilization)
0860             }
0861         }
0862     }
0863 }