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 }