2 * Copyright (C) 2016 The LibrePilot Project
3 * Contact: http://www.librepilot.org
5 * This file is part of LibrePilot GCS.
7 * LibrePilot GCS is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * LibrePilot GCS is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
22 import "../js/common.js" as Utils
23 import "../js/uav.js" as UAV
27 property variant sceneSize
33 property bool show_panels: false
34 property bool display_rc: false
35 property bool display_bat: false
36 property bool display_oplm: false
37 property bool display_sys: false
39 function close_panels(){
40 if (show_panels == true)
46 function hide_display_rcinput(){
56 function hide_display_battery(){
66 function hide_display_oplink(){
76 function hide_display_system(){
86 property real smeter_angle
88 // Needed to get correctly int8 value
89 property int oplm_rssi: telemetry_link ? UAV.oplmRSSI() : -127
91 property real telemetry_sum
92 property real telemetry_sum_old
93 property bool telemetry_link
95 // Hack : check if telemetry is active. Works with real link and log replay
97 function telemetry_check() {
98 telemetry_sum = opLinkStatus.rxRate + opLinkStatus.txRate
100 if (telemetry_sum != telemetry_sum_old || UAV.isOplmConnected()) {
105 telemetry_sum_old = telemetry_sum
109 id: telemetry_activity
110 interval: 1200; running: true; repeat: true
111 onTriggered: telemetry_check()
114 // Filtering for S-meter. Smeter range -127dB <--> -13dB = S9+60dB
118 interval: 100; running: true; repeat: true
119 onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm_rssi + 13))
127 // Animation properties
130 property double offset_value: close_bg.width * 0.85
132 property int anim_type: Easing.OutExpo
133 property int anim_duration: 1600
136 // Close - Open panel
141 elementName: "close-bg"
142 sceneSize: panels.sceneSize
143 y: Math.floor(scaledBounds.y * sceneItem.height)
148 when: show_panels == true
149 PropertyChanges { target: close_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
152 transitions: Transition {
153 SequentialAnimation {
155 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
162 elementName: "panel-open-icon"
163 sceneSize: panels.sceneSize
164 y: Math.floor(scaledBounds.y * sceneItem.height)
166 opacity: show_panels == true ? 0 : 1
170 when: show_panels == true
171 PropertyChanges { target: panel_open_icon; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
172 PropertyChanges { target: panel_open_icon; opacity: 0; }
175 transitions: Transition {
176 SequentialAnimation {
177 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
178 PropertyAnimation { property: "opacity"; duration: 500; }
185 elementName: "close-panel-mousearea"
186 sceneSize: panels.sceneSize
187 y: Math.floor(scaledBounds.y * sceneItem.height)
191 text: show_panels == true ? "Close panels" : "Open panels"
196 anchors.fill: parent;
197 cursorShape: Qt.PointingHandCursor
198 onClicked: close_panels()
203 when: show_panels == true
204 PropertyChanges { target: close_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
207 transitions: Transition {
208 SequentialAnimation {
209 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
220 elementName: "rc-input-bg"
221 sceneSize: panels.sceneSize
222 y: Math.floor(scaledBounds.y * sceneItem.height)
227 when: show_panels == true
228 PropertyChanges { target: rc_input_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
231 transitions: Transition {
232 SequentialAnimation {
233 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
240 elementName: "rc-input-labels"
241 sceneSize: panels.sceneSize
242 y: Math.floor(scaledBounds.y * sceneItem.height)
247 when: show_panels == true
248 PropertyChanges { target: rc_input_labels; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
251 transitions: Transition {
252 SequentialAnimation {
253 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
259 id: rc_input_mousearea
260 elementName: "rc-input-panel-mousearea"
261 sceneSize: panels.sceneSize
262 y: Math.floor(scaledBounds.y * sceneItem.height)
270 id: hidedisp_rcinput;
271 anchors.fill: parent;
272 cursorShape: Qt.PointingHandCursor
273 onClicked: hide_display_rcinput()
278 when: show_panels == true
279 PropertyChanges { target: rc_input_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
282 transitions: Transition {
283 SequentialAnimation {
284 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
291 elementName: "rc-throttle"
292 sceneSize: panels.sceneSize
295 width: scaledBounds.width * sceneItem.width
296 height: (scaledBounds.height * sceneItem.height) * (manualControlCommand.throttle)
298 x: scaledBounds.x * sceneItem.width
299 y: (scaledBounds.y * sceneItem.height) - rc_throttle.height + (scaledBounds.height * sceneItem.height)
305 when: show_panels == true
306 PropertyChanges { target: rc_throttle; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
309 transitions: Transition {
310 SequentialAnimation {
311 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
318 elementName: "rc-stick"
319 sceneSize: panels.sceneSize
322 width: scaledBounds.width * sceneItem.width
323 height: scaledBounds.height * sceneItem.height
325 y: (scaledBounds.y * sceneItem.height) + (manualControlCommand.pitch * rc_stick.width * 2.5)
329 //rotate it around his center
330 transform: Rotation {
331 angle: manualControlCommand.yaw * 90
332 origin.y : rc_stick.height / 2
333 origin.x : rc_stick.width / 2
338 when: show_panels == true
339 PropertyChanges { target: rc_stick; x: Math.floor(scaledBounds.x * sceneItem.width) + (manualControlCommand.roll * rc_stick.width * 2.5) + offset_value; }
342 transitions: Transition {
343 SequentialAnimation {
344 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
355 elementName: "battery-bg"
356 sceneSize: panels.sceneSize
357 y: Math.floor(scaledBounds.y * sceneItem.height)
362 when: show_panels == true
363 PropertyChanges { target: battery_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
366 transitions: Transition {
367 SequentialAnimation {
368 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
373 SvgElementPositionItem {
375 sceneSize: panels.sceneSize
376 elementName: "battery-volt-text"
379 width: scaledBounds.width * sceneItem.width
380 height: scaledBounds.height * sceneItem.height
381 y: scaledBounds.y * sceneItem.height
385 when: show_panels == true
386 PropertyChanges { target: battery_volt; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
389 transitions: Transition {
390 SequentialAnimation {
391 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
397 color: UAV.batteryAlarmColor()
398 border.color: "white"
399 border.width: battery_volt.width * 0.01
400 radius: border.width * 4
403 text: UAV.batteryVoltage()
404 anchors.centerIn: parent
408 pixelSize: Math.floor(parent.height * 0.6)
414 SvgElementPositionItem {
416 sceneSize: panels.sceneSize
417 elementName: "battery-amp-text"
420 width: scaledBounds.width * sceneItem.width
421 height: scaledBounds.height * sceneItem.height
422 y: scaledBounds.y * sceneItem.height
426 when: show_panels == true
427 PropertyChanges { target: battery_amp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
430 transitions: Transition {
431 SequentialAnimation {
432 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
438 color: UAV.batteryAlarmColor()
439 border.color: "white"
440 border.width: battery_volt.width * 0.01
441 radius: border.width * 4
444 text: UAV.batteryCurrent()
445 anchors.centerIn: parent
449 pixelSize: Math.floor(parent.height * 0.6)
455 SvgElementPositionItem {
457 sceneSize: panels.sceneSize
458 elementName: "battery-milliamp-text"
461 width: scaledBounds.width * sceneItem.width
462 height: scaledBounds.height * sceneItem.height
463 y: scaledBounds.y * sceneItem.height
467 when: show_panels == true
468 PropertyChanges { target: battery_milliamp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
471 transitions: Transition {
472 SequentialAnimation {
473 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
481 text: "Reset consumed energy"
482 visible: display_bat == true ? 1 : 0
486 id: reset_panel_consumed_energy_mouseArea;
487 anchors.fill: parent;
488 cursorShape: Qt.PointingHandCursor;
489 visible: display_bat == true ? 1 : 0
490 onClicked: pfdContext.resetConsumedEnergy();
493 // Alarm based on estimatedFlightTime < 120s orange, < 60s red
494 color: UAV.estimatedTimeAlarmColor()
496 border.color: "white"
497 border.width: battery_volt.width * 0.01
498 radius: border.width * 4
501 text: UAV.batteryConsumedEnergy()
502 anchors.centerIn: parent
506 pixelSize: Math.floor(parent.height * 0.6)
512 SvgElementPositionItem {
513 id: battery_estimated_flight_time
514 sceneSize: panels.sceneSize
515 elementName: "battery-estimated-flight-time"
518 width: scaledBounds.width * sceneItem.width
519 height: scaledBounds.height * sceneItem.height
520 y: scaledBounds.y * sceneItem.height
524 when: show_panels == true
525 PropertyChanges { target: battery_estimated_flight_time; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
528 transitions: Transition {
529 SequentialAnimation {
530 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
538 text: "Reset consumed energy"
539 visible: display_bat == true ? 1 : 0
543 id: reset_panel_consumed_energy_mouseArea2;
544 anchors.fill: parent;
545 cursorShape: Qt.PointingHandCursor;
546 visible: display_bat == true ? 1 : 0
547 onClicked: pfdContext.resetConsumedEnergy();
550 // Alarm based on estimatedFlightTime < 120s orange, < 60s red
551 color: UAV.estimatedTimeAlarmColor()
553 border.color: "white"
554 border.width: battery_volt.width * 0.01
555 radius: border.width * 4
558 text: Utils.formatFlightTime(UAV.estimatedFlightTimeValue())
559 anchors.centerIn: parent
563 pixelSize: Math.floor(parent.height * 0.6)
571 elementName: "battery-labels"
572 sceneSize: panels.sceneSize
573 y: Math.floor(scaledBounds.y * sceneItem.height)
578 when: show_panels == true
579 PropertyChanges { target: battery_labels; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
582 transitions: Transition {
583 SequentialAnimation {
584 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
590 id: battery_mousearea
591 elementName: "battery-panel-mousearea"
592 sceneSize: panels.sceneSize
593 y: Math.floor(scaledBounds.y * sceneItem.height)
597 text: "Battery panel"
601 id: hidedisp_battery;
602 anchors.fill: parent;
603 cursorShape: Qt.PointingHandCursor
604 onClicked: hide_display_battery()
609 when: show_panels == true
610 PropertyChanges { target: battery_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
613 transitions: Transition {
614 SequentialAnimation {
615 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
626 elementName: "oplm-bg"
627 sceneSize: panels.sceneSize
628 y: Math.floor(scaledBounds.y * sceneItem.height)
633 when: show_panels == true
634 PropertyChanges { target: oplm_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
637 transitions: Transition {
638 SequentialAnimation {
639 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
646 elementName: "smeter-bg"
647 sceneSize: panels.sceneSize
648 y: Math.floor(scaledBounds.y * sceneItem.height)
653 when: show_panels == true
654 PropertyChanges { target: smeter_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
657 transitions: Transition {
658 SequentialAnimation {
659 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
666 elementName: "smeter-scale"
667 sceneSize: panels.sceneSize
668 y: Math.floor(scaledBounds.y * sceneItem.height)
673 when: show_panels == true
674 PropertyChanges { target: smeter_scale; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
677 transitions: Transition {
678 SequentialAnimation {
679 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
686 elementName: "smeter-needle"
687 sceneSize: panels.sceneSize
688 y: Math.floor(scaledBounds.y * sceneItem.height)
693 when: show_panels == true
694 PropertyChanges { target: smeter_needle; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
697 transitions: Transition {
698 SequentialAnimation {
699 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
703 transform: Rotation {
704 angle: smeter_angle.toFixed(1)
705 origin.y : smeter_needle.height
711 elementName: "smeter-mask"
712 sceneSize: panels.sceneSize
713 //y: Math.floor(scaledBounds.y * sceneItem.height)
714 width: smeter_scale.width * 1.09
715 //anchors.horizontalCenter: smeter_scale
721 when: show_panels == true
722 PropertyChanges { target: smeter_mask; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
725 transitions: Transition {
726 SequentialAnimation {
727 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
734 elementName: "oplm-id-label"
735 sceneSize: panels.sceneSize
736 y: Math.floor(scaledBounds.y * sceneItem.height)
741 when: show_panels == true
742 PropertyChanges { target: oplm_id_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
745 transitions: Transition {
746 SequentialAnimation {
747 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
752 SvgElementPositionItem {
754 sceneSize: panels.sceneSize
755 elementName: "oplm-id-text"
758 width: scaledBounds.width * sceneItem.width
759 height: scaledBounds.height * sceneItem.height
760 y: scaledBounds.y * sceneItem.height
764 when: show_panels == true
765 PropertyChanges { target: oplm_id_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
768 transitions: Transition {
769 SequentialAnimation {
770 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
775 text: (UAV.oplmDeviceID() > 0) ? UAV.oplmDeviceID().toString(16) : "-- -- -- --"
776 anchors.centerIn: parent
780 pixelSize: Math.floor(parent.height * 1.4)
781 weight: Font.DemiBold
782 capitalization: Font.AllUppercase
789 elementName: "rx-quality-label"
790 sceneSize: panels.sceneSize
791 y: Math.floor(scaledBounds.y * sceneItem.height)
796 when: show_panels == true
797 PropertyChanges { target: rx_quality_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
800 transitions: Transition {
801 SequentialAnimation {
802 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
807 SvgElementPositionItem {
809 sceneSize: panels.sceneSize
810 elementName: "rx-quality-text"
813 width: scaledBounds.width * sceneItem.width
814 height: scaledBounds.height * sceneItem.height
815 y: scaledBounds.y * sceneItem.height
819 when: show_panels == true
820 PropertyChanges { target: rx_quality_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
823 transitions: Transition {
824 SequentialAnimation {
825 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
830 text: UAV.receiverQuality()
831 anchors.right: parent.right
835 pixelSize: Math.floor(parent.height * 1.4)
836 weight: Font.DemiBold
843 elementName: "cnx-state-label"
844 sceneSize: panels.sceneSize
845 y: Math.floor(scaledBounds.y * sceneItem.height)
850 when: show_panels == true
851 PropertyChanges { target: cnx_state_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
854 transitions: Transition {
855 SequentialAnimation {
856 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
861 SvgElementPositionItem {
863 sceneSize: panels.sceneSize
864 elementName: "cnx-state-text"
867 width: scaledBounds.width * sceneItem.width
868 height: scaledBounds.height * sceneItem.height
869 y: scaledBounds.y * sceneItem.height
873 when: show_panels == true
874 PropertyChanges { target: cnx_state_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
877 transitions: Transition {
878 SequentialAnimation {
879 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
884 text: UAV.oplmLinkState()
885 anchors.right: parent.right
889 pixelSize: Math.floor(parent.height * 1.4)
890 weight: Font.DemiBold
897 elementName: "oplm-panel-mousearea"
898 sceneSize: panels.sceneSize
899 y: Math.floor(scaledBounds.y * sceneItem.height)
908 anchors.fill: parent;
909 cursorShape: Qt.PointingHandCursor
910 onClicked: hide_display_oplink()
915 when: show_panels == true
916 PropertyChanges { target: oplm_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
919 transitions: Transition {
920 SequentialAnimation {
921 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
932 elementName: "system-bg"
933 sceneSize: panels.sceneSize
934 y: scaledBounds.y * sceneItem.height
939 when: show_panels == true
940 PropertyChanges { target: system_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
943 transitions: Transition {
944 SequentialAnimation {
945 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
950 SvgElementPositionItem {
952 elementName: "system-frame-type"
953 sceneSize: panels.sceneSize
954 y: scaledBounds.y * sceneItem.height
959 when: show_panels == true
960 PropertyChanges { target: system_frametype; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
963 transitions: Transition {
964 SequentialAnimation {
965 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
970 text: UAV.frameType()
971 anchors.right: parent.right
975 pixelSize: Math.floor(parent.height * 1.4)
976 weight: Font.DemiBold
981 SvgElementPositionItem {
982 id: system_cpuloadtemp
983 elementName: "system-cpu-load-temp"
984 sceneSize: panels.sceneSize
985 y: scaledBounds.y * sceneItem.height
990 when: show_panels == true
991 PropertyChanges { target: system_cpuloadtemp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
994 transitions: Transition {
995 SequentialAnimation {
996 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1001 // CC3D: Only display Cpu load, no temperature available.
1002 text: UAV.cpuLoad() + "%" + [UAV.isCC3D() ? "" : " | " + UAV.cpuTemp() + "°C"]
1003 anchors.right: parent.right
1006 family: pt_bold.name
1007 pixelSize: Math.floor(parent.height * 1.4)
1008 weight: Font.DemiBold
1013 SvgElementPositionItem {
1015 elementName: "system-mem-free"
1016 sceneSize: panels.sceneSize
1017 y: scaledBounds.y * sceneItem.height
1022 when: show_panels == true
1023 PropertyChanges { target: system_memfree; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1026 transitions: Transition {
1027 SequentialAnimation {
1028 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1033 text: UAV.freeMemory()
1034 anchors.right: parent.right
1037 family: pt_bold.name
1038 pixelSize: Math.floor(parent.height * 1.4)
1039 weight: Font.DemiBold
1044 SvgElementPositionItem {
1045 id: system_fusion_algo
1046 elementName: "system-attitude-estimation-algo"
1047 sceneSize: panels.sceneSize
1048 y: scaledBounds.y * sceneItem.height
1053 when: show_panels == true
1054 PropertyChanges { target: system_fusion_algo; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1057 transitions: Transition {
1058 SequentialAnimation {
1059 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1064 text: UAV.fusionAlgorithm()
1065 anchors.right: parent.right
1068 family: pt_bold.name
1069 pixelSize: Math.floor(parent.height * 1.35)
1070 weight: Font.DemiBold
1075 SvgElementPositionItem {
1077 elementName: "system-mag-used"
1078 sceneSize: panels.sceneSize
1079 y: scaledBounds.y * sceneItem.height
1084 when: show_panels == true
1085 PropertyChanges { target: system_mag_used; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1088 transitions: Transition {
1089 SequentialAnimation {
1090 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1095 text: UAV.magSourceName()
1096 anchors.right: parent.right
1099 family: pt_bold.name
1100 pixelSize: Math.floor(parent.height * 1.4)
1101 weight: Font.DemiBold
1106 SvgElementPositionItem {
1108 elementName: "system-gps-type"
1109 sceneSize: panels.sceneSize
1110 y: scaledBounds.y * sceneItem.height
1115 when: show_panels == true
1116 PropertyChanges { target: system_gpstype; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1119 transitions: Transition {
1120 SequentialAnimation {
1121 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1126 text: UAV.gpsSensorType()
1127 anchors.right: parent.right
1130 family: pt_bold.name
1131 pixelSize: Math.floor(parent.height * 1.4)
1132 weight: Font.DemiBold
1138 id: system_mousearea
1139 elementName: "system-panel-mousearea"
1140 sceneSize: panels.sceneSize
1141 y: Math.floor(scaledBounds.y * sceneItem.height)
1145 text: "System panel"
1149 id: hidedisp_system;
1150 anchors.fill: parent;
1151 cursorShape: Qt.PointingHandCursor
1152 onClicked: hide_display_system()
1157 when: show_panels == true
1158 PropertyChanges { target: system_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1161 transitions: Transition {
1162 SequentialAnimation {
1163 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }